Ansible:如何在嵌套变量上获取特定变量

时间:2020-06-03 13:39:07

标签: ansible

我试图弄清楚如何只获取特定的var,并在嵌套/复杂的var中获取其值

我的角色角色是 default / main.yml

disk_additional_disks:
   - disk: "/dev/sdb"
     fstype: xfs
     mount_options: rw,nodev,noatime,nobarrier,inode64
     mount: "{{ gp_data_mount_point }}"
     vgname: "{{gp_lvm_vg_name }}"

   - disk: "/dev/sdc"
     fstype: xfs
     mount_options: rw,nodev,noatime,nobarrier,inode64
     mount: "{{ gp_data_mount_point }}"
     vgname: "{{gp_lvm_vg_name }}"

   - disk: "/dev/sdd"
     fstype: xfs
     mount_options: rw,nodev,noatime,nobarrier,inode64
     mount: "{{ gp_data_mount_point }}"    
     vgname: "{{gp_lvm_vg_name }}"

我正在尝试仅获取disk/dev/sdb/dev/sdc的值{p}

并创建了一本可打印成一行的剧本

/dev/sdd

假设输出为:

- name: Show  disk
  debug:
     msg: "{{ item| json_query('[].disk') }}" 
  with_items: "{{ disk_additional_disks }}"    

'/dev/sdb','/dev/sdd','/dev/sdc'

有人在帮助我,因为我真的很难解决这个问题。

我也研究过类似的问题,但我想使用剧本来实现

2 个答案:

答案 0 :(得分:0)

您可以查看有关嵌套变量循环here的相关文档。

角色默认情况下不会向剧本公开默认变量。您可以查看以下线程以获取更多信息:thread1thread2

@VladimirBotka指出,您可以通过将const comperator = (search, filter) => filter._id === search._id && filter.name === search.name; const myData$ = combineLatest(search$, filter$).pipe( map(([search, filter]) => intersectionWith(search, filter, comperator)) ); 参数与public: true一起使用来公开它们。

但是,如果您想对其进行硬编码,则可以使用include_role将它们明确包含在您的剧本中。这是documentation

include_vars

答案 1 :(得分:0)

使用 map json_query 。以下两个任务给出相同的结果

    - debug:
        msg: "{{ disk_additional_disks|
                 map(attribute='disk')|
                 list }}"
    - debug:
        msg: "{{ disk_additional_disks|
                 json_query('[].disk') }}"

(json_query需要安装JMESPATH)。