如何从ansible中的变量文件调用类似列表的值

如何从ansible中的变量文件调用类似列表的值,ansible,ansible-facts,Ansible,Ansible Facts,我有一个ansible playbook,其中我要传递多个参数,这些参数有时足够长,使播放看起来很肥,因此我正在考虑创建一个变量文件,并在该文件中保留所有可能的值,以便从那里调用它们,使播放变瘦,同时避免对playbook,我们可以调整变量文件,如cloud_vars.yml 下面是我的变量文件: 下面是剧本 下面是一个剧本,它正在为以后在剧本中的使用设置事实,我期待着知道如何从vaiable文件中使用azure_域azure_res_组和azure_位置变量,因为它们在列表中定义,截至目前,我

我有一个ansible playbook,其中我要传递多个参数,这些参数有时足够长,使播放看起来很肥,因此我正在考虑创建一个变量文件,并在该文件中保留所有可能的值,以便从那里调用它们,使播放变瘦,同时避免对playbook,我们可以调整变量文件,如cloud_vars.yml

下面是我的变量文件: 下面是剧本 下面是一个剧本,它正在为以后在剧本中的使用设置事实,我期待着知道如何从vaiable文件中使用azure_域azure_res_组和azure_位置变量,因为它们在列表中定义,截至目前,我已经硬编码了名称和位置等

$ cat new_vm_Creation.yml
---
- name: create azure vm
  hosts: localhost
  connection: local
  tasks:
   -  include_vars: azure_vars.yml

   - set_fact:
      host: "{{ azure_vm_name.split('.') }}"

   - set_fact:
       azure_domain: "{{ host.1 }}.{{ host.2 }}"

   - name: azure_domain
     debug:
      msg: "{{ azure_domain }}"

   - set_fact:
      azure_location: "westus2"
     when: azure_domain == "us-sea01"

   - set_fact:
      azure_location: "westeurope"
     when: azure_domain == "eu-azrc1"

   - set_fact:
      azure_location: "southcentralus"
     when: azure_domain == "us-azrc2"

   - name: azure_location
     debug:
      msg: "{{ azure_location }}"

   - set_fact:
      res_group: "rg001"
     when: azure_domain == "us-sea01"

   - set_fact:
      res_group: "rg002"
     when: azure_domain == "eu-azrc1"

   - set_fact:
      res_group: "rg003"
     when: azure_domain == "us-azrc2"

   - name: Resource Group
     debug:
      msg: "{{ res_group }}"

   - set_fact:
      vnet: "{{ azure_nprod_vnet }}"
     when: azure_domain == "us-sea01"

   - set_fact:
      vnet: "{{ azure_prod03_vnet }}"
     when: azure_domain == "eu-azrc1"

   - set_fact:
      vnet: "{{ azure_prod02_vnet }}"
     when: azure_domain == "us-azrc2"

   - name: Vnet
     debug:
      msg: "{{ vnet }}"

   - name: create network security group that allows ssh
     azure_rm_securitygroup:
      resource_group: "{{ res_group }}"
      location: "{{ location }}"
      name: "{{ azure_vm_name }}-nsg"
      rules:
        - name: ssh
          protocol: Tcp
          destination_port_range: 22
          access: Allow
          priority: 100
          direction: Inbound

       - name: create virtual network interface card
         azure_rm_networkinterface:
          resource_group: "{{ res_group }}"
          location: "{{ location }}"
          name: "{{ azure_vm_name }}-nic1"
          subnet: "{{ azure_subnet_name }}"
          virtual_network: "{{ vnet }}"
          security_group: "{{ azure_vm_name }}-nsg"
          enable_accelerated_networking: true
          public_ip: no
          state: present
    
       - name: create vm
         azure_rm_virtualmachine:
          resource_group: "{{ res_group }}"
          location: "{{ location }}"
          name: "{{ azure_vm_name }}"
          vm_size: Standard_D4s_v3
          admin_username: some_id
          ssh_password_enabled: false
          ssh_public_keys:
            - path: /home/some_id/.ssh/authorized_keys
              key_data: "{{ public_key }}"
          network_interfaces: "{{ azure_vm_name }}-nic1"
          os_disk_name: "{{ azure_vm_name }}-osdisk"
          managed_disk_type: "{{ azure_os_disk_type }}"
          os_disk_caching: ReadWrite
          os_type: Linux
          image:
            id: "{{ azure_image_id }}"
            publisher: redhat
          plan:
            name: rhel-lvm78
            product: rhel-byos
            publisher: redhat
    ...

您可以在azure_vars.yml文件中定义这些结构,包括jinja2模板,但只需知道将它们放在vars文件中并不能解决它们-jinja2模板评估在ansible中是递归的,因此当您第一次看到成功或可怕的变量时,它们就没有定义

给定的azure_vars.yml

azure_nprod_vnet:/subscriptions/alpha nprod/resourceGroups/rg001/providers/Microsoft.Network/virtualNetworks/vnet azure_prod03_vnet:/subscriptions/beta-prod03/resourceGroups/rg002/providers/Microsoft.Network/virtualNetworks/vnet azure_prod02_vnet:/subscriptions/charlie-prod02/resourceGroups/rg003/providers/Microsoft.Network/virtualNetworks/vnet 按\u azure\u域列出的内容: us-sea01: azure_位置:westus2 研究小组:rg001 vnet:{{azure\u nprod\u vnet} eu-azrc1: 地点:西欧 资源组:rg002 vnet:{{azure_prod03_vnet} us-azrc2: azure_位置:southcentralus 资源组:rg003 vnet:{{azure_prod02_vnet} vnet:{{things\u by_azure\u domain[azure\u domain].vnet} 然后,将azure_域放入作用域后,{{vnet}的使用将递归地计算该表达式:

任务: 注意,即使“azure_域”尚未定义,我们也可以将其包括在内 因为'include_vars'不计算那些jinja2表达式 -包含变量:azure\u vars.yml -设定事实: azure_域:us-azrc2 -调试: 变量:vnet 屈服

ok: [localhost] => {
    "vnet": "/subscriptions/charlie-prod02/resourceGroups/rg003/providers/Microsoft.Network/virtualNetworks/vnet"
但是,正如我所说,你需要小心谨慎,因为胖手指不会有好下场:

任务: -包含变量:azure\u vars.yml -设定事实: azure_域名:美国洋基涂鸦 -调试: 变量:vnet 屈服

ok: [localhost] => {
    "vnet": "VARIABLE IS NOT DEFINED!"
}
但至少在我的ansible 2.9.13中,以更高的详细度运行确实揭示了根本原因:

ok: [localhost] => {
    "vnet": "VARIABLE IS NOT DEFINED!: 'dict object' has no attribute 'us-yankee-doodle'"
}

您可以在azure_vars.yml文件中定义这些结构,包括jinja2模板,但只需知道将它们放在vars文件中并不能解决它们-jinja2模板评估在ansible中是递归的,因此当您第一次看到成功或可怕的变量时,它们就没有定义

给定的azure_vars.yml

azure_nprod_vnet:/subscriptions/alpha nprod/resourceGroups/rg001/providers/Microsoft.Network/virtualNetworks/vnet azure_prod03_vnet:/subscriptions/beta-prod03/resourceGroups/rg002/providers/Microsoft.Network/virtualNetworks/vnet azure_prod02_vnet:/subscriptions/charlie-prod02/resourceGroups/rg003/providers/Microsoft.Network/virtualNetworks/vnet 按\u azure\u域列出的内容: us-sea01: azure_位置:westus2 研究小组:rg001 vnet:{{azure\u nprod\u vnet} eu-azrc1: 地点:西欧 资源组:rg002 vnet:{{azure_prod03_vnet} us-azrc2: azure_位置:southcentralus 资源组:rg003 vnet:{{azure_prod02_vnet} vnet:{{things\u by_azure\u domain[azure\u domain].vnet} 然后,将azure_域放入作用域后,{{vnet}的使用将递归地计算该表达式:

任务: 注意,即使“azure_域”尚未定义,我们也可以将其包括在内 因为'include_vars'不计算那些jinja2表达式 -包含变量:azure\u vars.yml -设定事实: azure_域:us-azrc2 -调试: 变量:vnet 屈服

ok: [localhost] => {
    "vnet": "/subscriptions/charlie-prod02/resourceGroups/rg003/providers/Microsoft.Network/virtualNetworks/vnet"
但是,正如我所说,你需要小心谨慎,因为胖手指不会有好下场:

任务: -包含变量:azure\u vars.yml -设定事实: azure_域名:美国洋基涂鸦 -调试: 变量:vnet 屈服

ok: [localhost] => {
    "vnet": "VARIABLE IS NOT DEFINED!"
}
但至少在我的ansible 2.9.13中,以更高的详细度运行确实揭示了根本原因:

ok: [localhost] => {
    "vnet": "VARIABLE IS NOT DEFINED!: 'dict object' has no attribute 'us-yankee-doodle'"
}
我喜欢@mdaniel的想法,但我不知道以后谁会把它们放在你的剧本中,用于不同的任务:

根据你的帖子,你可以稍微调整一下你的azure_vars.yml,以便让它们按相同的顺序排列,这将有助于在以后的游戏中轻松调用它们

因此,我在过去的十年中首先与美国地区结盟,紧随欧洲之后

Var文件: 播放: 现在,您可以稍微精简您的剧本,这将帮助您只修改azure_vars.yml,而不是在剧本中

---
- name: create azure vm
  hosts: localhost
  connection: local
  tasks:
   -  include_vars: azure_vars.yml

   - set_fact:
      host: "{{ azure_vm_name.split('.') }}"

   - set_fact:
       domain: "{{ host.1 }}.{{ host.2 }}"

   - name: Domain
     debug:
      msg: "{{ domain }}"

   - set_fact:
      location: "{{ azure_location[0] }}"
     when: 'domain == azure_domain[0]'

   - set_fact:
      location: "{{ azure_location[1] }}"
     when: 'domain == azure_domain[1]'

   - set_fact:
      location: "{{ azure_location[2] }}"
     when: 'domain == azure_domain[2]'

   - name: Location
     debug:
      msg: "{{ location }}"

   - set_fact:
      res_group: "{{ azure_res_group[0] }}"
     when: 'domain == azure_domain[0]'

   - set_fact:
      res_group: "{{ azure_res_group[1] }}"
     when: 'domain == azure_domain[1]'

   - set_fact:
      res_group: "{{ azure_res_group[2] }}"
     when: 'domain == azure_domain[2]'

   - name: Resource Group
     debug:
      msg: "{{ res_group }}"

   - set_fact:
      vnet: "{{ azure_nprod_vnet }}"
     when: 'domain == azure_domain[0]'

   - set_fact:
      vnet: "{{ azure_prod03_vnet }}"
     when: 'domain == azure_domain[2]'

   - set_fact:
      vnet: "{{ azure_prod02_vnet }}"
     when: 'domain == azure_domain[1]'

   - name: Vnet
     debug:
      msg: "{{ vnet }}"
我喜欢@m的想法 daniel但我不知道以后谁会把它们放在你的剧本中,用于不同的任务:

根据你的帖子,你可以稍微调整一下你的azure_vars.yml,以便让它们按相同的顺序排列,这将有助于在以后的游戏中轻松调用它们

因此,我在过去的十年中首先与美国地区结盟,紧随欧洲之后

Var文件: 播放: 现在,您可以稍微精简您的剧本,这将帮助您只修改azure_vars.yml,而不是在剧本中

---
- name: create azure vm
  hosts: localhost
  connection: local
  tasks:
   -  include_vars: azure_vars.yml

   - set_fact:
      host: "{{ azure_vm_name.split('.') }}"

   - set_fact:
       domain: "{{ host.1 }}.{{ host.2 }}"

   - name: Domain
     debug:
      msg: "{{ domain }}"

   - set_fact:
      location: "{{ azure_location[0] }}"
     when: 'domain == azure_domain[0]'

   - set_fact:
      location: "{{ azure_location[1] }}"
     when: 'domain == azure_domain[1]'

   - set_fact:
      location: "{{ azure_location[2] }}"
     when: 'domain == azure_domain[2]'

   - name: Location
     debug:
      msg: "{{ location }}"

   - set_fact:
      res_group: "{{ azure_res_group[0] }}"
     when: 'domain == azure_domain[0]'

   - set_fact:
      res_group: "{{ azure_res_group[1] }}"
     when: 'domain == azure_domain[1]'

   - set_fact:
      res_group: "{{ azure_res_group[2] }}"
     when: 'domain == azure_domain[2]'

   - name: Resource Group
     debug:
      msg: "{{ res_group }}"

   - set_fact:
      vnet: "{{ azure_nprod_vnet }}"
     when: 'domain == azure_domain[0]'

   - set_fact:
      vnet: "{{ azure_prod03_vnet }}"
     when: 'domain == azure_domain[2]'

   - set_fact:
      vnet: "{{ azure_prod02_vnet }}"
     when: 'domain == azure_domain[1]'

   - name: Vnet
     debug:
      msg: "{{ vnet }}"

非常感谢您的详细解释,这很有帮助。不过,我想知道我能不能把它融入我之前更新过的剧本中。非常感谢你的详细解释,这很有帮助。但是,我想知道我是否可以将这一点融入我不久前更新的剧本中。非常感谢@Karn,这很有帮助。非常感谢@Karn,这很有帮助。记录在案,这里是交叉提问:记录在案,这里是交叉提问: