1

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

“错误!‘项目’未定义”

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"]}'
4

2 回答 2

2

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

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


但是,您可以做的是使用include_role 模块,您可以在其中访问变量。

不,include_role 模块不会{{ item }}从两者with_items中的任何一个中获取值name

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

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

无论如何,这些角色都需要存在于控制机器上,因此它们的所有名称都是预定义的。

于 2017-03-22T09:32:32.513 回答
0

您不能将 with_ 循环与角色指令一起使用。一个简单的解决方案是使用正常的 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 关键字作为变量名最后,运行 playbook 的命令如下:

ansible-playbook -i ./inventory/Dev ./playbooks/role.yml 
于 2020-08-29T19:29:13.597 回答