Ansible:迭代结果返回值yum模块

时间:2017-10-05 17:38:12

标签: python dictionary ansible nested-lists

问题:我有许多需要软件包更新的节点。有些节点安装了这些软件包,有些则没有。 目标是 1.检查是否使用yum模块安装了软件包。 2.如果已安装软件包并且更新可用,则运行yum update

我知道这可以通过命令或shell轻松完成,但效率很低。

  tasks:
  - name: check if packages are installed
    yum: list="{{ item }}"
    with_items:
      - acpid
      - c-ares
      - automake
   register: packages


  - debug:
      var: packages

会产生 the results

我想要ansible做的是仅当yum:list看到包已安装并且从上面的结果中获得升级时才更新包。

我不确定使用yum模块是否可行。

快速简便的方法就是使用命令:

  tasks:
  - name: check if packages are installed
    command: yum update -y {{ item }}
    with_items:
      - acpid
      - c-ares 
      - automake

因为yum update package只会在安装包时更新它。

2 个答案:

答案 0 :(得分:0)

Ansible loops文档有section about using register in a loop

看一下debug任务的输出,您可以看到您的packages变量有一个名为results的密钥,其中包含with_items循环的结果在第一个任务中。大型结构如下所示:

{  
   "packages":{  
      "changed":false,
      "msg":"All items completed",
      "results":[  
         {  
            "item":"...",
            "results":[  

            ]
         },
         {  
            "item":"...",
            "results":[  

            ]
         }
      ]
   }
}

每个单独的结果都有一个键item,其中包含该结果的循环迭代器的值,以及一个results键,其中包含{{1}返回的包列表(可能为空) list模块的选项。

考虑到这一点,你可以像这样循环结果:

yum

- debug: msg: "{{ item.item }}" with_items: "{{ packages.results }}" when: item.results 条件仅匹配when操作返回非空结果的结果。

升级匹配包:

list

答案 1 :(得分:0)

export const loadState = (): AppState => { const userId = firebase.auth().currentUser?.uid; if (userId) { return firebase.database().ref('/users/' + userId).once('value').then(function(snapshot) { return snapshot.val() as AppState; }); } }; 模块仅在安装软件包后才更新。您可以使用ansible.builtin.yum:指令遍历项目列表,或者如果它是简短列表,则在任务块中声明变量,并使用yum模块对列表进行操作的能力。就像快速又脏的版本一样。

loop:

或者,甚至更简单:

- name: update a list of packages
  yum:
    name: "{{ packagelist }}"
    state: latest
  vars:
    packagelist:
      - acpid
      - c-ares 
      - automake

有更多示例可用,并且在此处定义了所有参数: Ansible Docs article about yum