我可以轻松地通过使用不是幂等的shell命令来实现它
当您查询机器的当前状态时,您无法真正谈论幂等性.
"Idempontent"意味着无论您执行某项任务多少次,任务都将确保机器处于所需状态.
查询当前状态时,不会描述所需的状态.无论你做什么,使用什么方法,术语"幂等"都不适用.
关于你的例子,它没有给你结果 - 你重复两次相同的参数list
,任务应该失败(它没有,这看起来像一个Ansible怪癖).
要获取已安装软件包的列表,您应该使用:
- name: yum_command yum: list=installed register: yum_packages - debug: var: yum_packages
它将描述每个包的字典列表保存到变量中yum_packages
.
然后,您可以使用JSON查询过滤器来获取单个包(tar
):
- debug: var=item with_items: "{{yum_packages|json_query(jsonquery)}}" vars: jsonquery: "results[?name=='tar']"
得到这样的结果:
"item": { "arch": "x86_64", "epoch": "2", "name": "tar", "nevra": "2:tar-1.26-31.el7.x86_64", "release": "31.el7", "repo": "installed", "version": "1.26", "yumstate": "installed" }
或仅限其版本:
- debug: var=item with_items: "{{yum_packages|json_query(jsonquery)}}" vars: jsonquery: "results[?name=='tar'].version"
"item": "1.26"
从Ansible 2.5开始,您还可以使用该package_facts
模块:它将收集已安装软件包的列表作为Ansible事实。
来自文档的示例:
- name: get the rpm package facts package_facts: manager: rpm - name: show them debug: var=ansible_facts.packages