如何通过Ansible获得服务状态?

时间:2016-08-09 10:07:20

标签: ansible

我想通过Ansible获得redis-server运行状态等服务。

我知道如何使用Ansible服务模块来停止或启动系统服务。但是我怎样才能获得当前的服务状态?

9 个答案:

答案 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

我正在使用 netstatps -ef linux 命令检查 zookeeper 服务状态

如果zookeeper服务没有获取2181端口,那么第二个ansible模块(- name: Validate whether zookeeper service is running or not)会在尝试5次后失败(retries: 5)

Zookeeper-Port {{zookeeper_port}}我在清单文件中定义的变量