如何用Ansible仅列出可用安全补丁的名称?
我想用Ansible列出可用的安全补丁,但只需要获取补丁名称,期望输出类似:
name: python_patch33.21 name: java21.21.2
但执行任务后得到的是包含完整字段的结果:
16:10:47 [0;32m{'results': [{'envra': '0:kernel-3.10.0-1160.80.1.el7.x86_64', 'name': 'kernel', 'repo': 'rhui-rhel-7-server-rhui-rpms', 'epoch': '0', 'version': '3.10.0', 'release': '1160.80.1.el7', 'yumstate': 'available', 'arch': 'x86_64'}, {'envra': '0:python-perf-3.10.0-1160.80.1.el7.x86_64', 'name': 'python-perf', 'repo': 'rhui-rhel-7-server-rhui-rpms', 'epoch': '0', 'version': '3.10.0', 'release': '1160.80.1.el7', 'yumstate': 'available', 'arch': 'x86_64'}, {'envra': '0:tzdata-2022f-1.el7.noarch', 'name': 'tzdata', 'repo': 'rhui-rhel-7-server-rhui-rpms', 'epoch': '0', 'version': '2022f', 'release': '1.el7', 'yumstate': 'available', 'arch': 'noarch'}], 'failed': False, 'changed': False}[0m
当前使用的Ansible任务:
- yum: list: updates update_cache: true exclude: kernel* security: true register: yumoutput - name: Show result debug: msg: "{{ yumoutput.results }}"
请问如何修改任务以仅获取安全补丁的名称列表?
可以利用Ansible的Jinja2过滤器处理返回数据,只提取每个补丁的name字段,有两种输出格式可选:
1. 输出名称列表
如果只需要纯名称的列表形式,修改后的任务如下:
- yum: list: updates update_cache: true exclude: kernel* security: true register: yumoutput - name: Show security patch names debug: msg: "{{ yumoutput.results | map(attribute='name') | list }}"
2. 输出name: xxx格式
如果要匹配你示例中的键值对格式,可调整为:
- yum: list: updates update_cache: true exclude: kernel* security: true register: yumoutput - name: Show security patch names in desired format debug: msg: "name: {{ item }}" loop: "{{ yumoutput.results | map(attribute='name') | list }}"
关键说明
map(attribute='name'):从每个结果对象中提取name属性的值list:将map转换为标准列表格式- 第二种方案通过
loop遍历名称列表,直接拼接出你需要的name: xxx格式
内容的提问来源于stack exchange,提问作者WhoAmI

