**1.背景; **java
(1).實際運維過程當中不免出現大規模經過運維批量工具相似於ansible 進行遠程管理服務,相似啓動java 環境應用python
出現異常終止運行,沒法運行;web
**2.ansible 相關知識預熱;**spring
(1).ansible 自動化運維工具屬於非交互式登錄方式進行機器管理--(默認不加載bash 和系統env 環境變量)shell
(2).ansible 命令執行流程--->ansible master 執行--> 客戶端機器臨時家目錄路徑如:/home/ops/.ansible/tmp/ api
(3).如上目錄/home/ops/.ansible/tmp/AnsiballZ_command.py 新增臨時py 文件而後執行py文件->清理生成臨時腳本;bash
(4).ansible -vvv 查看執行過程;app
**3.應用場景;**運維
(1).第三方外包項目提供shell 腳本經過咱們發佈系統進行發佈-發佈部署階段使用了ansible-playbook 進行,第三方提供腳本以下;ide
#!/bin/bash APP_NAME="apie-0.0.1-SNAPSHOT.jar" case $1 in start) nohup java -Dfile.encoding=UTF-8 -jar ${APP_NAME} --spring.config.location=application-apicenter.yml --spring.profiles.active=none & echo ${APP_NAME} start! ;; stop) ps -ef| grep ${APP_NAME} |grep -v grep |awk '{print $2}' | sed -e "s/^/kill -9 /g" | sh - echo ${APP_NAME} stop! ;; restart) "$0" stop sleep 3 "$0" start ;; status) ps -aux | grep ${APP_NAME} | grep -v 'grep' ;; log) case $2 in debug) tail -f -n ${3-400} logs/debug.log ;; error) tail -f -n ${3-400} logs/error.log ;; *) echo "Example: services.sh log {debug|error}" ;; esac ;; *) echo "Example: services.sh [start|stop|restart|status]" ;; esac
(2).遠程執行腳本出現;
[ops@op ~]$ ansible -i 192.168.1.53, all -m shell -a "su - work -c '/chj/app/web_app/apiCenter/services-api.sh restart'" -b
172.21.204.53 | CHANGED | rc=0 >>
apiCenter-0.0.1-SNAPSHOT.jar stop!
apiCenter-0.0.1-SNAPSHOT.jar start!Error: Unable to access jarfile api-0.0.1-SNAPSHOT.jar
緣由分析:
1.ansible 執行腳本流程會在 /home/ops/.ansible/tmp/ 目錄下找 apiCenter-0.0.1-SNAPSHOT.jar 發現沒有此文件 故報錯; Unable to access jarfile api-0.0.1-SNAPSHOT.jar
(3).進行腳本改造;
#!/bin/bash CURDIR=$(cd $(dirname ${BASH_SOURCE[0]}); pwd ) #若是第一條語句順利執行,就執行pwd顯示當前目錄,並將結果賦值給變量「DIR」 cd $CURDIR APP_NAME="apiCenter-0.0.1-SNAPSHOT.jar" case $1 in start) nohup /usr/local/jdk/bin/java -Dfile.encoding=UTF-8 -jar ${APP_NAME} --spring.config.location=application-apicenter.yml --spring.profiles.active=none >> console.`date "+%FT%TZ"`.log 2>&1 & echo ${APP_NAME} start! ;; stop) ps -ef| grep ${APP_NAME} |grep -v grep |awk '{print $2}' | sed -e "s/^/kill -9 /g" | sh - echo ${APP_NAME} stop! ;; restart) "$0" stop sleep 3 "$0" start ;; status) ps -aux | grep ${APP_NAME} | grep -v 'grep' ;; log) case $2 in debug) tail -f -n ${3-400} logs/debug.log ;; error) tail -f -n ${3-400} logs/error.log ;; *) echo "Example: services.sh log {debug|error}" ;; esac ;; *) echo "Example: services.sh [start|stop|restart|status]" ;; esac
(4).改造後測試;
[ops@op-opsbmc-2-prod ~]$ ansible -i 192.168.1.53, all -m shell -a "su - work -c '/chj/app/web_app/apiCenter/services-apicenter.sh restart'" -b
192.168.1.53,| CHANGED | rc=0 >>
apiCenter-0.0.1-SNAPSHOT.jar stop!
apiCenter-0.0.1-SNAPSHOT.jar start!
(5).登錄機器查看進程;