2017-08-01 47 views
0

我有一个单一的角色,它的节点略有不同。我通常执行以下任务/ main.yml:如何轻松访问Ansible中的一组节点?

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

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

回答

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']

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 
相关问题