按任务过滤访问正在播放的主机



我有一个任务,检查下面主机列表上的redis服务状态

- hosts: 192.168.0.1, 192.168.0.2, 192.168.0.3
tasks:
- command:
cmd: service redis-server status
register: result
- debug:
var: result

检查后,我需要访问不存在服务的主机。

并且它们应该可以作为变量访问,以便在接下来的任务中继续使用它们。

有人能帮帮我吗?

与Ansible facts类似,也可以收集service_facts。在示例

- name: Set facts SERVICE
set_fact:
SERVICE: "redis-server.service"
- name: Gathering Service Facts
service_facts:
- name: Show ansible_facts.services
debug:
msg:
- "{{ ansible_facts.services[SERVICE].status }}"

如果你想在不知道服务状态的情况下执行任务,可以使用条件语句检查服务的状态。

如果当时没有安装服务,则不会定义特定的变量(密钥)。您将基于变量执行条件语句,然后

when: ansible_facts.services[SERVICE] is defined
when: ansible_facts.services['redis-server.service'] is defined

还建议使用Ansibleservice模块在服务上执行任务

- name: Start redis-server, if not started
service:
name: redis-server
state: started

而不是使用command模块。

其他相关服务Q&A

  • 如何在Ansible剧本中使用service_facts模块检查服务是否存在并且未安装在服务器上?
  • Ansible:如何启动停止服务?
  • Ansible:如何禁用但运行的服务?
  • 如何只列出ansible_facts正在运行的服务?

终于找到了完美匹配的解决方案。

- name: Check that redis service exists
systemd:
name: "redis"
register: redis_status
changed_when: redis_status.status.ActiveState == "inactive"
- set_fact:
_dict: "{{ dict(ansible_play_hosts|zip(
ansible_play_hosts|map('extract', hostvars, 'redis_status'))) }}"
run_once: true
- set_fact:
_changed: "{{ (_dict|dict2items|json_query('[?value.changed].key'))| join(',') }}"
run_once: true

最新更新