Solución:
Puedo hacerlo fácilmente usando comandos de shell que no son idempotentes
Realmente no puedes hablar de idempotencia, cuando estás preguntando el estado actual de una máquina.
“Idempontent” significa que la tarea garantizará que la máquina esté en el deseado indique sin importar cuántas veces ejecute una determinada tarea.
Cuando consulta el estado actual, no describe el estado deseado. No importa lo que haga, el método que utilice, el término “idempotente” simplemente no es aplicable.
Con respecto a su ejemplo, que no le da resultados, ha repetido dos veces el mismo argumento list
y la tarea debería fallar (no lo hace, lo que parece una peculiaridad de Ansible).
Para obtener una lista de los paquetes instalados, debe usar:
- name: yum_command
yum:
list=installed
register: yum_packages
- debug:
var: yum_packages
Guarda una lista de diccionarios que describen cada paquete en una variable yum_packages
.
Luego puede usar un filtro de consulta JSON para obtener un solo paquete (tar
):
- debug: var=item
with_items: "{{yum_packages|json_query(jsonquery)}}"
vars:
jsonquery: "results[?name=='tar']"
para obtener un resultado como este:
"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"
}
O solo su versión:
- debug: var=item
with_items: "{{yum_packages|json_query(jsonquery)}}"
vars:
jsonquery: "results[?name=='tar'].version"
"item": "1.26"
Desde Ansible 2.5, también puede utilizar el package_facts
módulo: recopilará la lista de paquetes instalados como hechos de Ansible.
Ejemplo de los documentos:
- name: get the rpm package facts
package_facts:
manager: rpm
- name: show them
debug: var=ansible_facts.packages