Ansible:确定主机上安装的软件的确切版本

时间:2019-10-01 02:18:22

标签: dictionary ansible

此帖子的另一个问题是:如何访问嵌套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示例

1 个答案:

答案 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 }}"