我正在编写 Ansible 剧本,旨在动态检查指定软件包列表的可用升级。
我首先检查可用包列表并注册一个变量来做到这一点:
name: Record Available Updates
command: "dnf list updates"
register: available_updates
ignore_errors: yes
args:
warn: false
when: server_role != 'n/a'
此命令的标准输出有点混乱:
TASK [foreman-patching/check-major-package-upgrades : Display all available packages] ***
ok: [dcb-zabbix.REDACTED.local] => {
"msg": "Updating Subscription Management repositories.\nPowerTools x86_64 os 54 kB/s | 2.6 kB 00:00 \nextras x86_64 os 39 kB/s | 1.8 kB 00:00 \nEPEL 8 46 kB/s | 2.3 kB 00:00 \nBaseOS x86_64 os 51 kB/s | 2.3 kB 00:00 \nNGINX Official RHEL 8 32 kB/s | 1.5 kB 00:00 \nHighAvailability x86_64 os 50 kB/s | 2.3 kB 00:00 \nAppStream x86_64 os 58 kB/s | 2.6 kB 00:00 \nZabbix 6.0 RH 8 28 kB/s | 1.5 kB 00:00 \nMariaDB Centos 8 43 kB/s | 2.0 kB 00:00 \nElastic / Beats Alma 8 30 kB/s | 1.5 kB 00:00 \nManual NonRepo RPMs Alma 8 34 kB/s | 1.5 kB 00:00 \nAvailable Upgrades\ncronie.x86_64 1.5.2-8.el8.alma.1 REDACTED_Alma_8_BaseOS_x86_64_os\ncronie-anacron.x86_64 1.5.2-8.el8.alma.1 REDACTED_Alma_8_BaseOS_x86_64_os\nzabbix-agent.x86_64 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 \nzabbix-apache-conf.noarch 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 \nzabbix-get.x86_64 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 \nzabbix-java-gateway.x86_64 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 \nzabbix-selinux-policy.x86_64 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 \nzabbix-sender.x86_64 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 \nzabbix-server-mysql.x86_64 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 \nzabbix-sql-scripts.noarch 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 \nzabbix-web.noarch 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 \nzabbix-web-deps.noarch 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 \nzabbix-web-mysql.noarch 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 "
}
但是如果我用换行符分割( ):
TASK [foreman-patching/check-major-package-upgrades : Display all available packages] ***
ok: [dcb-zabbix.REDACTED.local] => {
"msg": [
"Updating Subscription Management repositories.",
"PowerTools x86_64 os 54 kB/s | 2.6 kB 00:00 ",
"extras x86_64 os 39 kB/s | 1.8 kB 00:00 ",
"EPEL 8 46 kB/s | 2.3 kB 00:00 ",
"BaseOS x86_64 os 51 kB/s | 2.3 kB 00:00 ",
"NGINX Official RHEL 8 32 kB/s | 1.5 kB 00:00 ",
"HighAvailability x86_64 os 50 kB/s | 2.3 kB 00:00 ",
"AppStream x86_64 os 58 kB/s | 2.6 kB 00:00 ",
"Zabbix 6.0 RH 8 28 kB/s | 1.5 kB 00:00 ",
"MariaDB Centos 8 43 kB/s | 2.0 kB 00:00 ",
"Elastic / Beats Alma 8 30 kB/s | 1.5 kB 00:00 ",
"Manual NonRepo RPMs Alma 8 34 kB/s | 1.5 kB 00:00 ",
"Available Upgrades",
"cronie.x86_64 1.5.2-8.el8.alma.1 REDACTED_Alma_8_BaseOS_x86_64_os",
"cronie-anacron.x86_64 1.5.2-8.el8.alma.1 REDACTED_Alma_8_BaseOS_x86_64_os",
"zabbix-agent.x86_64 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 ",
"zabbix-apache-conf.noarch 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 ",
"zabbix-get.x86_64 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 ",
"zabbix-java-gateway.x86_64 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 ",
"zabbix-selinux-policy.x86_64 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 ",
"zabbix-sender.x86_64 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 ",
"zabbix-server-mysql.x86_64 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 ",
"zabbix-sql-scripts.noarch 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 ",
"zabbix-web.noarch 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 ",
"zabbix-web-deps.noarch 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 ",
"zabbix-web-mysql.noarch 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 "
]
}
我希望能够使用名为 的子列表中的每个项目循环访问此变量的内容,并返回任何匹配的行:
services[server_role].packages
它以以下结构保存数据以提高可见性:
services:
zabbix:
packages:
- 'zabbix-server'
- 'zabbix-agent'
- 'httpd'
- 'MariaDB-server'
我可以毫无问题地循环这些,例如:
- name: Display major packages list
debug:
msg: "{{ item }}"
loop: "{{ services[server_role].packages }}"
但我似乎无法将 available_updates 的输出转换为可行的格式以便能够比较/循环。
我尝试了多种不同的方法,都尝试直接循环 available_updates.stdout.split(' ') 原位,并且还尝试首先将其转换为列表,但即使尝试拆分为列表也会给我带来错误。
我尝试过的许多事情中的一些:
- name: Convert available_updates.stdout into a list
set_fact:
updates_list: "{{ available_updates | split(',') }}"
- name: Display matching available updates
debug:
msg: "{{ line }}"
loop: "{{ available_updates.stdout.split('\n') }}"
when: "{{ line.split(' ')[0] }}" in services[server_role].packages
- name: Display matching available updates
debug:
msg: "{{ line }}"
loop: "{{ available_updates.stdout.split('\n') }}"
loop_control:
loop_var: line
when: services[server_role].packages is defined and line is match(".*{{ services[server_role].packages | join('.*') }}.*")
任何人都可以帮助我将标准输出数据转换为可用的内容,以便我可以循环它以查找匹配的项目/甚至建议更好的方法吗?
首先构建搜索模式并将其输送到扩展的 grep 中,找到了一个更简单的替代方案:
name: Get list of updates for specified packages
shell: "dnf list updates | grep -Ei '{{ package_string }}'"
register: updates_output
vars:
package_string: "{{ services[server_role].packages | join('|') }}"
- name: Display all available packages
debug:
msg: "{{ updates_output.stdout.split('\n') }}"
给我输出:
TASK [foreman-patching/check-major-package-upgrades : Display all available packages] ***
ok: [dcb-zabbix.REDACTED] => {
"msg": [
"zabbix-agent.x86_64 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 ",23
"zabbix-server-mysql.x86_64 6.0.28-release1.el8 REDACTED_Alma_8_Zabbix_6_0_RH_8 "
]
}