В Ансибле можно ли сделать цикл над дисковод в обратном порядке?

#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. Кстати, это сработало отлично, спасибо!