【问题标题】:Using patterns to populate host properties in Ansible inventory file使用模式填充 Ansible 清单文件中的主机属性
【发布时间】:2015-04-11 00:10:04
【问题描述】:

我有一个看起来像这样的主机文件

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

【问题讨论】:

    标签: host ansible inventory


    【解决方案1】:

    这不能在库存文件中完成。我认为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 文件作为服务器编号)。

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      相关资源
      最近更新 更多