检查Ansible是否存在服务

Eag*_*eak 35 centos ansible ansible-playbook

我有一个Ansible手册,用于将Java应用程序部署为init.d守护程序.

作为Ansible和Linux的初学者,我很难根据主机的状态有条件地在主机上执行任务.

也就是说,我有一些主机已经提供服务,并且在我做任何其他事情之前我想要停止它.然后可能会有新主机,但尚未提供服务.所以我不能简单地使用service: name={{service_name}} state=stopped,因为这将在新主机上失败.

我怎么能做到这一点?这是我到目前为止所拥有的:

  - name: Check if Service Exists
    shell: "if chkconfig --list | grep -q my_service;   then echo true;   else echo false; fi;"
    register: service_exists

# This should only execute on hosts where the service is present
  - name: Stop Service
    service: name={{service_name}} state=stopped
    when: service_exists
    register: service_stopped

# This too
  - name: Remove Old App Folder
    command: rm -rf {{app_target_folder}}
    when: service_exists

# This should be executed on all hosts, but only after the service has stopped, if it was present
  - name: Unpack App Archive
    unarchive: src=../target/{{app_tar_name}} dest=/opt
Run Code Online (Sandbox Code Playgroud)

Eag*_*eak 34

当然我也可以检查/etc/init.d中是否存在包装脚本.所以这就是我最终的结果:

  - name: Check if Service Exists
    stat: path=/etc/init.d/{{service_name}}
    register: service_status

  - name: Stop Service
    service: name={{service_name}} state=stopped
    when: service_status.stat.exists
    register: service_stopped
Run Code Online (Sandbox Code Playgroud)

  • @RyanTuck您链接的页面上没有列出`must_exist`参数.2.0正式发布. (10认同)
  • 是的,我回避了ignore_errors,因为我害怕由于错别字等造成的误报。另外,我试图说服我的团队投入资金使我们的配置管理自动化,并且不希望第一件事显示它们看起来像某种黑客。:) (4认同)

Aid*_*man 21

请参阅service_factsAnsible 2.5中的新模块.

- name: Populate service facts
  service_facts:
- debug:
    msg: Docker installed!
  when: "'docker' in services"
Run Code Online (Sandbox Code Playgroud)

  • 使用 `when: "'docker' in services"` 确实会失败——收集的事实使用全名 (`docker.service`) 而不是 `docker` 进行索引。可能与平台相关,但至少在 CentOS 上,事实仅使用全名。 (4认同)
  • [相关模块页面](/sf/ask/2122995451/)上有一个关于如何访问服务名称的重要注释,值得注意。考虑到这一点,我在 Ubuntu 上成功使用了: `when: ansible_facts.services['service-name.service'] is Defined` (4认同)

Flo*_*ian 7

如果"服务"模块可以处理"无法识别的服务"错误,那将是很好的.

这是我的方法,使用service命令而不是检查init脚本:

- name: check for apache
  shell: "service apache2 status"
  register: _svc_apache
  failed_when: >
    _svc_apache.rc != 0 and ("unrecognized service" not in _svc_apache.stderr)

- name: disable apache
  service: name=apache2 state=stopped enabled=no
  when: "_svc_apache.rc == 0"
Run Code Online (Sandbox Code Playgroud)
  • 检查"服务状态"的退出代码,并在输出包含"无法识别的服务"时接受退出代码0
  • 如果退出代码为0,则安装该服务(已停止或正在运行)


dar*_*ing 7

我修改了Florian的答案,使其仅使用service命令的返回码(这在Mint 18.2上有效)

- name: Check if Logstash service exist
  shell: service logstash status 
  register: logstash_status
  failed_when: not(logstash_status.rc == 3 or logstash_status.rc == 0)

- name: Check if Logstash service exist
  service:
    name: logstash
    state: stopped 
  when: logstash_status.rc == 0
Run Code Online (Sandbox Code Playgroud)