loop、when
loop循环
简单循环
在task下定义一个loop,通过item变量取出loop的值
tasks:
- name: 1)
debug:
msg: "this vaule is {{ item }}"
loop:
- aaa
- bbb
- ccc
运行结果
TASK [1)] ****************************************************************************************************************************
ok: [servera] => (item=aaa) => {
"msg": "this vaule is aaa"
}
ok: [servera] => (item=bbb) => {
"msg": "this vaule is bbb"
}
ok: [servera] => (item=ccc) => {
"msg": "this vaule is ccc"
}
通过变量定义循环
定义一个变量列表,可以通过引用变量,取到item的值
vars:
name:
- aaa
- bbb
tasks:
- name: 1)
debug:
msg: "this vaule is {{ item }}"
loop:
"{{ name }}"
结果:
TASK [1)] ****************************************************************************************************************************
ok: [servera] => (item=aaa) => {
"msg": "this vaule is aaa"
}
ok: [servera] => (item=bbb) => {
"msg": "this vaule is bbb"
}
循环字典列表
通过定义一个字典列表,可分别针对每个item增加属性
tasks:
- name: 1) check service status
debug:
msg: "this is the {{ item.key }} vars {{ item.value }}"
loop:
- key: 1
value: aaa
- key: 2
value: bbb
运行结果:
TASK [1) check service status] *******************************************************************************************************
ok: [servera] => (item={'key': 1, 'value': 'aaa'}) => {
"msg": "this is the 1 vars aaa"
}
ok: [servera] => (item={'key': 2, 'value': 'bbb'}) => {
"msg": "this is the 2 vars bbb"
}
通过循环读取register变量
获取循环的register
vars:
value_name:
- aaa
- bbb
tasks:
- name: 1) register loop
debug:
msg: "echo this vaule is {{ item }}"
loop:
"{{ value_name }}"
register: loop_reg
- name: 2) debug register loop
debug:
var: " {{ loop_reg }}"
输出查看:
ok: [servera] => {
" {'results': [{'msg': 'echo this vaule is aaa', 'failed': False, 'changed': False, 'item': 'aaa', 'ansible_loop_var': 'item'}, {'msg': 'echo this vaule is bbb', 'failed': False, 'changed': False, 'item': 'bbb', 'ansible_loop_var': 'item'}], 'msg': 'All items completed', 'changed': False}": {
"changed": false,
"msg": "All items completed",
"results": [
{
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"item": "aaa",
"msg": "echo this vaule is aaa"
},
{
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"item": "bbb",
"msg": "echo this vaule is bbb"
}
]
}
}
当前一个task为循环时,可以通过循环读取register变量中的结果,返回每一个item对应的register结果
vars:
value_name:
- aaa
- bbb
tasks:
- name: 1) register loop
shell: "echo this vaule is {{ item }}"
loop:
"{{ value_name }}"
register: loop_reg
- name: 2) debug register loop
debug:
msg: " this is {{ item.stdout }}"
loop:
"{{ loop_reg['results'] }}"
运行结果:
TASK [1) register loop] **************************************************************************************************************
changed: [servera] => (item=aaa)
changed: [servera] => (item=bbb)
TASK [2) debug register loop] ********************************************************************************************************
ok: [servera] => (item={'cmd': 'echo this vaule is aaa', 'stdout': 'this vaule is aaa', 'stderr': '', 'rc': 0, 'start': '2021-03-22 13:54:21.761807', 'end': '2021-03-22 13:54:21.764719', 'delta': '0:00:00.002912', 'changed': True, 'invocation': {'module_args': {'_raw_params': 'echo this vaule is aaa', '_uses_shell': True, 'warn': True, 'stdin_add_newline': True, 'strip_empty_ends': True, 'argv': None, 'chdir': None, 'executable': None, 'creates': None, 'removes': None, 'stdin': None}}, 'stdout_lines': ['this vaule is aaa'], 'stderr_lines': [], 'failed': False, 'item': 'aaa', 'ansible_loop_var': 'item'}) => {
"msg": " this is this vaule is aaa"
}
ok: [servera] => (item={'cmd': 'echo this vaule is bbb', 'stdout': 'this vaule is bbb', 'stderr': '', 'rc': 0, 'start': '2021-03-22 13:54:22.101426', 'end': '2021-03-22 13:54:22.104848', 'delta': '0:00:00.003422', 'changed': True, 'invocation': {'module_args': {'_raw_params': 'echo this vaule is bbb', '_uses_shell': True, 'warn': True, 'stdin_add_newline': True, 'strip_empty_ends': True, 'argv': None, 'chdir': None, 'executable': None, 'creates': None, 'removes': None, 'stdin': None}}, 'stdout_lines': ['this vaule is bbb'], 'stderr_lines': [], 'failed': False, 'item': 'bbb', 'ansible_loop_var': 'item'}) => {
"msg": " this is this vaule is bbb"
}
when条件控制
使用介绍
when用到tasks中,当when后面的条件为真时,执行这个task;为假时,则跳过
简单测试
---
- name:
hosts: servera
vars:
my_service: httpd
tasks:
- name: "{{ my_service }} pkg is installd"
debug:
msg: "this is debug {{ my_service }}"
when: my_service is defined
运行结果:
ok: [servera] => {
"msg": "this is debug httpd"
}
循环、条件控制综合练习
1:安装软件并运行
编写playbook,在目标主机安装mariadb和python,并运行
---
- name: check mariadb server is running
hosts: database_dev
vars:
mariadb_packages:
- mariadb-server
- python3-PyMySQL
tasks:
- name: installed
yum:
name: "{{ item }}"
state: present
loop: "{{ mariadb_packages }}"
- name: start mariadb service
service:
name: mariadb
state: started
enabled: true
运行结果:
TASK [installed] *********************************************************************************************************************
changed: [servera.lab.example.com] => (item=mariadb-server)
changed: [servera.lab.example.com] => (item=python3-PyMySQL)
TASK [start mariadb service] *********************************************************************************************************
changed: [servera.lab.example.com]
2:使用when判断
当目标主机位redhat系统时,才安装
修改主机组为prod,首先使用adhoc查看目标主机的操作系统
[student@workstation control-flow]$ ansible database_prod -a 'cat /etc/redhat-release' -u devops --become
serverb.lab.example.com | CHANGED | rc=0 >>
Red Hat Enterprise Linux release 8.0 (Ootpa)
修改playbook,在loop后加when条件判断
loop: "{{ mariadb_packages }}"
when: ansible_distribution == "RedHat"
执行playbook,查看执行结果
TASK [installed] *********************************************************************************************************************
changed: [serverb.lab.example.com] => (item=mariadb-server)
changed: [serverb.lab.example.com] => (item=python3-PyMySQL)
TASK [start mariadb service] *********************************************************************************************************
changed: [serverb.lab.example.com]
扩展练习
随意修改when的条件,不满足时会提示skipping
TASK [installed] *********************************************************************************************************************
skipping: [serverb.lab.example.com] => (item=mariadb-server)
skipping: [serverb.lab.example.com] => (item=python3-PyMySQL)