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