Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何轻松访问Ansible中的一组节点?_Ansible - Fatal编程技术网

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

如何轻松访问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

我有一个角色,其中的节点稍有不同。我通常执行以下任务/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']) }}

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

我主张将库存组拆分为
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']