使用 ansible 访问字典文件的 yaml 列表

Posted

技术标签:

【中文标题】使用 ansible 访问字典文件的 yaml 列表【英文标题】:Access yaml list of dictionaries file with ansible 【发布时间】:2021-12-12 15:10:28 【问题描述】:

所以我尝试从文件中获取值,我们称之为“test.yaml”

文件看起来像这样(对不起,输出很长,但它是包含所有模式和结构的最短路径):

---
results:
- failed: false
  item: XXX.XX.XX.XX
  invocation:
    module_args:
      validate_certs: false
      vm_type: vm
      show_tag: false
      username: DOMAIN\domain-user
      proxy_host:
      proxy_port:
      show_attribute: false
      password: VALUE_SPECIFIED_IN_NO_LOG_PARAMETER
      port: XXX
      folder:
      hostname: XXX.XX.XX.XX
  changed: false
  virtual_machines:
  - ip_address: XXX.XX.XX.XX
    mac_address:
    - XX:XX:XX:aa:XX:XX
    uuid: XXXX-XX-XX-XXXX-XXXXX
    guest_fullname: Red Hat Enterprise Linux X (XX-bit)
    moid: vm-XXX
    folder: "/DOMAIN-INTERXION/vm"
    cluster:
    attributes: 
    power_state: poweredOn
    esxi_hostname: esx.hostname 
    tags: []
    guest_name: VMnameXX
    vm_network:
      XX:XX:XX:aa:XX:XX:
        ipv6:
        - XX::XXX:XX:XXXX
        ipv4:
        - XXX.XX.XX.XX

例如,我想拥有类似的东西:

results.invocation.virtual_machines.ip_address
results.invocation.module_args.user_name

我尝试了各种方法,但都不起作用:)

最后一次尝试是这样的:

---
- name: demo how register works
  hosts: localhost
  tasks:
   - name: Include all .json and .jsn files in vars/all and all nested directories (2.3)
     include_vars: 
        file: test.yml
        name: vm

   - name: debug
     debug: 
        msg: " item.0.item "
     with_subelements:
       - " vm.results "
       - virtual_machines
     register: subelement


【问题讨论】:

我建议您查看learnxinyminutes.com/docs/yaml,以加深您的 YAML 语法知识。但基本上,当一个缩进级别以- 开头时,它是一个数组,当它以一个键(例如invocation)开头时,它就是一个对象。所以,resultsvirtual_machines 是数组,应该作为数组寻址:results.0.invocation.virtual_machines.0.ip_addressresults.0.invocation.module_args.user_name 【参考方案1】:

遵循您的结构并修复一些错误后:

results.invocation.virtual_machines.ip_addressresults[0].virtual_machines[0].ip_addressresults.invocation.module_args.user_nameresults[0].invocation.module_args.username

(results和virtual_machines是数组,写results[0]或者results.0是一样的)

所以一个剧本做工作的样本:

- name: vartest
  hosts: localhost

  tasks: 
    - name: Include all .json and .jsn files in vars/all and all nested directories (2.3)
      include_vars: 
          file: test.yml
          name: vm

    - name: ip
      set_fact:
        ipadress: " vm.results[0].virtual_machines[0].ip_address "

    - name: username
      set_fact:
        username: " vm.results[0].invocation.module_args.username "
    - name: display
      debug:
        msg: "ip:  ipadress   and username:  username "

结果:

ok: [localhost] => 
  msg: 'ip: XXX.XX.XX.XX  and username: DOMAIN\domain-user'

【讨论】:

谢谢,但这并不是我想要的。这个文件要大得多。我想循环浏览所有虚拟机的信息。 精确你的结构不清楚

以上是关于使用 ansible 访问字典文件的 yaml 列表的主要内容,如果未能解决你的问题,请参考以下文章

YAML基础语法-ansible使用ansible-playbook

Ansible之playbook的使用

Ansible之playbook的使用

Ansible playbook

05Ansible_YAML

使用 Ansible 替换 YAML 文件中的特定字符串