此帖子的另一个问题是:如何访问嵌套dict值,特别是在ansible_facts.packages中?
我想确定主机上安装的软件的确切版本。如果它低于我的期望值,则需要从本地仓库通过RPM复制并更新。我很难弄清楚如何访问通过运行package_facts获得的嵌套字典。
我看到package_facts这样返回数据:
"msg": {
...
"NessusAgent": [
{
"arch": "x86_64",
"epoch": null,
"name": "NessusAgent",
"release": "es7",
"source": "rpm",
"version": "6.11.1"
}
],
...
这是我的剧本,试图将'version'的值存储在变量中...
- name: check installed software
package_facts:
manager: auto
- name: check installed version
set_fact:
sw_ver_installed: "{{ item.value.version }}"
with_dict: "{{ ansible_facts.packages['NessusAgent'] }}"
- name: debug - sw_ver_installed
debug:
var: sw_ver_installed
...失败,并显示以下错误:
“该任务包括带有未定义变量的选项。错误 was:'ansible.utils.unsafe_proxy.AnsibleUnsafeText对象'没有 属性'version
我尝试了一些变体,但由于相同或相似的错误而失败,或者转储了NessusAgent的整个k / v数据集。我正在阅读Ansible的documentation
中的简单dict示例答案 0 :(得分:1)
您不想要with_dict
,因为您使用packages["NessusAgent"]
会将其从dict[str, list[dict]]
变成list[dict]
。
仅基于特定结果 ,您不需要任何循环结构,只需进入列表并一次取出所需的属性即可:
set_fact:
sw_ver_installed: "{{ ansible_facts.packages['NessusAgent']
| map(attribute='version') | first }}"
或者,如果您肯定的话,该列表将始终包含一个准确的项目:
set_fact:
sw_ver_installed: "{{ ansible_facts.packages['NessusAgent'][0].version }}"