如何轻松访问Ansible中的一组节点?

时间:2017-08-01 15:00:25

标签: 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
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']) }}

是否有更好的方法来访问节点子组而不实际使用清单文件中的不同组?

2 个答案:

答案 0 :(得分:1)

我主张将您的广告资源组拆分为spark-workersspark-masters将是最干净的路线。但是,如果您在当前库存中设置了死机,那么您可以在Ansible模板中引用其他groupvars / hostvars。

{% 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 %}

请务必注意,只有主机位于剧本中时,才能以这种方式访问​​主机的默认事实。这意味着如果您正在针对组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

答案 1 :(得分:1)

对不起,因为我的回答与"没有单独的群体相矛盾。"要求,但您是否考虑过使用children groups?

所以在你的情况下你会有一个

[spark:children]
spark-master
spark-workers
[spark-master]
192.168.172.101
[spark-workers]
192.168.172.102
192.168.172.103

然后您可以根据需要引用groups['spark-workers']groups['spark']