带有主机列表的 Ansible 模板,不包括当前

Paw*_*cki 2 jinja2 ansible

我对 ansible 非常新鲜,并创建了一个剧本,在其中一个任务中应该复制模板文件并替换 2 行中的值。第一行应该有当前的主机名,在第二个分号分隔的所有其他主机列表中(在剧中使用) - 它将是不同的组

第一行非常简单,因为它只是:

localnode={{ inventory_hostname }}
Run Code Online (Sandbox Code Playgroud)

但我在第二行中遇到排除问题。我想要类似的东西:

{% for host in groups.nodes -%} # but without inventory_hostname 
othernodes={{ host }}{% if not loop.last %};{% endif %}
{%- endfor %}
Run Code Online (Sandbox Code Playgroud)

鉴于库存:

nodes:
  hosts:
    hosta:
    hostb:
    hostc:
    hostd:
Run Code Online (Sandbox Code Playgroud)

我想获得以下输出(hostd 的示例):

localnode=hostd
othernodes=hosta,hostb,hostc
Run Code Online (Sandbox Code Playgroud)

我将非常感谢有关可能解决方案的所有提示

Vla*_*tka 6

创建没有inventory_hostname的主机列表并在模板中使用它

    - set_fact:
        list_other_hosts: "{{ groups.nodes|difference([inventory_hostname]) }}"
Run Code Online (Sandbox Code Playgroud)

简化模板

    othernodes={{ list_other_hosts|join(';') }}
Run Code Online (Sandbox Code Playgroud)
例如,库存
shell> cat hosts
test_jails:
  hosts:
    test_01:
    test_02:
    test_03:
Run Code Online (Sandbox Code Playgroud)

和戏剧

- hosts: test_jails
  tasks:
    - set_fact:
        list_other_hosts: "{{ groups.test_jails|
                              difference([inventory_hostname]) }}"
    - debug:
        msg: "{{ msg.split('\n') }}"
      vars:
        msg: |-
          localnode={{ inventory_hostname }}
          othernodes={{ list_other_hosts|join(';') }}
Run Code Online (Sandbox Code Playgroud)

    TASK [debug] ********************************************************
    ok: [test_01] => {
        "msg": [
            "localnode=test_01", 
            "othernodes=test_02;test_03"
        ]
    }
    ok: [test_02] => {
        "msg": [
            "localnode=test_02", 
            "othernodes=test_01;test_03"
        ]
    }
    ok: [test_03] => {
        "msg": [
            "localnode=test_03", 
            "othernodes=test_01;test_02"
        ]
    }
Run Code Online (Sandbox Code Playgroud)