Ansible中如何遍历字典并按顺序启动匹配的systemd服务
问题解决方法
你现有代码的核心问题是:lookup('dict', servers_as)返回的是servers_as字典的键值对集合,每个遍历项的item.value是对应key下的完整服务列表,你没有对这个服务子列表做二次遍历,同时调试代码里用整个字典的长度作为列表索引,逻辑完全错误,因此只能拿到单个元素而非全部服务。
另外注意:你定义的服务名称已经自带.service后缀,启动任务中不需要额外拼接后缀,否则会出现xxx.service.service的错误名称导致启动失败。
正确实现方式
方式一:先提取当前主机匹配的服务列表(可读性更高)
# 先筛选出当前主机对应的服务列表 - name: 获取当前主机匹配的服务列表 set_fact: current_host_services: "{{ servers_as | dict2items | selectattr('key', 'in', inventory_hostname) | map(attribute='value') | flatten | default([]) }}" # 调试输出所有服务名 - name: check output list debug: msg: "{{ item }}" loop: "{{ current_host_services }}" # 批量启动服务 - name: Start all services systemd: name: "{{ item }}" state: started loop: "{{ current_host_services }}"
以上写法已经自带筛选逻辑,当没有匹配当前主机的key时,loop会自动跳过执行,不需要额外加when判断。
方式二:直接在loop中写筛选逻辑(无需单独set_fact)
- name: Start all services systemd: name: "{{ item }}" state: started loop: "{{ servers_as | dict2items | selectattr('key', 'in', inventory_hostname) | map(attribute='value') | flatten | default([]) }}"
内容的提问来源于stack exchange,提问作者Andrew Ramnikov
相关产品推荐
相关产品推荐

