我有一个类似
的主机文件[foo]
foox 192.168.0.1 id=1
fooy 192.168.0.1 id=2
fooz 192.168.0.1 id=3
但是,我想更简洁地使用以下模式来编写:
[foo]
foo[x:z] 192.168.0.1 id=[1:3]
但这被解释为id等于" [1:3]"的原始文本,而不是1,2或3.有没有办法在库存文件中实现这一点,或者我是否需要通过主持变量和/或组变量做某事?
答案 0 :(得分:5)
这不能在库存文件中完成。我认为set_fact
是以编程方式构建库存的最佳选择。
---
- hosts: all
tasks:
- add_host:
name: "host{{ item }}"
ansible_ssh_host: "127.0.0.1"
ansible_connection: "local"
group: "new"
id: "{{ item }}"
with_sequence: count=3
delegate_to: localhost
run_once: yes
- hosts: new
tasks:
- debug:
msg: "{{ id }}"
如果我没记错的话,Jinja功能已从他们不应该去过的每个地方删除,即在YML文件中引用,括号,特殊情况如when:
。
但是,当我以编程方式说,我们谈论的是Ansible ..地球上最后一个通用脚本编写者之一。动态库存脚本是解决这些问题的更好方法,除非我们正在准确地讨论三台服务器。
完成此操作的最简单的库存脚本(在hosts
目录中或-i
开关指向:
#!/usr/bin/env python
import json
inv = {}
for i in range(3):
inv[i] = {"hosts":["host%s" % i],"vars":{"id":i,"ansible_ssh_host":"127.0.0.1", "ansible_connection":"local"}}
print json.dumps(inv)
同样,我担心没有像你想要的那样“漂亮”。如果您的用例变得更加复杂,那么set_fact
,set_host
和group_by
可能会派上用场,或者是库存脚本,或group_vars
(我目前使用group_vars
服务器号码的文件。)
答案 1 :(得分:1)
最好使用Ansible的Dynamic Inventory功能。见Developing Dynamic Inventory Sources。
这意味着编写一个以JSON格式返回主机名的脚本。