- name: 查看进程中是否存在启动的服务
shell: "cd {{ SERVER_HOME }}/{{ SERVER }} && sh sh.sh status"
register: result
changed_when: false
failed_when: result.stdout.find('not') != -1
正文
部署有一个需求,要将所有的模块服务器里添加一个叫agentmizar的日志采集模块。但是有一些服务器提前有部署过,那么判断一下如果服务器里有此进程就跳过,如果没有此进程就传包并修改配置文件然后启动。
与playbook搭配的yaml内容如下:
1
|
- hosts: all
|
这个yaml,我执行ps -aux | grep agent
,并将结果存储到result
这个register
里。然后从register
里去find关键字agent.conf
,如果不存在就返回-1,那么可以判断当前机器里没有agentmizar进程。
如果说进程是一个守护进程,那么在判断进程(比如是systemctl status apache2)是否存在可以这么写:
1
|
- name: Check if Apache is running
|
注意!如果when条件判断句中有变量的话要将用()来括变量,如下:
1
|
when: ansible_default_ipv4.address == {{ ETCD_NODE03 }} #错误写法
|
再注意!register
变量的命名不能用-(中横线),比如dev-sda6_result
,则会被解析成sda6_result
,dev会被丢掉!
yum一次性安装多个模块的问题
新版本的ansible-playbook已经不支持在yum安装多个模块里使用的方式了,也就是说
1
|
tasks
|
这么写在老版本还OK,但是在2.8以后,还这么写就会有错误:[DEPRECATION WARNING]: Invoking "yum" only once while using a loop via squash_actions is deprecated. Instead of using a loop to supply multiple items and specifying name: "", please use name: ['unzip', 'psmisc', 'java-1.8.0-openjdk*'] and remove the loop. This feature will be removed in version 2.11. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg
.要改成如下:
1
|
tasks:
|
如何在task之间传递变量
某个变量想从一个task给另一个,可以按照如下的方式写:
1
|
---
|
第一个shell执行完后,使用register获取数据到info里,info是一个key value字典,debug输出info.stdout的具体内容。