如何使用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

总结

我总结了使用列表变量进行循环处理的三种方法。希望能选择一种易于编写并能实施的方法。

广告
将在 10 秒后关闭
bannerAds