Ansible 包括已在 hostvars 中定义的角色
Ansible include roles that have been defined in hostvars
我正在尝试执行以下操作:
- 在 hostvars 中定义适当的主机角色
- 创建一个角色以仅调用与特定主机相关且已在 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
我正在尝试执行以下操作:
- 在 hostvars 中定义适当的主机角色
- 创建一个角色以仅调用与特定主机相关且已在 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