首页 > 解决方案 > 如何动态地将游戏中的主机设置为 Ansible 中 vars_file 中的变量

问题描述

我有一个根据调查定义一组变量的游戏,运行任务包括将变量写入文件。在第二场比赛中,我想根据文件中的变量设置主机。它给了我一个未定义的主机变量。

--- 
- name: "Provision Routers"
  connection: network_cli
  gather_facts: false
  hosts: '{{ DataCenter }}'
   
  vars: 
    customer_name: "{{ CustomerName }}"
    data_center: "{{ DataCenter }}"
    evpn_id: "{{ EVPN_ID }}"
    layer_3: "{{ LAYER_3 }}"
    ip_address: "{{ BVI_IP }}"
    prefix_mask: "{{ MASK }}"
      
  tasks:
        
    - name: "Config Router EVPN"
      iosxr_config: 
        lines:
          - evi {{evpn_id}}
          - control-word-disable
          - advertise-mac
        parents: evpn
        
------------------I'm leaving a bunch of tasks out to--------------------------
------------------Make this easier to read-------------------------------------
      
    - name: Make vars persistent
      local_action: 
        module: copy 
        content:
          - customer_name: "{{ customer_name }}"
          - data_center: "{{ data_center }}"
          - evpn_id: "{{ evpn_id }}"
        dest: /etc/ansible/group_vars/evpn_vars.yml
        mode: 0666

# 2nd play---------------------------------------------------------------------

- name: "Provision Switches"
  hosts: '{{ switch_group }}'
  vars_files:
    - /etc/ansible/group_vars/evpn_vars.yml
    
  tasks:
  
    - name: Set switch_group to Commerce
      set_fact:
        switch_group: Commerce_Switches
      when: data_center == 'Commerce'
    
    - name: Set switch_group to Gumlog
      set_fact:
        switch_group: Gumlog_Switches
      when: data_center == 'Gumlog'
      
    - name: Set switch_group to Richland
      set_fact:
        switch_group: Richland_Switches
      when: data_center == 'Richland'

这是我得到的错误:

错误!字段“主机”具有无效值,其中包括未定义的变量。错误是:“switch_group”未定义错误似乎在“/tmp/awx_929_h3cfbasn/project/provision_evpn_beta.yml”中:第 106 行,第 3 列,但可能在文件中的其他位置,具体取决于确切的语法问题。违规行似乎是:

这是我的变量文件的样子:

[{“customer_name”:“TEST444”},{“data_center”:“Richland”},{“evpn_id”:“444”}]

为了概括我想要做的事情,我需要根据原始调查中的先前输入将主机设置为不同的组。

为了增加一些色彩,我的第一个游戏是在数据中心配置一组路由器,第二个游戏是交换机。我将它们分开,因为显然您不想将相同的配置推送到路由器作为交换机。如果有更好的方法来隔离这两组(他们确实有不同的操作系统),我全神贯注。

标签: ansiblecisco

解决方案


你的switch_group是假的。

[{"customer_name": "TEST444"}, {"data_center": "Richland"}, {"evpn_id": "444"}]

它应该是有效的 JSON。看

$ ansible-inventory -i "8.8.4.4," --list all
{
    "_meta": {
        "hostvars": {}
    },
    "all": {
        "children": [
            "ungrouped"
        ]
    },
    "ungrouped": {
        "hosts": [
            "8.8.4.4"
        ]
    }
}

因此通过测试ansible-inventory --list switch_group


推荐阅读