六、ansible批量管理服務介紹 (一)批量管理服務知識介紹 (二)批量管理服務特征介紹 (三)ansible軟體安裝部署 1 .ansible軟體自動化環境架構規劃 2 ansible軟體自動化部署條件 a .ssh密鑰對創建(管理主機,建議基於ssh密鑰方式建立遠程連接) b .分發公鑰文件( ...
六、ansible批量管理服務介紹
(一)批量管理服務知識介紹
a. ansible是一個基於Python開發的自動化運維工具
b. ansible是一個基於ssh協議實現遠程管理的工具
c. ansible軟體可以實現多種批量管理操作(批量系統配置、批量軟體部署、批量文件拷貝、批量運行命令)
saltstack puppet
(二)批量管理服務特征介紹
a ansible軟體服務端(管理端):不需要啟動任何服務 預設服務端不需要任何的配置
b ansible軟體客戶端(受控端):沒有客戶端軟體安裝
(三)ansible軟體安裝部署
1 .ansible軟體自動化環境架構規劃
管理主機1台:
10.0.0.61 m01
受控主機3台:
10.0.0.41 backup
10.0.0.31 nfs01
10.0.0.7 web01
Linux系統 6.9
2 ansible軟體自動化部署條件
a .ssh密鑰對創建(管理主機,建議基於ssh密鑰方式建立遠程連接)
ssh-keygen -t dsa
影響免交互創建密鑰對創建因素:
1)需要指定私鑰存放路徑
-f /root/.ssh/id_dsa
2)需要進行私鑰文件密碼設定
-N/-P
-N ""/-P ""
免交互創建密鑰對方法
ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
b .分發公鑰文件(管理主機進行分發)
ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31
影響免交互批量分發密鑰因素
1)需要有確認連接過程,需要輸入yes/no
-o StrictHostKeyChecking=no
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.31"
2)需要解決密碼問題
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31
Now try logging into the machine, with "ssh '172.16.1.31'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
免交互批量分發公鑰腳本:
#!/bin/bash
rm /root/.ssh/id_dsa
ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
for ip in 31 41 7
do
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip"
done
c .檢查是否可以進行基於密鑰遠程管理
ssh 172.16.1.31 uptime
免交互批量檢查測試腳本
#!/bin/bash
rm /root/.ssh/id_dsa
ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
for ip in 31 41 7
do
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip"
done
基於ssh口令方式建立遠程連接(也可以)
vim /etc/ansible/hosts
[oldboy]
172.16.1.7
172.16.1.31 ansible_user=root ansible_password=123456
172.16.1.41
ansible 172.16.1.31 -m command -a "hostname" -k --- 實現口令互動式遠程管理
SSH password:
172.16.1.31 | SUCCESS | rc=0 >>
nfs01
3 ansible軟體下載安裝
ansible管理主機軟體安裝:
yum install -y ansible
ansible受控主機軟體安裝:(可選)
yum install -y libselinux-python
4.ansible軟體受控主機添加配置
cat /etc/ansible/hosts
[oldboy]
172.16.1.7
172.16.1.31
172.16.1.41
(四)ansible軟體應用過程
ansible軟體模塊
ansible-doc -l|wc -l
1378
ansible 管理主機信息或者主機組信息 -m 模塊名稱 -a 相關模塊參數
主機信息:遠程主機IP地址 遠程主機組名稱 遠程所有主機all
-m 指定相應模塊
-a 利用模塊中某些參數功能
命令類型模塊:
第一個模塊:command
官方參考鏈接:http://docs.ansible.com/ansible/latest/modules/command_module.html
參數:chdir---在執行某個命令前,先切換目錄
[root@m01 ansible]# ansible 172.16.1.31 -m command -a "chdir=/tmp/ pwd"
172.16.1.31 | SUCCESS | rc=0 >>
/tmp
[root@m01 ansible]# ansible 172.16.1.31 -m command -a "chdir=/etc/ pwd"
172.16.1.31 | SUCCESS | rc=0 >>
/etc
參數:creates---判斷一個文件是否存在,如果已經存在了,後面的命令就不會執行
[root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf hostname"
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /etc/rsyncd.conf exists
[root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf.bak hostname"
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /etc/rsyncd.conf.bak exists
[root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.123456 hostname"
172.16.1.41 | SUCCESS | rc=0 >>
backup
參數:removes---判斷一個文件是否存在,如果不存在,後面的命令就不會執行
[root@m01 ansible]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.conf hostname"
172.16.1.41 | SUCCESS | rc=0 >>
backup
[root@m01 ansible]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.1212213123 hostname"
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /etc/rsyncd.1212213123 does not exist
參數(必須要有的):free_form---表示執行command模塊時,必須要有linux合法命令信息
ansible 172.16.1.41 -m command -a "ls"
172.16.1.41 | SUCCESS | rc=0 >>
1
anaconda-ks.cfg
dead.letter
heqing
第二個模塊:shell模塊(萬能模塊)
參數:chdir---在執行莫個命令前,先切換目錄
參數:creates---判斷一個文件是否存在,如果已經存在了,後面的命令就不會執行
參數:removes---判斷一個文件是否存在,如果不存在,後面的命令就不會執行
參數(必須要有的):free_form---表示執行command模塊時,必須要有linux合法命令信息
[root@m01 ansible]# ansible 172.16.1.41 -m shell -a "ls;pwd"
172.16.1.41 | SUCCESS | rc=0 >>
1
anaconda-ks.cfg
dead.letter
/root
說明:shell模塊可以滿足command模塊所有功能,並且可以支持識別特殊字元信息 < > | ;
第三個模塊:script---專門運行腳本模塊
參數:chdir---在執行莫個命令前,先切換目錄
參數:creates---判斷一個文件是否存在,如果已經存在了,後面的命令就不會執行
參數:removes---判斷一個文件是否存在,如果不存在,後面的命令就不會執行
參數(必須要有的):free_form---表示執行command模塊時,必須要有linux合法命令信息
文件類型模塊
第一個模塊:copy----複製模塊
參數:backup---對數據信息進行備份
[root@m01 ansible]# ansible 172.16.1.41 -m copy -a "src=/tmp/file01.txt dest=/tmp/ backup=yes"
172.16.1.41 | SUCCESS => {
"backup_file": "/tmp/file01.txt.71887.2018-04-02@23:33:19~",
"changed": true,
"checksum": "029b054db136cc36d5605e3818305825ff4b8ffb",
"dest": "/tmp/file01.txt",
"gid": 0,
"group": "root",
"md5sum": "434660b5ad7deeba8815349f71409405",
"mode": "0644",
"owner": "root",
"size": 6,
"src": "/root/.ansible/tmp/ansible-tmp-1522683197.05-52744169892601/source",
"state": "file",
"uid": 0
}
參數:src---定義要推送數據信息
參數:dest---定義將數據推送到遠程主機什麼目錄中
[root@m01 ansible]# touch /tmp/file01.txt
[root@m01 ansible]# ansible 172.16.1.41 -m copy -a "src=/tmp/file01.txt dest=/tmp/"
172.16.1.41 | SUCCESS => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/tmp/file01.txt",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1522682948.27-60532389065095/source",
"state": "file",
"uid": 0
}
[root@m01 ansible]# ansible 172.16.1.41 -m shell -a "ls -l /tmp/"
172.16.1.41 | SUCCESS | rc=0 >>
total 24
-rw-r--r-- 1 root root 0 Apr 2 23:29 file01.txt
參數:owner---設置複製後的文件屬主許可權
參數:group---設置複製後的文件屬組許可權
參數:mode---設置複製後的文件許可權(600 755)
第二個模塊:file----文件屬性修改/目錄創建/文件創建
參數:owner---設置複製後的文件屬主許可權
參數:group---設置複製後的文件屬組許可權
參數:mode---設置複製後的文件許可權(600 755)
ansible 172.16.1.41 -m file -a "dest=/tmp/file01.txt owner=oldboy group=oldboy mode=600"
172.16.1.41 | SUCCESS => {
"changed": true,
"gid": 500,
"group": "oldboy",
"mode": "0600",
"owner": "oldboy",
"path": "/tmp/file01.txt",
"size": 6,
"state": "file",
"uid": 500
}
參數:state---用於指定創建目錄或文件
創建文件
ansible 172.16.1.41 -m file -a "dest=/tmp/file01.txt state=touch"
172.16.1.41 | SUCCESS => {
"changed": true,
"dest": "/tmp/file01.txt",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"size": 0,
"state": "file",
"uid": 0
}
創建目錄:
ansible 172.16.1.41 -m file -a "dest=/tmp/dir01 state=directory"
172.16.1.41 | SUCCESS => {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/dir01",
"size": 4096,
"state": "directory",
"uid": 0
}
包管理模塊類型
模塊:yum---安裝軟體包模塊
name:執行要安裝軟體的名稱,以及軟體的版本
state:installed安裝 absent(卸載)
ansible 172.16.1.41 -m yum -a "name=iftop state=installed"
ansible 172.16.1.41 -m yum -a "name=iftop state=absent"
list:指定軟體名稱,查看軟體是否可以安裝,以及是否已經安裝過了
ansible 172.16.1.41 -m yum -a "list=iftop"
系統模塊類型
模塊:service---管理服務狀態模塊
name: 指定要管理的服務名稱(管理的服務一定在chkconfig中可以看到)
state:stopped started restarted reloaded
enabled:yes表示服務開機自啟動 no表示服務開機不要自動啟動
ansible 172.16.1.41 -m service -a "name=crond state=started enabled=yes"
cron---定時任務模塊
* * * * * /bin/sh /server/scripts/test.sh &>/dev/null
minute=0-59 * */n , - hour day month weekday job='/bin/sh /server/scripts/test.sh &>/dev/null'
添加定時任務
ansible 172.16.1.41 -m cron -a "minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'"
ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'"
#name,表示定時任務的名稱。
刪除定時任務
ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' state=absent"
ansible 172.16.1.41 -m cron -a "name=oldboy01 state=absent"
註釋定時任務
ansible 172.16.1.41 -m cron -a "name=oldboy01 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=yes"
ansible 172.16.1.41 -m cron -a "name=oldboy01 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=no"
總結ansible顏色信息:
綠色:查看遠程主機信息,不會對遠程主機系統做任何修改
紅色:執行操作出現異常錯誤
黃色:對遠程主機系統進行修改操作
粉色:警告或者忠告信息
(五) ansible軟體劇本
編寫劇本規範:
http://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
遵循pyyaml
①. - 用法說明,表示列表顯示的內容
水果信息:
- 蘋果
- 香蕉
- 西瓜
②. : 用法說明:
姓名: 張三
性別: 男
人員信息:
- 運維人員: sa
- 開發人員: dev
- 存儲人員: dba
③. 空格 用法說明:
對內容進行分級時,需要有兩個空格表示分級
軟體安裝步驟:
- 服務端安裝步驟:
第一個裡程碑: 檢查軟體是否安裝
第二個裡程碑: 編寫配置文件內容
- 客戶端安裝步驟:
補充:必須使用空格分隔ansible劇本級別,一定不要使用tab鍵進行分割
執行腳本方法:
ansible-playbook /etc/ansible/ansible-playbook/test.yaml
ansible-playbook -C /etc/ansible/ansible-playbook/test.yaml
--syntax-check:檢測yaml文件的語法。
-C:預測試,不會改變目標主機的任何設置。
--list-tasks:列出yaml文件的任務列表。
--list-hosts:列出yaml文件影響的主機列表。
--list-tags:列出yaml文件中的標簽。
-t TAGS:表示只執行指定標簽的任務。
--skip-tags=SKIP_TAGS:表示出了指定標簽的任務,執行其他任務。
--start-at-task=START_AT:從指定任務開始往下運行。
作業:
01. nfs服務一鍵化部署
02. inotify/sersync軟體一鍵化部署