问题:我有许多需要软件包更新的节点。有些节点安装了这些软件包,有些则没有。 目标是 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只会在安装包时更新它。
答案 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