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 的灵活性和可读性。