用ansible建立一个列表

时间:2017-08-21 15:28:23

标签: ansible

我有一个包含大量系统的组,需要从该组中获取前3个系统。有没有办法把这样一个团体:

[webservers]
web01
web02
web03
web04
web05

并生成类似于以下内容的引用列表?:

- name: Pick the initial masters
  lineinfile:
    dest: "/bits/etc/web.conf"
    state: present
    regexp: 'node.masters'
    line: 'node.masters: [ "web01", "web02", "web03" ]'

我可能需要在将来更改母版的数量,所以我希望尽可能使用切片。感谢您的任何见解。

2 个答案:

答案 0 :(得分:2)

您可以引用内置的groups变量。

- name: Pick the initial masters
  lineinfile:
    dest: "/bits/etc/web.conf"
    state: present
    regexp: 'node.masters'
    line: "node.masters: [ \"{{ groups['webservers'][0] }}\", \"{{ groups['webservers'][1] }}\", \"{{ groups['webservers'][2] }}\" ]"

更新了评论的回答:

您还可以在变量声明中使用jinja来循环遍历Web服务器中的任意数量的主机。

vars: 
  master_nodes: 3
  master_nodes_line: "{% for item in groups['webservers'][:master_nodes] %}\"{{ item }}\"{% if not loop.last %},{% endif %}{% endfor %}"
tasks:
- name: Print list
  lineinfile:
    dest: foo
    regexp: "node.masters"
    line: "node.masters: [ {{ master_nodes_line }} ]"

答案 1 :(得分:2)

您可以使用python array slice syntax并将其传递给json过滤器。这将避免在Jinja2中循环并产生良好的引用输出。

- name: Pick the initial masters
  lineinfile:
    dest: /bits/etc/web.conf
    state: present
    regexp: 'node.masters'
    line: 'node.masters: {{groups['webservers'][:3] | to_json}}'

小心切片组,因为如果动态生成库存,订单不一定一致,如Ansible FAQ中所述。为了避免这种情况,我建议在清单中创建第二组“主人”,指定要使用哪些节点而不是依赖于订单。这有其他好处,例如能够瞄准主人或非主人,而不必知道和改变每个剧本中的主人数。

[webservers]
web[01:05]

[masters]
web[01:03]