- 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的具體內容。