Ansible - 多重角色

Ansible - multiple roles

我正在尝试使用 with_items 命令 运行 多个角色,但出现错误:

"ERROR! 'item' is undefined"

role.yml:

---
- hosts: '{{ host }}'
  become: yes

  roles:
    - role: "{{item}}"
      with_items: "{{ roles }}"

这是我的命令:

ansible-playbook -i ./inventory/Dev ./playbooks/role.yml --extra-vars='{"host": "db", "roles": ["mysql", "apache"]}'

你不能这样做。 with_ 循环对角色无效。

如果有的话,您需要向 roles: 指令提供角色列表,因此语法就像主机组列表 hosts: '{{ host }}' 一样。问题是:Ansible 不解析角色的变量,所以 roles: '{{ roles }}' 不起作用。


但是,您可以使用 include_role module,您可以在其中访问变量。

不,include_role 模块也不从 with_items 中获取 {{ item }} 作为 name 的值。

所以我能想到的唯一解决方法(假设您不想事先处理 JSON)是静态包含角色:

tasks:
  - include_role:
      name: "mysql"
    when: "'mysql' in roles"
  - include_role:
      name: "apache"
    when: "'apache' in roles"

角色无论如何都需要存在于控制机器上,所以他们的名字都是预定义的。

不能将 with_ 循环与 roles 指令一起使用。 一个简单的解决方案是使用如下所示的普通 yaml 列表:

---
- hosts: '{{ host }}'
  become: yes

  roles:
    - myrole1
    - myrole2

另一个示例,您可以在其中声明角色并将相应的变量传递给角色,如下所示:

---
- hosts: '{{ host }}'
  become: yes

  roles:
    - role: 
      name: myrole1
      vars:
        host: "db1"
        myroles: 
         - mysql1
         - apache1

    - role: 
      name: myrole2
      vars:
        host: "db2"
        myroles: 
         - mysql2
         - apache2

同时避免使用 ansible 关键字作为变量名 最后,您对 运行 您的剧本的命令如下:

ansible-playbook -i ./inventory/Dev ./playbooks/role.yml