在变量中设置接口名,jinja循环在ansible上



我想在一个变量中设置接口名称,如果它等于命令行上的变量传递,所以我像这样使用jinja:

- name: Inizializzo la rete
hosts: all
gather_facts: true
become: yes
become_user: root
tasks:
- name: stampo interfacce
set_fact:
privata: "{% for interfacce in ansible_interfaces %} {% set int_tmp = 'ansible_facts.' ~ interfacce ~ '.macaddress' %} {% if {{int_tmp}}==mac_privata %} {{interfacce}} {% endif %} {% endfor %}"
- name: Stampo
debug:
msg: "{{privata}}"

但它不起作用我称之为:

ansible-playbook test.yml --extra-vars "mac_privata=00:50:56:b7:bc:f1"

我这样做是因为我有三个以上的接口我哪里错了?

编辑:@mdaniel谢谢你的回答,但它似乎不能替代hostvars['ansible_' ~ interface ~ ']。Macaddress '],内容为ansible_ens32.macaddress。例如,我这样做:

- name: Stampo
debug:
msg: "{{ ansible_ens32.macaddress }}"

我有这样的输出:

TASK [Stampo] **********************************************************************************************************************************************
ok: [10.150.20.130] => {
"msg": "00:50:56:b7:bb:f1"
}

但是如果我这样做:

- name: stampo interfacce
set_fact:
privata: >-
{%- for interfacce in ansible_interfaces -%}
{%- if interfacce != 'lo' -%}
{%- set int_tmp = hostvars['ansible_' ~ interfacce ~ '.macaddress'] -%}
{%- if int_tmp == mac_privata -%}
{{ interfacce }}
{%- endif -%}
{%- endif -%}
{%- endfor -%}
- name: Stampo
debug:
msg: "{{privata}}"

如果我这样做,我期望在私有变量中使用mac_privata macaddress的接口名称:

ansible-playbook test.yml --extra-vars "mac_privata=00:50:56:b7:bb:f1"

我有ens_32,但它是空的:

TASK [stampo interfacce] ***********************************************************************************************************************************
task path: /mnt/c/Users/francesco.ferraro/ansible_test/test.yml:7
ok: [10.150.20.130] => {
"ansible_facts": {
"privata": ""
},
"changed": false
}

任何时候看到{{在另一个jinja2上下文中,这几乎肯定不是你想要发生的。要动态查找变量,请使用vars[""]hostvars[""],或者如果您喜欢使用lookup("vars", "")

privata: >-
{%- for interfacce in ansible_interfaces -%}
{%- set int_tmp = vars['ansible_facts.' ~ interfacce ~ '.macaddress'] -%}
{%- if int_tmp == mac_privata -%}
{{ interfacce }}
{%- endif -%}
{%- endfor -%}

大多数情况下支持条件for循环,这可以使代码段更短一些

privata: >-
{%- for interfacce in ansible_interfaces
if mac_privata == vars['ansible_facts.' ~ interfacce ~ '.macaddress'] -%}
{{ interfacce }}
{%- endfor -%}

最新更新