ansible循环
ansible循环
with_items:(迭代列表)最基础的列表遍历,支持简单列表或嵌套列表(会自动展开),通过item
访问元素
示例:
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: 1debug:msg: echo {{ item }}with_items:- 123- 234- 345
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => (item=123) => {"msg": "echo 123"
}
ok: [node1] => (item=234) => {"msg": "echo 234"
}
ok: [node1] => (item=345) => {"msg": "echo 345"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
with_dict:(迭代字典)遍历字典结构,用item.key
和item.value
分别访问键和值
示例:
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: debugdebug:msg: "{item.key }} & {{item.value}}"with_dict:address: 1network: 2gateway: 3
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => (item={'key': 'address', 'value': 1}) => {"msg": "{item.key }} & 1"
}
ok: [node1] => (item={'key': 'network', 'value': 2}) => {"msg": "{item.key }} & 2"
}
ok: [node1] => (item={'key': 'gateway', 'value': 3}) => {"msg": "{item.key }} & 3"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
with_fileglob:(迭代文件)匹配本地文件系统中的文件路径,用于批量处理文件
示例:
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: cp filecopy:src: "{{item}}"dest: /tmp/with_fileglob:- /tmp/*.sh- /tmp/*.py
~
[student@master ansible]$ cd /tmp/
[student@master tmp]$ sudo touch a.sh b.sh c.py d.py
[student@master tmp]$ cd -
/home/student/ansible
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [cp file] *****************************************************************
changed: [node1] => (item=/tmp/a.sh)
changed: [node1] => (item=/tmp/b.sh)
changed: [node1] => (item=/tmp/c.py)
changed: [node1] => (item=/tmp/d.py)PLAY RECAP *********************************************************************
node1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
with_lines:(迭代行)可以将命令行的输出结果按行迭代
示例:
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: cp filecopy:src: "{{item}}"dest: /tmp/with_lines:- find /home/student/ansible -name "*.yml"
~
with_nested:实现嵌套循环,组合多个列表的元素
示例:
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: debugdebug:msg: "{{item[0]}} & {{item[1]}}"with_nested:- [a,b]- [1,2,3]
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => (item=['a', 1]) => {"msg": "a & 1"
}
ok: [node1] => (item=['a', 2]) => {"msg": "a & 2"
}
ok: [node1] => (item=['a', 3]) => {"msg": "a & 3"
}
ok: [node1] => (item=['b', 1]) => {"msg": "b & 1"
}
ok: [node1] => (item=['b', 2]) => {"msg": "b & 2"
}
ok: [node1] => (item=['b', 3]) => {"msg": "b & 3"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
with_sequence 排序列(start是从什么开始,end结束 stride每隔多少**)**
示例:
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: debugdebug:msg: "{{item}}"with_sequence:start=1end=5stride=1
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => (item=1) => {"msg": "1"
}
ok: [node1] => (item=2) => {"msg": "2"
}
ok: [node1] => (item=3) => {"msg": "3"
}
ok: [node1] => (item=4) => {"msg": "4"
}
ok: [node1] => (item=5) => {"msg": "5"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: debugdebug:msg: "{{item}}"with_sequence:start=10end=5stride=-1
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => (item=10) => {"msg": "10"
}
ok: [node1] => (item=9) => {"msg": "9"
}
ok: [node1] => (item=8) => {"msg": "8"
}
ok: [node1] => (item=7) => {"msg": "7"
}
ok: [node1] => (item=6) => {"msg": "6"
}
ok: [node1] => (item=5) => {"msg": "5"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
with_random_choice 随机获得列表中的一个值
示例:
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: debugdebug:msg: "{{item}}"with_random_choice:- 1- 2- 3- 4- 5
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => (item=1) => {"msg": 1
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: debugdebug:msg: echo {{ item }}with_items:- a- b- c- e- f
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => (item=a) => {"msg": "echo a"
}
ok: [node1] => (item=b) => {"msg": "echo b"
}
ok: [node1] => (item=c) => {"msg": "echo c"
}
ok: [node1] => (item=e) => {"msg": "echo e"
}
ok: [node1] => (item=f) => {"msg": "echo f"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: debugdebug:msg: echo {{ item }}loop:- a- b- c- e- f
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => (item=a) => {"msg": "echo a"
}
ok: [node1] => (item=b) => {"msg": "echo b"
}
ok: [node1] => (item=c) => {"msg": "echo c"
}
ok: [node1] => (item=e) => {"msg": "echo e"
}
ok: [node1] => (item=f) => {"msg": "echo f"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Loop:
现在loop已经替代了with,更多的是loop配合过滤器进行使用
过滤器:
常用字符串有关的过滤器
示例:(upper将字符串转换成纯大写)
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1vars:testvar: "abc123ABC 666"testvar1: " abc "tasks: - name: debug1debug:msg: "{{ testvar |upper}}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug1] ******************************************************************
ok: [node1] => {"msg": "ABC123ABC 666"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
示例:(lower将字符串转换成纯小写)
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1vars:testvar: "abc123ABC 666"testvar1: " abc "tasks:- name: debug1debug:msg: "{{ testvar |lower}}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug1] ******************************************************************
ok: [node1] => {"msg": "abc123abc 666"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
示例:(将字符串首字母大写,之后的所有字母纯小写)
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1vars:testvar: "abc123ABC 666"testvar1: " abc "tasks:- name: debug1debug:msg: "{{ testvar |capitalize}}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug1] ******************************************************************
ok: [node1] => {"msg": "Abc123abc 666"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
示例:(trim 将字符串的首尾空格去掉)
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1vars:testvar: "abc123ABC 666"testvar1: " abc "tasks:- name: debug1debug:msg: "{{ testvar1 |trim}}"
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug1] ******************************************************************
ok: [node1] => {"msg": "abc"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
使用加密算法对字符串进行hash加密
创建一个用户shenyifeng,并且设置密码为redhat,密码采用SHA512哈希格式
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1tasks:- name: create useruser:name: testuer1password: "{{ 'redhat' | password_hash('sha512') }}"state: present
~
[student@master ansible]$ vim pass
pw: redhat
~
[student@master ansible]$ chmod 600 pass
[student@master ansible]$ vim a.yml
---
- name: testhosts: node1vars_files:- /home/student/ansible/passtasks:- name: create useruser:name: testuer1password: "{{ pw | password_hash('sha512') }}"state: present
~
[student@master ansible]$ ansible-playbook a.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [create user] *************************************************************
changed: [node1]PLAY RECAP *********************************************************************
node1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
和数字操作有关的过滤器:
[student@master ansible]$ vim s.yml
---
- name: testhosts: node1tasks:- name: 1debug:msg: "{{ 8+8 }}"
~
[student@master ansible]$ ansible-playbook s.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => {"msg": "16"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
debug:
#将对应的值转换成int类型
#ansible中,字符串和整形不能直接计算,比如{{ 8+‘8’ }}会报错
#所以,我们可以把一个值为数字的字符串转换成整形后再做计算
msg: “{{ 8+(‘8’ | int) }}”
示例:
[student@master ansible]$ vim s.yml
---
- name: testhosts: node1tasks:- name: 1debug:msg: "{{ 8+('8'|int) }}"
~
[student@master ansible]$ ansible-playbook s.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => {"msg": "16"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
debug:
#将对应的值转换成int类型,如果无法转换,默认返回0
#使用int(default=6)或者int(6)时,如果无法转换则返回指定值6
msg: “{{ ‘a’ | int(default=6) }}”
示例:
[student@master ansible]$ vim s.yml
---
- name: testhosts: node1tasks:- name: 1debug:msg: "{{ 8+('a'|int(default=3)) }}"
~
[student@master ansible]$ ansible-playbook s.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => {"msg": "11"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
debug:
#将对应的值转换成浮点型,如果无法转换,默认返回’0.0’
示例:
[student@master ansible]$ vim s.yml
---
- name: testhosts: node1tasks:- name: 1debug:msg: "{{ 8 | float }}"
~
[student@master ansible]$ ansible-playbook s.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => {"msg": "8.0"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@master ansible]$ vim s.yml
---
- name: testhosts: node1tasks:- name: 1debug:msg: "{{ 'fds' | float }}"
~
[student@master ansible]$ ansible-playbook s.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => {"msg": "0.0"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@master ansible]$ vim s.yml
---
- name: testhosts: node1tasks:- name: 1debug:msg: "{{ 'fds' | float(1.23) }}"
~
[student@master ansible]$ ansible-playbook s.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => {"msg": "1.23"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
debug:
#从0到100中随机返回一个随机数
示例:
[student@master ansible]$ vim s.yml
---
- name: testhosts: node1tasks:- name: 1debug:msg: "{{ 100 | random }}"
~
[student@master ansible]$ ansible-playbook s.yml PLAY [test] ********************************************************************TASK [Gathering Facts] *********************************************************
ok: [node1]TASK [debug] *******************************************************************
ok: [node1] => {"msg": "92"
}PLAY RECAP *********************************************************************
node1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0