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了
来源:CSDN
作者:liumiaocn
链接:https://blog.csdn.net/liumiaocn/article/details/103708346