Ansible 包括已在 hostvars 中定义的角色

Ansible include roles that have been defined in hostvars

我正在尝试执行以下操作:

  1. 在 hostvars 中定义适当的主机角色
  2. 创建一个角色以仅调用与特定主机相关且已在 hostvars 的变量中定义的角色

有办法吗?

例如:

host_vars/hostname_one/mail.yml

roles_to_install:
  - role_one
  - role_two
  - ...

run_all_roles.yml

---
- hosts: '{{ TARGET }}'

  become: yes
  ... 
  roles:
    - { role: "roles_to_install"}

显然这是行不通的。

有没有办法让ansible-playbook -i <hosts_file> run_all_roles.yml -e "TARGET=hostname_one"变成运行?

这不是您处理角色和库存的方式。

相反,如果您将主机放在适当组的清单中,您可以使用剧本的 hosts 参数来驱动安装的位置。

例如,我可能有一个典型的 Web 应用程序,它在 NGINX 上 运行 具有一些特定于应用程序的东西(例如 Python 环境),但也有一些 NGINX 服务器的前端可能提供静态内容,也可能有一个典型的数据库。

我的库存可能如下所示:

[frontend-web-nodes]
web-1.example.org
web-2.example.org

[application-nodes]
app-1.example.org
app-2.example.org

[database-nodes]
database.example.org

现在,我可以为我的数据库角色创建一个剧本,安装一些数据库并配置和设置 hosts: database-nodes 以确保剧本(以及它运行的角色只针对database.example.org箱子。

所以像这样:

- name: database

  hosts: database-nodes

  roles:

    - database

对于我的前端和应用程序 Web 节点,我对安装和配置 NGINX 有共同的依赖性,但我的应用程序服务器还需要一些其他东西。所以我的前端网络节点可以像这样简单地配置:

- name: frontend-web

  hosts: frontend-web-nodes

  roles:

    - nginx

虽然对于我的应用程序节点,我可能有这样的东西:

- name: application

  hosts: application-nodes

  roles:

    - nginx

    - application

或者我可以这样做:

- name: application

  hosts: application-nodes

  roles:

    - application

并且在我的 roles/application/meta/main.yml 中定义一个 dependency 在 nginx 角色上:

dependencies:
  - role: nginx

正如我评论的那样,解决方案比预期的要简单:

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

  vars_files: 
  - ./vars/main.yml 

  roles: 
    - { role: "roleA", when: "'roleA' in roles_to_install" } 
    - { role: "roleB", when: "'roleB' in roles_to_install" } 
    ... 

假设在 host_vars/$fqdn/main.yml 中定义了正确的 roles_to_install 变量,如下所示:

---
roles_to_install:
  - roleA
  - roleB
  - ...

谢谢大家的帮助

这个怎么样:

playfile.yml:

- hosts:  all
  tasks:
    - when: host_roles is defined
      include_role:
        name:       "{{ role_item }}"
      loop:         "{{ host_roles }}"
      loop_control:
        loop_var:   role_item

hostvars_file.yml:

host_roles:
  - name: myrole1
    myrole1_var1:     "myrole1_value1"
    myrole1_var2:     "myrole1_value2"                

  - name: myrole2
    myrole2_var1:     "myrole2_value1"
    myrole2_var2:     "myrole2_value2"                

但是你的 hostvar_roles 在任务执行期间会 运行,通常角色会在任务之前执行。

或者为什么没有这个角色:

roles/ansible.hostroles/tasks/main.yml:

---
# tasks file for ansible.hostroles

- when: host_roles is defined
  include_role:
    name:       "{{ role_item }}"
  loop:         "{{ host_roles }}"
  loop_control:
    loop_var:   role_item

playfile.yml:

- hosts:  all
  roles:
    - ansible.hostroles