Ansible 循环
一、使用 loop 和 with_items 进行循环
1.1 使用 loop
- 功能:
loop关键字用于在 Ansible 任务中执行重复的操作。它可以遍历一个列表或字典,并对每个元素执行相同的任务。 - 用法:在任务中定义一个
loop语句,后面跟一个列表或字典,任务会对列表中的每个元素依次执行。
示例:
tasks:
- name: Install multiple packages
yum:
name: "{{ item }}"
state: present
loop:
- git
- curl
- vim
- 解释:该任务使用
loop遍历一个软件包列表,依次安装git、curl和vim。
1.2 使用 with_items
- 功能:
with_items是另一种用于在 Ansible 任务中执行循环的语法,它的作用类似于loop,遍历一个列表并对每个元素执行任务。 - 用法:在任务中定义一个
with_items语句,后面跟一个列表。
示例:
tasks:
- name: Add multiple users
user:
name: "{{ item }}"
state: present
with_items:
- alice
- bob
- charlie
- 解释:该任务使用
with_items遍历一个用户名列表,依次创建alice、bob和charlie用户。
二、嵌套循环
- 功能:嵌套循环用于在任务中进行多层次的循环操作,例如需要组合多个列表的所有可能情况,或者在一个列表的基础上进一步操作另一个列表。
- 用法:使用
loop或with_items结合subelements,实现嵌套循环。
示例:
tasks:
- name: Install software packages for each user
apt:
name: "{{ item.1 }}"
state: present
loop: "{{ users | subelements('packages') }}"
vars:
users:
- name: alice
packages:
- git
- curl
- name: bob
packages:
- vim
- htop
- 解释:该任务使用嵌套循环为每个用户安装指定的软件包。通过
subelements,loop遍历每个用户及其关联的软件包列表,逐一安装。
三、循环控制(loop_control)
- 功能:
loop_control用于细化控制loop或with_items中的循环行为,包括控制变量名、限制输出、修改每次循环的显示等。 - 用法:在任务中添加
loop_control,可以设置多个控制选项,如loop_var、index_var、label等。
3.1 控制选项
loop_var:设置自定义的循环变量名,避免使用默认的item。index_var:在循环中使用一个变量保存当前索引值。label:自定义循环的输出标签,便于识别和调试。
示例:
tasks:
- name: Create multiple directories
file:
path: "/home/{{ user }}/{{ dir }}"
state: directory
loop:
- { user: "alice", dir: "projects" }
- { user: "bob", dir: "reports" }
loop_control:
loop_var: item
index_var: index
label: "{{ item.user }}/{{ item.dir }}"
- 解释:
- 使用
loop_control的loop_var设置了自定义的循环变量名item。 - 使用
index_var保存了当前循环的索引到变量index中。 - 使用
label自定义了循环的输出标签为用户和目录的组合{{ item.user }}/{{ item.dir }},便于输出时查看。
- 使用
3.2 限制输出
- 功能:通过
loop_control中的label,可以自定义每次循环的输出,减少不必要的详细输出信息,便于阅读和调试。
示例:
tasks:
- name: Deploy web applications
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
loop:
- { src: "app1.war", dest: "/var/www/app1.war" }
- { src: "app2.war", dest: "/var/www/app2.war" }
loop_control:
label: "{{ item.src }} to {{ item.dest }}"
- 解释:该任务通过
loop_control中的label设置自定义输出格式,使每次循环的输出信息更直观,便于调试和阅读。
通过使用 loop、with_items、嵌套循环以及 loop_control,Ansible 可以高效处理复杂的重复性任务,提高 Playbook 的灵活性和可读性。
1797

被折叠的 条评论
为什么被折叠?



