将变量 stdout 拆分成行并循环使用另一个列表中的项目

问题描述 投票:0回答:1

我正在编写 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('.*') }}.*")

任何人都可以帮助我将标准输出数据转换为可用的内容,以便我可以循环它以查找匹配的项目/甚至建议更好的方法吗?

ansible
1个回答
-1
投票

首先构建搜索模式并将其输送到扩展的 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 "
]
}
© www.soinside.com 2019 - 2024. All rights reserved.