我想通过Ansible获得redis-server
运行状态等服务。
我知道如何使用Ansible服务模块来停止或启动系统服务。但是我怎样才能获得当前的服务状态?
答案 0 :(得分:11)
您也可以使用service_facts模块。
使用示例:
- name: collect facts about system services
service_facts:
register: services_state
- name: Debug
debug:
var: services_state
示例输出:
...
TASK [Debug] ***************************************************************************************************************************************************************************************************************
ok: [local] => {
"services_state": {
"ansible_facts": {
"services": {
"cloud-init-local.service": {
"name": "cloud-init-local.service",
"source": "systemd",
"state": "stopped"
},
"firewalld.service": {
"name": "firewalld.service",
"source": "systemd",
"state": "stopped"
},
...
}
}
}
}
答案 1 :(得分:2)
将command
模块与service redis-server status
一起使用并解析标准输出。
或者使用patched服务模块。
答案 2 :(得分:1)
您通常不会使用Ansible执行此操作。 Ansible应该用于声明性地定义服务器的外观。
因此,您通常会执行以下操作:
- name: start redis
service:
name=redis-server
state=started
enabled=yes
你可以像这样有条件地做事:
- name: restart redis
service:
name=redis-server
state=restarted
enabled=yes
when: redis_config.changed
要在配置更改时重新启动Redis,但很少需要检查服务是否正在运行。
在绝对情况下,您确实需要检查服务是否正在运行(我强烈建议您再次考虑您的Ansible角色/剧本),那么您可以随时解决:
- name: check redis status
shell: service redis-service status
答案 3 :(得分:1)
只需使用service: name=httpd state=started
选项运行任务--check
即可。这告诉您,是否需要启动服务,这意味着它已关闭。如果任务没有显示任何变化,那么它已经上升。
示例服务已关闭,changed
为真,因为需要启动它:
$ ansible -m service -a 'name=rpc/bind state=started' --check host
host | SUCCESS => {
"changed": true,
"msg": "service state changed"
}
示例服务已启动,change
为false,因为无需执行此操作:
$ ansible -m service -a 'name=system-log state=started' --check host
host | SUCCESS => {
"changed": false,
"name": "system-log",
"state": "started"
}
答案 4 :(得分:1)
就个人而言,我喜欢使用某种支持Playbooks来获取我的环境中的服务状态,并能够重新启动它们等。
因此,我会在Konstantin Suvorov推荐的一侧使用命令模块,但另外我还会检查预期的端口以确保所有必需的端口都已启动并且我的服务按预期工作。 在您的情况下,这看起来如下:- name: verify redis-server service
command: /usr/sbin/sservice redis-server status
changed_when: false
- name: verify redis-server is listening on 6379
wait_for: port=6379 timeout=1
刚刚使用changed_when,因为命令模块将始终设置为true,尽管它只是一个只读命令。
答案 5 :(得分:1)
您可以通过ansible AD-HOC命令执行此操作:
$ansible all -m shell -a "service redis-server status"
答案 6 :(得分:0)
一个非常简短的程序,用于使用Ansible检查服务-
- name: checking service status
hosts: www.linuxfoundation.org
tasks:
- name: checking service status
command: systemctl status "{{ item }}"
with_items:
- firewalld
- httpd
- vsftpd
- sshd
- postfix
register: result
ignore_errors: yes
- name: showing report
debug:
var: result
答案 7 :(得分:0)
您可以说以下话:
ansible all -m shell -a "if ! systemctl is-active firewalld; then echo 'inactive' ; fi" -i inventory
答案 8 :(得分:0)
如果您的服务未启用 systemctl
/service
systemd 脚本。在我的情况下,我通过执行此命令手动启动 zookeeper 服务 /opt/zookeeper/bin/zkServer.sh start
把它变成ansible
- name: Start Zookeeper service
command: /opt/zookeeper/bin/zkServer.sh start
tags:
- start_zookeeper
- name: Validate whether zookeeper service is running or not
shell: netstat -plnt | grep $(ps -ef | grep zookeeper.server.quorum.QuorumPeerMain | grep -v "grep" | awk '{print $2}')
args:
executable: /bin/bash
register: zookeeper_port_status
retries: 5
delay: 3
until: zookeeper_port_status.stdout.find('{{zookeeper_port}}') != -1
tags:
- validate_zookeeeper_service
我正在使用 netstat
和 ps -ef
linux 命令检查 zookeeper 服务状态
如果zookeeper服务没有获取2181端口,那么第二个ansible模块(- name: Validate whether zookeeper service is running or not)
会在尝试5次后失败(retries: 5)
Zookeeper-Port {{zookeeper_port}}
我在清单文件中定义的变量