如何在ansible中枚举主机?

时间:2018-05-21 09:05:33

标签: ansible ansible-2.x

我是使用Ansible并使用它来自动配置主从节点集群的新手。

我有一个主机文件分为两组:

[master]
masternode

[slaves]
slavenode0
slavenode1

我想要的是遍历从属组,以便使用从属组中位置的索引更新远程计算机上文件中的一行。

当我尝试使用' with_items'或者使用' with_indexed_items'问题是文件在从属组中的每台机器上更新,对应于从属组中的slavenode数量。这意味着每个slavenode上的每个文件最终都插入完全相同的行,只是文件更新了x次。

所以我想:

| slave node | filename | line in file     |
| slave0     |  test    | slave index is 0 |
| slave1     |  test    | slave index is 1 |

我得到的是:

| slave node | filename | line in file     |
| slave0     |  test    | slave index is 1 |
| slave1     |  test    | slave index is 1 |

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:4)

修改
重新阅读你的问题之后,我想我误解了它。

要获取广告资源组中当前主机的索引,您可以在组列表中使用index方法。

{{groups['slaves'].index(inventory_hostname)}}

实施例

- lineinfile:
    path: ~/test
    line: "slave index is {{groups['slaves'].index(inventory_hostname)}}"


原始回答
如果您使用带有ansible的jinja2模板,则可以使用{{loop.index}}访问for loop中的索引。

奴隶配置的示例模板可能如下所示

| slave node | filename | line in file |
{% for slave in groups['slaves'] %}
| {{slave}} | test | slave index is {{loop.index}} |
{% endfor %}

这应具有所需的输出

| slave node | filename | line in file |
| slavenode0 | test | slave index is 1 |
| slavenode1 | test | slave index is 2 |

要在您的剧本中使用此功能,请使用ansible template模块。

tasks:
  - name: master slave configuration
    template: src=slave.conf.j2 dest=/etx/slave.conf

答案 1 :(得分:2)

您可以向localhost运行游戏,当涉及lineinfile任务时,您应该添加delegate_to选项以将任务运行到每个主机。

您没有包含lineinfile代码,所以我无法为您调整,但您可以看到下面的示例演示了每个主机的索引增量:

- name: Print index of each host
  shell: "wall 'this is iteration: #{{ index_no}}'"
  delegate_to: "{{ item }}"
  loop: "{{ groups['is_hosts'] }}"
  loop_control:
    index_var: index_no

希望有所帮助