如何使用Ansible循环处理列表变量
我想做的事情
我想使用Ansible来对通过定义的列表变量(数组变量)进行循环处理,以实现在Playbook执行时对列表变量中的每个值进行处理。以下是以创建多个目录为例的处理方式。
实现的方法
在调查和尝试后,有以下三种方法,并对每种方法进行描述:
1. 直接在Playbook文件中编写(yaml格式)
2. 在inventory文件中编写(yaml格式)
3. 在inventory文件中编写(ini格式?)
每种实现方法都是通过以下方式执行。
# ansible-playbook -i <inventoryファイル> <Playbookファイル>
直接在Playbook文件中编写的方法(yaml格式)。
在Playbook文件中,如果要声明变量,需要在vars部分定义一个列表变量。要创建多个目录的Playbook文件应按以下方式编写。
---
- hosts: servers
become: yes
gather_facts: false
vars:
directories:
- test1
- test2
tasks:
- name: Create test directory
file:
path: '/tmp/{{ item }}'
owner: 'root'
group: 'root'
mode: '0644'
state: directory
with_items: '{{ directories }}'
在Playbook上循环处理列表变量时,不需要将其编写在with_items模块下,而是像上面那样编写with_items: ‘{{列表变量}}’,这样可以展开变量。关于inventory文件,编写如下。
[servers]
10.0.0.11
10.0.0.12
[servers:vars]
ansible_user=user
ansible_become_user: root
ansible_become_pass: ****
ansible_ssh_private_key_file: ~/.ssh/id_rsa
写入 inventory 文件的方法(以 yaml 格式)
如果在inventory文件中声明变量而不是在Playbook文件中,那么可以使用与Playbook相同的方法来以yaml格式编写inventory文件。在Playbook文件中,删除vars部分并进行以下修改。
---
- hosts: servers
become: yes
gather_facts: false
tasks:
- name: Create test directory
file:
path: '/tmp/{{ item }}'
owner: 'root'
group: 'root'
mode: '0644'
state: directory
with_items: '{{ directories }}'
如果将 inventory 文件以 yaml 格式书写,内容如下。
servers:
hosts:
10.0.0.11
directories:
- test1
- test2
10.0.0.12
directories:
- test3
- test4
vars:
ansible_user: user
ansible_become_user: root
ansible_become_pass: ****
ansible_ssh_private_key_file: ~/.ssh/id_rsa
在inventory文件中写入的方法(ini格式?)
在传统的inventory文件书写方式中,您可以通过以下方式使用方括号来定义列表变量来实现(尽管我很想使用这种方法,但是没有找到相关信息)。由于Playbook文件的格式与yaml相同,所以在此省略Playbook文件,仅写下inventory文件。
[servers]
10.0.0.11 directories='["test1", "test2"]'
10.0.0.12 directories='["test3", "test4"]'
[servers:vars]
ansible_user=user
ansible_become_user=root
ansible_become_pass=****
ansible_ssh_private_key_file=~/.ssh/id_rsa
总结
我总结了使用列表变量进行循环处理的三种方法。希望能选择一种易于编写并能实施的方法。