如何轻松访问Ansible中的一组节点?
我有一个角色,其中的节点稍有不同。我通常执行以下任务/main.yml:如何轻松访问Ansible中的一组节点?,ansible,Ansible,我有一个角色,其中的节点稍有不同。我通常执行以下任务/main.yml: - include: spark_master.yml when: spark_master|default(false)|bool - include: spark_worker.yml when: spark_worker|default(false)|bool 而不是在库存文件中: [spark] 192.168.172.101 spark_master=true spark_worker=false 1
- include: spark_master.yml
when: spark_master|default(false)|bool
- include: spark_worker.yml
when: spark_worker|default(false)|bool
而不是在库存文件中:
[spark]
192.168.172.101 spark_master=true spark_worker=false
192.168.172.102 spark_master=false spark_worker=true
192.168.172.103 spark_master=false spark_worker=true
但是,如果我需要访问某个模板中其他角色的所有工作人员,我没有一个好的方法
我在考虑使用实际的主机组条目,这样我就可以引用这样的工作人员:
iventory:
[spark-workers]
node1
node2
其他角色中的模板:
{{ groups['spark-workers'] | map('extract', hostvars, ['ansible_eth0', 'ipv4', 'address']) }}
有没有更好的方法来访问节点的子组而不实际使用库存文件中的不同组?我主张将库存组拆分为
spark workers
和spark masters
将是最干净的方法。但是,如果您对当前的库存死心塌地,下面介绍如何在Ansible模板中引用其他GroupVar/HostVar
{% for host in groups['spark'] %}
{% if hostvars[host].spark_master|bool %}
# do some spark master stuff
{{ hostvars[host].ansible_default_ipv4.address }}
{% else %}
#do spark worker stuff
{{ hostvars[host].ansible_default_ipv4.address }}
{% endif %}
{% endfor %}
需要注意的是,只有当主机在playbook中时,才能以这种方式访问主机的默认事实。这意味着,如果您正在对组foo
运行剧本,则此模板将失败,因为未收集组spark
中的任何事实
为了解决这个问题,你可以在真正的游戏之前创建一个虚拟游戏,从spark
收集事实
- hosts: spark
tasks:
- debug:
msg: "This is to gather facts from spark"
- hosts: foo
tasks:
- name: create template
template:
src: template.j2
dest: /some/path/template
我主张将库存组分为
spark workers
和spark masters
将是最干净的方法。但是,如果您对当前的库存死心塌地,下面介绍如何在Ansible模板中引用其他GroupVar/HostVar
{% for host in groups['spark'] %}
{% if hostvars[host].spark_master|bool %}
# do some spark master stuff
{{ hostvars[host].ansible_default_ipv4.address }}
{% else %}
#do spark worker stuff
{{ hostvars[host].ansible_default_ipv4.address }}
{% endif %}
{% endfor %}
需要注意的是,只有当主机在playbook中时,才能以这种方式访问主机的默认事实。这意味着,如果您正在对组foo
运行剧本,则此模板将失败,因为未收集组spark
中的任何事实
为了解决这个问题,你可以在真正的游戏之前创建一个虚拟游戏,从spark
收集事实
- hosts: spark
tasks:
- debug:
msg: "This is to gather facts from spark"
- hosts: foo
tasks:
- name: create template
template:
src: template.j2
dest: /some/path/template
很抱歉,因为我的回答与“没有单独的组”的要求相矛盾,但您是否考虑过使用 所以在你的情况下,你会有一个
[spark:children]
spark-master
spark-workers
[spark-master]
192.168.172.101
[spark-workers]
192.168.172.102
192.168.172.103
然后您可以根据需要引用
组['spark-workers']
和组['spark']
。很抱歉,因为我的回答与“没有单独的组”要求相矛盾,但您考虑过使用
所以在你的情况下,你会有一个
[spark:children]
spark-master
spark-workers
[spark-master]
192.168.172.101
[spark-workers]
192.168.172.102
192.168.172.103
然后,您可以根据需要引用组['spark-workers']
和组['spark']