使用模式填充Ansible清单文件中的主机属性

时间:2015-02-10 19:48:15

标签: host ansible inventory

我有一个类似

的主机文件
[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.有没有办法在库存文件中实现这一点,或者我是否需要通过主持变量和/或组变量做某事?

2 个答案:

答案 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_factset_hostgroup_by可能会派上用场,或者是库存脚本,或group_vars(我目前使用group_vars服务器号码的文件。)

答案 1 :(得分:1)

最好使用Ansible的Dynamic Inventory功能。见Developing Dynamic Inventory Sources

这意味着编写一个以JSON格式返回主机名的脚本。