Loops 在特定值的可解析指令上循环

Loops 在特定值的可解析指令上循环,loops,dictionary,ansible,Loops,Dictionary,Ansible,使用ansible,在返回带有列出值的dict的项目列表上循环 基本上,我想检查一个dict的软件包,看看它们是否已安装,然后返回一条消息,任何丢失的软件包 迄今为止尝试的任何循环/with_dict组合都会返回各种错误,无法找到特定变量 当查询状态本身时,它会将完整输出放入每个包的{{pkg}}变量中 --- - name: Ansible tests playbook hosts: vms remote_user: root vars: pkgs: - yum

使用ansible,在返回带有列出值的dict的项目列表上循环

基本上,我想检查一个dict的软件包,看看它们是否已安装,然后返回一条消息,任何丢失的软件包

迄今为止尝试的任何循环/with_dict组合都会返回各种错误,无法找到特定变量

当查询状态本身时,它会将完整输出放入每个包的{{pkg}}变量中

---
- name: Ansible tests playbook
  hosts: vms
  remote_user: root
  vars:
    pkgs:
      - yum-utils
      - mariadb-libs
  tasks:
    - name: Check packages
      yum:
        list: "{{ item }}"
        disablerepo: '*'
      register: pkg
      loop: "{{ pkgs }}"
如果我然后简单地输出{{pkg.results}}的内容:

    - name: list
      debug:
        msg: "{{ item }}"
      loop: "{{ pkg.results }}"
我得到:

root@vm011:~/ovirt# ansible-playbook check.yml

PLAY [Ansible tests playbook] **************************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************************************
ok: [vm017.warp]

TASK [Check paclages] **********************************************************************************************************************************************************************
ok: [vm017.warp] => (item=yum-utils)
ok: [vm017.warp] => (item=mariadb-libs)

TASK [list] ********************************************************************************************************************************************************************************
ok: [vm017.warp] => (item=None) =>
  msg:
    changed: false
    failed: false
    invocation:
      module_args:
        allow_downgrade: false
        conf_file: null
        disable_gpg_check: false
        disable_plugin: []
        disablerepo: '*'
        enable_plugin: []
        enablerepo: null
        exclude: null
        install_repoquery: true
        installroot: /
        list: yum-utils
        name: null
        security: false
        skip_broken: false
        state: installed
        update_cache: false
        update_only: false
        validate_certs: true
    item: yum-utils
    results:
    - arch: noarch
      envra: 0:yum-utils-1.1.31-50.el7.noarch
      epoch: '0'
      name: yum-utils
      release: 50.el7
      repo: installed
      version: 1.1.31
      yumstate: installed
ok: [vm017.warp] => (item=None) =>
  msg:
    changed: false
    failed: false
    invocation:
      module_args:
        allow_downgrade: false
        conf_file: null
        disable_gpg_check: false
        disable_plugin: []
        disablerepo: '*'
        enable_plugin: []
        enablerepo: null
        exclude: null
        install_repoquery: true
        installroot: /
        list: mariadb-libs
        name: null
        security: false
        skip_broken: false
        state: installed
        update_cache: false
        update_only: false
        validate_certs: true
    item: mariadb-libs
    results:
    - arch: x86_64
      envra: 1:mariadb-libs-5.5.60-1.el7_5.x86_64
      epoch: '1'
      name: mariadb-libs
      release: 1.el7_5
      repo: installed
      version: 5.5.60
      yumstate: installed
如何将每个包的yumstate值安装到单独的变量中

例如,如果我尝试用

    - name: list
      debug:
        msg: "{{ item.yumstate }}"
      loop: "{{ pkg.results }}"
我得到:

fatal: [vm017.warp]: FAILED! =>
  msg: |-
    The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'yumstate'

您在pkg.results中正确循环,但在每个项目中,yumstate位于另一个results键下。你应使用:

- name: list
  debug:
    msg: "{{ item.results.yumstate }}"
  loop: "{{ pkg.results }}"
我在我的fedora上尝试了您的代码,并且两个包之一的结果具有列表值,因此item.results.yumstate无法工作:用于yum-utils的fedora响应:

对于mariadb libs,未找到任何包,响应为:

"item.results": []

希望这能有所帮助

你确实给我指明了正确的方向

- name: list 
debug: 
  msg: "Package {{ item.results[0].name }} is {{ item.results[0].yumstate }}"
loop: "{{ pkg.results }}"
使用{{item.results.yumstate}执行此技巧后,仍然返回一个错误

TASK [list] ********************************************************************************************************************************************************************************
fatal: [vm017.warp]: FAILED! =>
  msg: |-
    The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'yumstate'
添加[0]使我:


您可能需要考虑嵌套循环,也称为AA循环,包括如果您尝试奇特的事物。

TASK [list] ********************************************************************************************************************************************************************************
fatal: [vm017.warp]: FAILED! =>
  msg: |-
    The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'yumstate'
TASK [list] ********************************************************************************************************************************************************************************
ok: [vm017.warp] => (item=None) =>
  msg: Package yum-utils is installed
ok: [vm017.warp] => (item=None) =>
  msg: Package mariadb-libs is installed