Я могу легко получить его за счет использования команд оболочки, которые не идемнотентные
Вы не можете говорить о идемпотентности, когда вы находитесь , запрашивая текущее состояние машины.
«Idempontent» означает, что задача будет гарантировать, что машина находится в желаемом состоянии независимо от того, сколько раз вы запускаете определенную задачу.
Когда вы запрашиваете текущее состояние, вы не описываете желаемое состояние. Независимо от того, что вы делаете, какой метод вы используете, термин «идемпотент» просто неприменим.
Что касается вашего примера, который не дает вам результаты - вы повторили дважды один и тот же аргумент list
и задача должна обязательно (это не так, что выглядит как причуда анзибль).
Чтобы получить список установленных пакетов, вы должны использовать:
- name: yum_command
yum:
list=installed
register: yum_packages
- debug:
var: yum_packages
Это сохраняет список словарей, описывающих каждый пакет переменной yum_packages
.
Вы можете использовать JSON Query Filter, чтобы получить один пакет (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"
Спасибо @techraf. Это выглядит хорошо. –