#ansible
Вопрос:
Ансибль v2.11
Допустим, у меня есть словарь сервисов, которые я хочу либо запустить, либо остановить, вот так. Вы заметили, что последние 2 службы зависят от первой службы
exa_web_services:
EXA_Web:
description: "Exa Web service"
app_dir: "{{ exa_web_dir }}"
app_cmd: "{{ node_exe }}"
app_cmd_params: "app.js EXA_Web env={{ node_environment }} port=8080 ssl_port=8443"
dependency: "EXA_Redis_Cache"
EXA_Web_APIs:
description: "Exa Web APIs service"
app_dir: "{{ exa_web_dir }}"
app_cmd: "{{ node_exe }}"
app_cmd_params: "app.js EXA_Web_APIs env={{ node_environment }} port=8091 mode=api"
dependency: "EXA_Web"
EXA_Print_Service:
description: "Exa Print service"
app_dir: "{{ exa_web_dir }}"
app_cmd: "{{ node_exe }}"
app_cmd_params: "app_service.js SERVICE_NAME=PRINTSERVICE"
dependency: "EXA_Web"
Чтобы запустить службы, которые я делаю, которые запускают их в правильном порядке
- name: Start the services
win_service:
name: "{{ item.0 }}"
state: started
loop: "{{ exa_web_services.items() }}"
Однако, если я попытаюсь аналогичным образом остановить службы, это не удастся, так как сначала будет остановлена первая служба EXA_Web
, но у нее есть зависимости, последние 2 службы.
- name: Start the services
win_service:
name: "{{ item.0 }}"
state: stopped
loop: "{{ exa_web_services.items() }}"
Итак, как я могу выполнить цикл по словарю в обратном порядке, чтобы сначала остановить последние 2 службы EXA_Web
? Возможно ли это? Я знаю, что могу добавить force_dependent_serves: true
атрибут и покончить с этим.
Ответ №1:
Один из способов достичь этого-использовать dict2items
фильтр, а затем reverse
его.
Что-то вроде этого:
- name: stop the services
win_service:
name: "{{ item.key }}"
state: "stopped"
loop: "{{ exa_web_services | dict2items | reverse | list }}"
Комментарии:
1. Кстати, это сработало отлично, спасибо!