ansible循环
with_items:(迭代列表)最基础的列表遍历,支持简单列表或嵌套列表(会自动展开),通过item
访问元素
示例:
[student@master ansible]$ vim a.yml
---
- name: test
hosts: node1
tasks:
- name: 1
debug:
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: test
hosts: node1
tasks:
- name: debug
debug:
msg: "{item.key }} & {{item.value}}"
with_dict:
address: 1
network: 2
gateway: 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: test
hosts: node1
tasks:
- name: cp file
copy:
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: test
hosts: node1
tasks:
- name: cp file
copy:
src: "{{item}}"
dest: /tmp/
with_lines:
- find /home/student/ansible -name "*.yml"
~
with_nested:实现嵌套循环,组合多个列表的元素
示例:
[student@master ansible]$ vim a.yml
---
- name: test
hosts: node1
tasks:
- name: debug
debug:
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: test
hosts: node1
tasks:
- name: debug
debug:
msg: "{{item}}"
with_sequence:
start=1
end=5
stride=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: test
hosts: node1
tasks:
- name: debug
debug:
msg: "{{item}}"
with_sequence:
start=10
end=5
stride=-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: test
hosts: node1
tasks:
- name: debug
debug:
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: test
hosts: node1
tasks:
- name: debug
debug:
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: test
hosts: node1
tasks:
- name: debug
debug:
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: test
hosts: node1
vars:
testvar: "abc123ABC 666"
testvar1: " abc "
tasks:
- name: debug1
debug:
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: test
hosts: node1
vars:
testvar: "abc123ABC 666"
testvar1: " abc "
tasks:
- name: debug1
debug:
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: test
hosts: node1
vars:
testvar: "abc123ABC 666"
testvar1: " abc "
tasks:
- name: debug1
debug:
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: test
hosts: node1
vars:
testvar: "abc123ABC 666"
testvar1: " abc "
tasks:
- name: debug1
debug:
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: test
hosts: node1
tasks:
- name: create user
user:
name: testuer1
password: "{{ '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: test
hosts: node1
vars_files:
- /home/student/ansible/pass
tasks:
- name: create user
user:
name: testuer1
password: "{{ 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: test
hosts: node1
tasks:
- name: 1
debug:
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: test
hosts: node1
tasks:
- name: 1
debug:
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: test
hosts: node1
tasks:
- name: 1
debug:
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: test
hosts: node1
tasks:
- name: 1
debug:
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: test
hosts: node1
tasks:
- name: 1
debug:
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: test
hosts: node1
tasks:
- name: 1
debug:
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: test
hosts: node1
tasks:
- name: 1
debug:
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