首页 > 解决方案 > 在 Ansible 中,可以反向循环遍历字典吗?

问题描述

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,但它有依赖关系,最后两个服务。

  - name: Start the services
    win_service:
      name: "{{ item.0 }}"
      state: stopped
    loop: "{{ exa_web_services.items() }}"

那么我怎样才能反向循环字典以便我首先停止最后两个服务EXA_Web呢?是否可以?我知道我可以添加force_dependent_serves: true属性并完成它。

标签: ansible

解决方案


我们可以实现这一点的一种方法是使用dict2items 过滤器,然后使用reverse它。

像这样的东西:

- name: stop the services
  win_service:
    name: "{{ item.key }}"
    state: "stopped"
  loop: "{{ exa_web_services | dict2items | reverse | list }}"

推荐阅读