实例学习Ansible系列(18)服务管理的几种方式

孤者浪人 提交于 2019-12-26 19:34:57

Ansible中使用service等模块进行服务的管理,也可直接使用非幂等性的模块诸如shell等进行控制,这篇文章介绍常用的使用示例。

示例1: 使用service停止单个服务

比如停止etcd服务,示例如下

## stop etcd service
- name: stop etcd service
  service:
    name:  etcd
    state: stopped

示例2: 使用service停止多个服务

比如停止kubernetes的master相关的服务,示例如下

## stop kubernetes master service
- name: stop master service
  service:
    name: "{{ item }}"
    state: stopped
  with_items:
    - kube-scheduler
    - kube-controller-manager
    - kube-apiserver

示例3: 无视错误

如果当当前机器上不存在service文件时,可能会出现如下类似的错误信息

fatal: [localhost]: FAILED! => {"changed": false, "msg": "Could not find the requested service flanneld: host"}

这种情况下可以使用ignore_errors来对应,但是缺点在于错误不会消失,只会显示出来并无视

## stop flannel service
- name: stop flannel service
  service:
    name:  flanneld
    state: stopped
  ignore_errors: true

这个问题在如下的stackoverflow链接中也有类似的讨论,个人认为这并不算是一个XY问题,而且讨论问题是不是XY问题本身就很无聊。Ansible中虽然是基于状态的控制,但是Service不存在的这种情况是现实存在的情况,必须让已有的使用方式发生调整算不上一个好方法。

  • https://stackoverflow.com/questions/51765306/using-ansible-to-stop-service-that-might-not-exist

示例4: 使用shell或者command模块

使用shell或者command,结合脚本书写的一些小技巧(实际上就是将包含简单逻辑的内容写在一行,这种不推荐的做法在很久之前就存在,一直不被认可,一直顽强地存在着,比如既有模块无法满足需求或者写起来很麻烦时,这个至少就能用),比如可以使用如下示例方式:

## stop services
- name: stop services
  shell: "(! chkconfig kube-scheduler || systemctl stop kube-scheduler ) \
          && (! chkconfig kube-controller-manager || systemctl stop kube-controller-manager ) \
          && (! chkconfig kube-apiserver || systemctl stop kube-apiserver ) \
          && (! chkconfig etcd || systemctl stop etcd ) \
          && (! chkconfig flanneld || systemctl stop flanneld  ) \
          && (! chkconfig docker || systemctl stop docker )"

其他处理方式:

  • 方法1: service用于管理service文件已经存在的情况,在hosts部分进行切割,保证service文件不存在的情况此task不会执行
  • 方法2: 使用两个task来解决,前面一个task判断是否存在,后面一个task根据结果进行继续执行,但是这种方式也不是很建议,明显是按照脚本方式来写Ansible了
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!