我有一个包含大量系统的组,需要从该组中获取前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" ]'
我可能需要在将来更改母版的数量,所以我希望尽可能使用切片。感谢您的任何见解。
答案 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]