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

时间:2016-05-13 14:49:33

标签: ansible roles ansible-playbook

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

  1. 在hostvars中定义适当的主机角色
  2. 创建一个角色,仅调用与特定主机相关的角色,并且已在hostvars中的变量中定义
  3. 有办法做到这一点吗?

    例如:

    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"运行?

3 个答案:

答案 0 :(得分:0)

这不是你应该如何接近你的角色和库存。

相反,如果您将主机放在相应组中的清单中,则可以使用该剧本的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

现在,我可以为我的数据库角色创建一个playbook,安装一些数据库并配置和设置hosts: database-nodes以确保播放(因此它运行的角色只针对{{} 1}}框。

这样的事情:

database.example.org

对于我的前端和应用程序Web节点,我对安装和配置NGINX有共同依赖,但我的应用程序服务器还需要其他一些东西。所以我的前端Web节点可以配置一个简单的播放,如下所示:

- name: database

  hosts: database-nodes

  roles:

    - database

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

- name: frontend-web

  hosts: frontend-web-nodes

  roles:

    - nginx

或者我可以这样做:

- name: application

  hosts: application-nodes

  roles:

    - nginx

    - application

- name: application hosts: application-nodes roles: - application 中,在nginx角色上定义dependency

roles/application/meta/main.yml

答案 1 :(得分:0)

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

--- 
- 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 var,如下所示:

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

谢谢你的协助人

答案 2 :(得分:0)

这个怎么样:

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