我有一个任务,检查下面主机列表上的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