Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 当提供set_事实变量时,ansible with_dict失败_Dictionary_Variables_Ansible - Fatal编程技术网

Dictionary 当提供set_事实变量时,ansible with_dict失败

Dictionary 当提供set_事实变量时,ansible with_dict失败,dictionary,variables,ansible,Dictionary,Variables,Ansible,我试图动态地为接口变量提供字典名 我的任务是这样的 - name: Setting interface list set_fact: one_fact: "{{ host_name }}_interfaces" - name: deb debug: var={{ one_fact }} - name: Managing Interfaces ios_interface: enabled: "{{ item['value']['enabled'] }}" n

我试图动态地为接口变量提供字典名

我的任务是这样的

- name: Setting interface list
  set_fact:
    one_fact: "{{ host_name }}_interfaces"

- name: deb
  debug: var={{ one_fact }}

- name: Managing Interfaces
  ios_interface:
    enabled: "{{ item['value']['enabled'] }}"
    name: "{{ item['key'] }}"
    state: "{{ item['value']['state'] }}"
  with_dict: "{{ one_fact }}"
字典看起来像这样

---
h1_interfaces:
  Ethernet1/1:
    description: Firewall
    enabled: true
    speed: auto
    state: present
  Ethernet1/2:
    description: asd
    enabled: true
    speed: auto
    state: present
h2_interfaces:
  Ethernet1/1:
    description: Firewall
    enabled: true
    speed: auto
    state: present
  Ethernet1/2:
    description: asd
    enabled: true
    speed: auto
    state: present
当我用dict:{{one_fact}}设置
时,我得到一个错误
失败!=>{“msg”:“with_dict期望一个dict”}

但是,当我用dict:{{h1\u interfaces}}
提供
时,它就像一个符咒。我做错了什么?

显然,您也有一个变量
主机名
,它被设置为
h1
h2
,您想访问字典:
h1\u接口
/
h2\u接口

要动态构造变量名并访问其值,应使用,请参阅以下任务:

  - name: Setting interface list
    set_fact:
      one_fact: "{{ lookup('vars', myvar + '_interfaces') }}"
    vars:
      myvar: "{{ host_name }}"
还有一本稍加修改的剧本来展示结果:

剧本:

---
- hosts: localhost
  gather_facts: false
  vars:
    host_name: h1
    h1_interfaces:
      Ethernet1/1:
        description: Firewall
        enabled: true
        speed: auto
        state: present
      Ethernet1/2:
        description: asd
        enabled: true
        speed: auto
        state: present
    h2_interfaces:
      Ethernet1/1:
        description: Firewall
        enabled: true
        speed: auto
        state: present
      Ethernet1/2:
        description: asd
        enabled: true
        speed: auto
        state: present
    
 
  tasks:

  - name: Setting interface list
    set_fact:
      one_fact: "{{ lookup('vars', myvar + '_interfaces') }}"
    vars:
      myvar: "{{ host_name }}"

  - name: deb
    debug: var=one_fact

  - name: Managing Interfaces
    debug:
      msg: "enabled: {{ item['value']['enabled'] }}, name: {{ item['key'] }}, state: {{ item['value']['state'] }}"
    with_dict: "{{ one_fact }}"
TASK [Managing Interfaces] *********************************************************************************************************************************************************************************************
ok: [localhost] => (item={'key': 'Ethernet1/1', 'value': {'description': 'Firewall', 'enabled': True, 'speed': 'auto', 'state': 'present'}}) => {
    "msg": "enabled: True, name: Ethernet1/1, state: present"
}
ok: [localhost] => (item={'key': 'Ethernet1/2', 'value': {'description': 'asd', 'enabled': True, 'speed': 'auto', 'state': 'present'}}) => {
    "msg": "enabled: True, name: Ethernet1/2, state: present"
}
结果:

---
- hosts: localhost
  gather_facts: false
  vars:
    host_name: h1
    h1_interfaces:
      Ethernet1/1:
        description: Firewall
        enabled: true
        speed: auto
        state: present
      Ethernet1/2:
        description: asd
        enabled: true
        speed: auto
        state: present
    h2_interfaces:
      Ethernet1/1:
        description: Firewall
        enabled: true
        speed: auto
        state: present
      Ethernet1/2:
        description: asd
        enabled: true
        speed: auto
        state: present
    
 
  tasks:

  - name: Setting interface list
    set_fact:
      one_fact: "{{ lookup('vars', myvar + '_interfaces') }}"
    vars:
      myvar: "{{ host_name }}"

  - name: deb
    debug: var=one_fact

  - name: Managing Interfaces
    debug:
      msg: "enabled: {{ item['value']['enabled'] }}, name: {{ item['key'] }}, state: {{ item['value']['state'] }}"
    with_dict: "{{ one_fact }}"
TASK [Managing Interfaces] *********************************************************************************************************************************************************************************************
ok: [localhost] => (item={'key': 'Ethernet1/1', 'value': {'description': 'Firewall', 'enabled': True, 'speed': 'auto', 'state': 'present'}}) => {
    "msg": "enabled: True, name: Ethernet1/1, state: present"
}
ok: [localhost] => (item={'key': 'Ethernet1/2', 'value': {'description': 'asd', 'enabled': True, 'speed': 'auto', 'state': 'present'}}) => {
    "msg": "enabled: True, name: Ethernet1/2, state: present"
}

干杯

我真的不明白你想要实现什么<带有dict的code>确实需要一个字典,但是一个事实被初始化为字符串。你能详细说明一下你期望的结果是什么吗?