前幾天由於工作上的事耽誤了幾天,特來追加更新
第1章 ansible軟件概念說明
python語言是運維人員必會的語言,而ansible是一個基於Python開發的自動化運維工具 (saltstack)。其功能實現基於SSH遠程連接服務;ansible可以實現批量系統配置、批量軟件部署、批量文件拷貝、批量運行命令等功能
ansible軟件相關參考鏈接信息:
http://docs.ansible.com/ansible/intro_installation.html http://www.ansible.com.cn/ http://docs.ansible.com/modules_by_category.html http://www.ansible.cn/docs/
1.1 軟件特點概述
01.不需要單獨安裝客戶端(no agents),基於系統自帶的sshd服務,sshd就相當於ansible的客戶端
02.不需要服務端(no servers)
03.需要依靠大量的模塊實現批量管理
04.配置文件/etc/ansible/ansible.cfg(無需配置)
1.2 企業級生產場景批量管理-自動化管理方案
01.最簡單/最常用/最強大的選擇是ssh key+shell/pssh方案,一般中小型企業會用(50-100台以下規模企業)
a.利用ssh key執行命令,並將命令放在腳本里面
b.利用ssh key執行命令,將命令放在腳本里面,並加上相應循環語句或判斷語句
02.sina cfengine/puppet較早的批量管理工具(現在基本上沒有企業用)
03.門戶級別比較流行的,puppet批量管理工具(復雜/笨重)
04.saltstack批量管理工具;特點:簡單,功能強大(配置復雜)---趕集網/小米/ CDN公司
批量管理路線:ssh key-->cfengine-->puppet-->saltstack/ansible
注意:使用ansible軟件的前提是ssh key公鑰分發完成
1.3 實現集群規模架構一鍵部署自動化-步驟說明
01.5台服務器先配置好(kickstart,cobbler無人值守安裝),高級實現雲計算(按需分配,動態調整)-openstack,kvm
02.linux基本優化,包括ssh服務(可以自動化實現)
03.創建密鑰信息(自動化免交互創建)
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
04.進行批量分發密鑰(sshpass,expect自動化實現)
05.ansible軟件安裝(自動化實現)
06.網絡服務自動化安裝(ansible實現)
搭建yum倉庫,定制rpm包
第2章 ansible軟件實踐部署
ansible軟件部署安裝需求
01. 需要有epel源
系統yum源(base epel--pip gem)
sshpass---epel
02. ssh+key免密碼環境必須部署完成
2.1 ansible地址規划
服務器名稱 |
網卡eth0 |
網卡eth1 |
用途說明 |
m01 |
10.0.0.61 |
172.16.1.61 |
批量管理服務器 |
nfs01 |
10.0.0.31 |
172.16.1.31 |
nfs共享存儲服務器 |
backup |
10.0.0.41 |
172.16.1.41 |
rsync備份服務器 |
web01 |
10.0.0.8 |
172.16.1.8 |
web服務器 |
說明:無特殊說明,子網掩碼均為255.255.255.0,一個C類網段254台機器規模 |
2.2 ①部署ssh+key免密碼登錄方式
利用非交互式工具實現批量分發公鑰與批量管理服務器
1 sshpass -p123456 ssh-copy-id -i ~/.ssh/id_dsa.pub "-o StrictHostChecking=no 172.16.1.41" 2 sshpass -p123456 ssh -o StrictHostChecking=no root@172.16.1.41 "uptime" 3 sshpass -p123456 scp -o StrictHostChecking=no /etc/hosts root@172.16.1.41:~ 4 5 <- -p:指定ssh連接用戶的密碼 6 <- -o:StrictHostChecking=no 避免第一次登錄出現公鑰檢查
2.3 ②受控端安裝ansible相關管理軟件
保留yum安裝的軟件
1 sed -i.bak 's#keepcache=0#keepcache=1#g' /etc/yum.conf 2 grep keepcache /etc/yum.conf
客戶端配置
1 yum install libselinux-python -y
說明:由於初始我們關閉了selinux安全管理軟件,故這里需要操作此步驟。不裝這個軟件只能關閉selinux,但是無論什么情況也不要開啟,工作環境下視情況而定
2.4 ③管理端m01安裝ansible軟件
1 yum install ansible -y
2.4.1 查看版本信息
1 [root@m01 ~]# ansible --version 2 ansible 2.3.2.0 3 config file = /etc/ansible/ansible.cfg #告知ansible軟件配置文靜路徑 4 configured module search path = Default w/o overrides 5 python version = 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]
2.4.2 查看軟件相關安裝信息
1 [root@m01 ~]# rpm -ql ansible|egrep -v '/usr/share/|/usr/lib' 2 /etc/ansible 3 /etc/ansible/ansible.cfg #ansible配置文件 4 /etc/ansible/hosts #定義ansible可以管理的主機信息 5 /etc/ansible/roles #主要在自動化部署多台主機時應用 6 7 /usr/bin/ansible 8 /usr/bin/ansible-playbook #執行ansible劇本命令
2.4.3 軟件安裝目錄信息
1 [root@m01 ~]# tree /etc/ansible/
2 /etc/ansible/
3 ├── ansible.cfg #ansible配置
4 ├── hosts #被ansible管理的主機名單(分組)
5 └── roles
2.5 ④配置/etc/ansible/hosts文件
編輯ansible的主機配置文件hosts,添加主機組banana
1 cp /etc/ansible/hosts{,.bak} 2 3 [root@m01 ~]# vim /etc/ansible/hosts #配置文件編寫舉例 4 [banana] #定義組名稱 5 172.16.1.8 6 172.16.1.31 7 172.16.1.41 8 [root@m01 ~]# tail /etc/ansible/hosts
2.6 ⑤實踐測試
1 [root@m01 ~]# ansible banana -m command -a "hostname" #-m指定命令的模塊 -a指定參數(action) 2 172.16.1.31 | SUCCESS | rc=0 >> #主機IP|請求狀態|返回值(0即成功,否則失敗) 3 nfs01 #命令輸出結果 4 5 172.16.1.8 | SUCCESS | rc=0 >> 6 web01 7 8 172.16.1.41 | SUCCESS | rc=0 >> 9 backup
2.6.1 ansible命令輸出信息說明
輸出內容為綠色,表示執行成功,僅查詢但沒有發生任何改變
輸出內容為黃色,表示執行成功,但對受控主機產生了影響,發生了配置改變
輸出內容為紅色:表示執行失敗!!!
第3章 ansible有關語法參數總結
3.1 語法格式圖示
3.2 軟件常用參數表
命令參數 |
參數說明 |
-m MODULE_NAME |
相應名稱的模塊被執行(默認模塊為command); -m后面是模塊的的名字 |
-a MODULE_ARGS |
模塊參數信息; -a后面是要執行的命令,也可以寫一個IP,針對一台機器來執行命令 |
-C,--check |
不做任何改變;反而,只是嘗試預言一些可能出現的改變 |
--syntax-check |
執行語法檢查在劇本上,但是並不執行劇本 |
第4章 ansible常用模塊總結
常見模塊 |
模塊說明 |
command(重要模塊) |
執行命令模塊,ansible命令執行默認模塊 |
shell(重要模塊) |
執行shell腳本模塊 |
script(重要模塊) |
把腳本發到客戶端然后執行;執行腳本命令在遠程服務器上 |
copy(重要模塊) |
把本地文件發送到遠端 |
file |
設定文件屬性模塊 |
service |
系統服務管理模塊 |
cron |
計划任務管理模塊 |
yum |
yum軟件包安裝管理模塊 |
synchronize |
使用rsync同步文件模塊 |
mount |
掛載模塊 |
ansible幫助信息系統中查看方法:ansible-doc -l <-查看全部模塊列表信息 ansible-doc -s [模塊] <-查看指定模塊用法參數信息 |
4.1 ping模塊
1 [root@m01 ~]# ansible banana -m ping 2 172.16.1.41 | SUCCESS => { 3 "changed": false, 4 "ping": "pong" 5 } 6 7 172.16.1.31 | SUCCESS => { 8 "changed": false, 9 "ping": "pong" 10 }
說明:ansible連接測試成功結果
1 ansible 172.16.1.8 -m ping 2 3 172.16.1.8 | UNREACHABLE! => { 4 "changed": false, 5 "msg": "Failed to connect to the host via ssh: Permission denied (publickey,password).\r\n", 6 "unreachable": true 7 }
說明:ansible連接測試不成功結果
模塊概要:
a.ping是一個簡單的測試模塊,這個模塊在成功連接時返回"pong"信息。在劇本中沒有意義,但能夠使用ansible命令驗證登錄能力和用於python的配置
b.這並不是傳統的ICMP ping,而是先檢查是否通過ssh登錄節點,在檢查python版本是否滿足要求,能滿足要求就返回pong
連接正常返回pong通過幫助信息可以獲得: ansible-doc -v ping 可以獲得該模塊的說明 ansible-doc -s file 參看模塊的具體信息
實例:
1 [root@m01 ~]# ansible-doc -v ping 2 Using /etc/ansible/ansible.cfg as config file 3 > PING (/usr/lib/python2.6/site-packages/ansible/modules/system/ping.py) 4 5 A trivial test module, this module always returns `pong' on successful contact. It does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify the ability to login and that a usable python is configured. This is NOT ICMP ping, this is just a trivial test module.
4.2 command模塊
常見模塊 |
模塊說明 |
chdir |
在執行命令之前,通過cd命令進入到指定目錄中 ansible banana -m command -a "chdir=/tmp ls" |
create |
定義一個文件是否存在,如果不存在運行相應命令;如果存在跳過此步驟 |
executable |
改變shell使用command進行執行,並且執行時要使用絕對路徑 |
free_form |
命令模塊采用自由形式命令運行;即可以輸入任意linux命令 |
removes |
定義一個文件是否存在,如果存在運行相應命令;如果不存在跳過此步驟 |
warn |
如果ansible配置文件中定義了命令警告,如果參數設置了no/false,將不會警告此行命令 |
實例01.
1 [root@m01 ~]# ansible all -m command -a "date" 2 172.16.1.8 | SUCCESS | rc=0 >> 3 Thu Oct 19 17:12:27 CST 2017 4 5 172.16.1.31 | SUCCESS | rc=0 >> 6 Thu Oct 19 17:12:28 CST 2017 7 8 172.16.1.41 | SUCCESS | rc=0 >> 9 Thu Oct 19 17:12:27 CST 2017
實例02.
1 [root@m01 ~]# ansible banana -m command -a "chdir=/tmp pwd" 2 172.16.1.31 | SUCCESS | rc=0 >> 3 /tmp 4 5 172.16.1.8 | SUCCESS | rc=0 >> 6 /tmp 7 8 172.16.1.41 | SUCCESS | rc=0 >> 9 /tmp
實例03.
1 [root@m01 ~]# ansible banana -m command -a "pwd creates=/tmp/banana_file" 2 3 172.16.1.31 | SUCCESS | rc=0 >> 4 skipped, since /tmp/banana_file exists 5 6 172.16.1.8 | SUCCESS | rc=0 >> 7 /root 8 9 172.16.1.41 | SUCCESS | rc=0 >> 10 /root
模塊概要:
a.命令模塊中的多個參數設置用空格進行分割
b.命令模塊中不能出現 "<", ">", "|", ";" and "&",如需使用這些功能,可用shell模塊
提示:command模塊作為默認模塊,在-m不指定具體模塊時,即采用默認模塊command
4.3 debug模塊
msg:設置打印自定義消息;如果忽略,則打印通用信息
1 [root@m01 ~]# ansible banana -m debug -a "msg=banana" 2 172.16.1.8 | SUCCESS => { 3 "msg": "banana" 4 } 5 6 172.16.1.31 | SUCCESS => { 7 "msg": "banana" 8 } 9 10 172.16.1.41 | SUCCESS => { 11 "msg": "banana" 12 }
模塊概要:這個模塊會打印語句在執行時,並且能夠用於調試變量或表達式,可以不需要停止劇本;可以結合when指令一起進行調試
4.4 copy模塊
參數 |
參數說明 |
src |
被復制到遠程主機的本地文件。如果路徑是一個目錄,它將遞歸復制。如果路徑使用"/"來結尾,則只復制目錄里的內容,如果沒有使用"/"來結尾,則包含目錄在內的整個內容全部復制 |
remote_src |
如果這個值設置為True,將到遠程/目標主機的機器上搜索 |
dest |
必選項。要將源文件復制到的遠程主機的絕對路徑,如果源文件是一個目錄,那么該路徑也必須是個目錄 |
owner |
設置復制傳輸后的數據屬主信息 |
group |
設置復制傳輸后的數據屬組信息 |
mode |
設置文件數據權限信息(注意4位) |
backup |
在覆蓋遠端服務器文件之前,將遠端服務器源文件備份,備份文件包含時間信息。有兩個選項:yes|no |
content |
用於替代"src”,可以直接設定指定文件的值 |
force |
如果目標主機包含該文件,但內容不同。 如果設置為yes,則強制覆蓋;如果為no,則只有當目標主機的目標位置不存在該文件時才復制,默認為yes。 |
directory_mode |
遞歸設定目錄的權限,默認為系統默認權限 |
模塊概要:
a.copy模塊拷貝文件從本地或遠程機器到遠程機器的一個目錄區域中;使用fetch模塊來拷貝文件從遠程區域到本地
b.如果需要復制文件中插入的變量值,可以使用template模塊
說明:第一次執行時結果為黃色,即文件傳輸;第二次執行沒有發生任何改變,即為綠
實例01. 使用copy 模塊,將/etc/hosts文件傳輸到各個服務器送,權限修改為044,屬主屬組為banana
1 [root@m01 ~]# ansible banana -m copy -a "src=/etc/hosts dest=/tmp/ mode=0600 owner=banana group=banana " 2 3 172.16.1.8 | SUCCESS => { 4 "changed": true, 5 "checksum": "b3c1ab140a1265cd7f6de9175a962988d93c629b", 6 "dest": "/tmp/hosts", 7 "gid": 500, 8 "group": "banana", 9 "md5sum": "8c2b120b4742a806dcfdc8cfff6b6308", 10 "mode": "0600", 11 "owner": "banana", 12 "size": 357, 13 "src": "/root/.ansible/tmp/ansible-tmp-1508410846.63-224022812989166/source", 14 "state": "file", 15 "uid": 500 16 }
實例02.移動遠程主機上的文件remote_src=true參數
1 [root@m01 ~]# ansible banana -m copy -a "remote_src=true src=/etc/hosts dest=/opt" 2 3 172.16.1.41 | SUCCESS => { 4 "changed": false, 5 "checksum": "545f587595b5c60d66243fca48e052ed34eed782", 6 "dest": "/opt/hosts", 7 "gid": 0, 8 "group": "root", 9 "md5sum": "fe08440ffebed54cab7a9b4cb3c3beda", 10 "mode": "0644", 11 "owner": "root", 12 "size": 371, 13 "src": "/etc/hosts", 14 "state": "file", 15 "uid": 0 16 }
實例03.定義文件中的內容content=bananaedu.com默認沒有換行
1 [root@m01 ~]# ansible banana -m copy -a "content=bananaedu.com dest=/opt/banana.txt" 2 3 172.16.1.31 | SUCCESS => { 4 "changed": true, 5 "checksum": "291694840cd9f9c464263ea9b13421d8e74b7d00", 6 "dest": "/opt/banana.txt", 7 "gid": 500, 8 "group": "banana", 9 "md5sum": "0a6bb40847793839366d0ac014616d69", 10 "mode": "0600", 11 "owner": "banana", 12 "size": 13, 13 "src": "/root/.ansible/tmp/ansible-tmp-1508649097.07-180967115147583/source", 14 "state": "file", 15 "uid": 500 16 }
4.5 shell模塊
注意:shell模塊在遠程執行腳本時,遠程主機上一定要有相應的腳本
01.把腳本文件復制到遠程服務器,執行遠程服務器的腳本
1 [root@m01 ~]# ansible banana -m shell -a "/bin/sh /server/scripts/ssh-key.sh" 2 172.16.1.31 | SUCCESS | rc=0 >> 3 fenfa 172.16.1.31 [ OK ] 4 5 fenfa 172.16.1.41 [ OK ] 6 7 fenfa 172.16.1.8 [ OK ]
02.把/etc/hosts文件中的內容重定向到/banana.txt
1 [root@m01 ~]# ansible banana -m shell -a "cat /etc/hosts >/banana.txt" 2 3 172.16.1.41 | SUCCESS | rc=0 >> 4 5 172.16.1.8 | SUCCESS | rc=0 >> 6 7 172.16.1.31 | SUCCESS | rc=0 >>
說明:可支持command模塊不能完成的特殊符號,同時匯總所有的模塊
4.6 script模塊
1 [root@m01 ~]# ansible banana -m script -a "/server/scripts/ip.sh" 2 3 172.16.1.8 | SUCCESS => { 4 "changed": true, 5 "rc": 0, 6 "stderr": "Shared connection to 172.16.1.8 closed.\r\n", 7 "stdout_lines": [ 8 "eth0 Link encap:Ethernet HWaddr 00:0C:29:4B:16:9D ", 9 " inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0", 10 " UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1", 11 " RX bytes:86527 (84.4 KiB) TX bytes:76532 (74.7 KiB)", 12 ] 13 }
提示:script模塊與shell模塊的區別
shell:需要將腳本文件都知道遠端服務器,然后sh執行遠端服務器的腳本
script:不需要將腳本文件復制到遠端服務器,實質是將腳本執行過程在遠端服務器上進行執行
4.7 file模塊
參數 |
參數說明 |
|
owner |
設置復制傳輸后的數據屬主信息 |
|
group |
設置復制傳輸后的數據屬組信息 |
|
mode |
設置文件數據權限信息 |
|
dest |
要創建的文件或目錄命令,以及路徑信息 |
|
src |
指定要創建軟鏈接的文件信息 |
|
state |
參數 |
參數說明 |
directory |
所有不存在的子目錄將會被創建 |
|
file |
文件不存在將不能被創建 |
|
link |
符號鏈接(軟鏈接)將被創建或更改 |
|
hard |
創建出硬鏈接 |
|
absent |
目錄將被遞歸刪除以及文件,鏈接被取消 注意:定義文件不存在不會失敗,只是輸出沒有發生任何改變的結果 |
|
touch |
如果路徑不存在將創建一個空文件,如果文件或目錄存在將接收更新的文件訪問和修改時間 |
實例01.創建遠端目錄
1 [root@m01 ~]# ansible banana -m file -a "dest=/tmp/banana_dir state=directory" 2 3 172.16.1.41 | SUCCESS => { 4 "changed": true, 5 "gid": 0, 6 "group": "root", 7 "mode": "0755", 8 "owner": "root", 9 "path": "/tmp/banana_dir", 10 "size": 4096, 11 "state": "directory", 12 "uid": 0 13 }
實例02.創建遠端文件
1 [root@m01 ~]# ansible banana -m file -a "dest=/tmp/banana_file state=touch" 2 3 172.16.1.8 | SUCCESS => { 4 "changed": true, 5 "dest": "/tmp/banana_file", 6 "gid": 0, 7 "group": "root", 8 "mode": "0644", 9 "owner": "root", 10 "size": 0, 11 "state": "file", 12 "uid": 0 13 }
4.8 yum模塊
參數 |
參數說明 |
name=name |
指定安裝的軟件 |
state=installed |
安裝 |
1 [root@m01 ~]# ansible banana -m yum -a "name=nmap state=installed" 2 3 172.16.1.41 | SUCCESS => { 4 "changed": false, 5 "msg": "", 6 "rc": 0, 7 "results": [ 8 "nmap-2:5.51-6.el6.x86_64 providing nmap is already installed" 9 ] 10 }
提示:這里的state狀態均為過去式ed/d
4.9 service模塊
參數 |
參數說明 |
name=service name |
服務的名稱 |
state=參數 |
停止服務 服務狀態信息為過去時 stared/stoped/restarted/reloaded |
enabled=yes |
設置開機自啟動 |
1 [root@m01 ~]# ansible banana -m service -a "name=crond state=restarted" 2 3 172.16.1.8 | SUCCESS => { 4 "changed": true, 5 "name": "crond", 6 "state": "started" 7 }
說明:此時name即服務名,表示將名為crond的服務停止,並且取消開機自啟動
4.10 cron模塊
實例01.創建定時任務
1 [root@m01 ~]# ansible banana -m cron -a "name=01 minute=*/5 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'" #name識別定時任務唯一性的標識,但只管理ansible信息 2 3 172.16.1.41 | SUCCESS => { 4 "changed": true, 5 "envs": [], 6 "jobs": [ 7 "None", 8 "banana666" 9 ] 10 }
實例02.刪除定時任務
1 [root@m01 ~]# ansible banana -m cron -a "name=None minute=*/5 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' state=absent" 2 3 172.16.1.41 | SUCCESS => { 4 "changed": true, 5 "envs": [], 6 "jobs": [ 7 "banana666" 8 ] 9 }
實例03.查看定時任務
1 [root@m01 ~]# ansible banana -m shell -a "crontab -l" 2 3 172.16.1.8 | SUCCESS | rc=0 >> 4 #time sync by banana at 2017-10-1 5 6 #web_backup by rsync 7 #*/5 * * * * /bin/sh /server/scripts/web_backup.sh &>/dev/null 8 #Ansible: banana666 9 #00 00 * * * /bin/sh /server/scripts/ip.sh &>/dev/null
4.11 fetch模塊
參數 |
參數說明 |
dest |
將遠程主機拉取過來的文件保存在本地的路徑信息 |
src |
指定從遠程主機要拉取的文件信息,只能拉取文件 |
flat |
默認設置為no,如果設置為yes,將不顯示172.16.1.8/etc/信息 |
實例01.從遠程主機拉取文件
1 [root@m01 ~]# ansible banana -m fetch -a "dest=/tmp src=/etc/hosts" 2 3 172.16.1.8 | SUCCESS => { 4 "changed": true, 5 "checksum": "bd9a0f82db17051a305f6a5974fa1fd95ead73d5", 6 "dest": "/tmp/172.16.1.8/etc/hosts", 7 "md5sum": "27b1ddf7c360698b439627b057f77d51", 8 "remote_checksum": "bd9a0f82db17051a305f6a5974fa1fd95ead73d5", 9 "remote_md5sum": null 10 }
實例02.拉取時不創建目錄(同名文件會覆蓋)
1 [root@m01 ~]# ansible banana -m fetch -a "dest=/tmp/ src=/etc/hosts flat=yes" 2 3 172.16.1.41 | SUCCESS => { 4 "changed": true, 5 "checksum": "bcb7c85bad6008ede9e73d18ae0bb78f2b11f612", 6 "dest": "/tmp/hosts", 7 "md5sum": "211bd00bf9ba8a735db1c7953d7cebc4", 8 "remote_checksum": "bcb7c85bad6008ede9e73d18ae0bb78f2b11f612", 9 "remote_md5sum": null 10 }
4.12 mount模塊
參數 |
參數說明 |
fstype |
指定掛載文件類型;-t nfs == fstype=nfs |
opts |
設定掛載的參數選項信息;-o ro == opts=ro |
path |
指定掛載點 path=/mnt |
src |
要被掛載的目錄設備信息 src=172.16.1.31:/data/w |
state |
01.如果為mountd 在fstab文件中的設備將被激活掛載和適當配置 02.如果為unmounted 設備將被卸載並不會改變fstab文件信息,absent和present只處理fstab,但不影響目前的掛載 |
實例01.掛載
1 [root@m01 ~]#ansible banana -m mount -a “fstype=nfs opts=ro src=172.16.1.31:/data path=/mnt state=mounted” 2 3 172.16.1.41 | SUCCESS => { 4 "changed": true, 5 "dump": "0", 6 "fstab": "/etc/fstab", 7 "fstype": "nfs", 8 "name": "/mnt", 9 "opts": "ro", 10 "passno": "0", 11 "src": "172.16.1.31:/data/w" 12 }
實例02.卸載
1 [root@m01 tmp]# ansible banana -m mount -a "fstype=nfs opts=ro src=172.16.1.31:/data path=/mnt state=unmounted" 2 3 172.16.1.8 | SUCCESS => { 4 "changed": false, 5 "dump": "0", 6 "fstab": "/etc/fstab", 7 "fstype": "nfs", 8 "name": "/mnt", 9 "opts": "ro", 10 "passno": "0", 11 "src": "172.16.1.31:/data" 12 }
第5章 ansible劇本編寫
5.1 ansible基礎知識部分補充
5.1.1 ansible軟件特點
01.可以實現批量管理
02.可以實現批量部署
03.ad-hoc(批量執行命令)---針對臨時性的操作
ansible banana -m command -a "hostname" <-批量執行命令舉例
04.編寫劇本-腳本(playbook)---針對重復性的操作
5.1.2 ansible核心功能
01.pyYAML <-用於ansible編寫劇本所使用的語言格式(saltstack---python)
02.paramiko <-遠程連接與數據傳輸
03.Jinja2 <-用於編寫ansible的模板信息
5.2 ansible劇本編寫規則說明
①規則一:縮進/空格
yaml使用一個固定的縮進風格表示數據層結構關系,Saltstack需要每個縮進級別由兩個空格組成,一定不能使用tab鍵
注意:編寫ansible-playbook文件,一定忘記有tab鍵
②規則二:冒號
CMD="echo"
yaml :
mykey :
注意:每個冒號前后一定要有空格(以冒號結尾不需要空格,表示文件路徑的模板不需要空格)
③規則三:短橫線
想要表示列表項,使用一個短橫杠加一個空格。多個項使用同樣的縮進級別作為同一個列表的一部分
核心規則:有效的利用空格進行劇本的編寫,劇本編寫是不支持tab的
5.3 劇本編寫環境准備
外網IP |
內網IP |
主機名 |
10.0.0.8 |
172.16.1.8 |
web01 |
10.0.0.31 |
172.16.1.31 |
nfs01 |
10.0.0.41 |
172.16.1.41 |
backup |
10.0.0.61 |
172.16.1.61 |
m01 |
5.4 劇本書寫格式
1 劇本的開頭,可以不寫 2 - hosts: all #處理所有服務器,找到所有服務器; -(空)hosts:(空)all 3 tasks: #劇本所要干的事情; -(空)(空)task: 4 - command: echo hello banana linux. 5 (空)(空)(空)(空)-(空)模塊名稱:(空)模塊中對應的功能 6 ansible all -m command -a "echo hello banana linux"
劇本編寫內容擴展:劇本任務定義名稱
1 - hosts: 172.16.1.7 #處理指定服務器 -(空)hosts:(空)all 2 task: #劇本所要干的事情; -(空)(空)task: 3 - name: 4 command: echo hello banana linux. 5 (空)(空)(空)(空)-(空)模塊名稱:(空)模塊中對應的功能
5.4.1 劇本格式示例
1 [root@m01 ansible-playbook]# vim rsync_sever.yml 2 3 - hosts: 172.16.1.41 4 tasks: 5 - name: install rsync 6 yum: name=rsync state=installed
5.5 劇本編寫后檢查方法
01:ansible-playbook --syntax-check 01.yml 進行劇本配置信息語法檢查 02:ansible-playbook -C 01.yml 模擬劇本執行(彩排)
5.5.1 語法檢查
1 [root@m01 ansible-playbook]# ansible-playbook --syntax-check 01.yml
2
3 playbook: 01.yml
5.5.2 模擬劇本執行
1 [root@m01 ansible-playbook]# ansible-playbook -C 01.yml 2 3 PLAY [all] *************************************************************** 4 5 TASK [Gathering Facts] *************************************************************** 6 ok: [172.16.1.41] 7 ok: [172.16.1.8] 8 ok: [172.16.1.31] 9 10 TASK [cron] *************************************************************** 11 ok: [172.16.1.8] 12 ok: [172.16.1.41] 13 ok: [172.16.1.31] 14 15 PLAY RECAP *************************************************************** 16 172.16.1.31 : ok=2 changed=0 unreachable=0 failed=0 17 172.16.1.41 : ok=2 changed=0 unreachable=0 failed=0 18 172.16.1.8 : ok=2 changed=0 unreachable=0 failed=0
5.6 劇本示例
5.6.1 劇本編寫內容擴展:劇本任務編寫多個任務
1 - hosts: all 2 tasks: 3 - name: restart-network 4 cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' 5 - name: sync time 6 cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"
5.6.2 劇本編寫內容擴展:劇本任務編寫多個主機
1 - hosts: 172.16.1.7 2 tasks: 3 - name: restart-network 4 cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' 5 - name: sync time 6 cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1" 7 - hosts: 172.16.1.31 8 tasks: 9 - name: show ip addr to file 10 shell: echo $(hostname -i) >> /tmp/ip.txt
5.7 劇本編寫方式
01.多主機單任務編寫方式
02.多主機多任務編寫方式
03.不同主機多任務編寫方式
第6章 ansible編寫劇本排錯思路
6.1 劇本排錯方法
1. ansible-playbook編寫完,檢査語法和模擬測試運行
2.打開劇本,定位異常問題原因,將劇本中的內容轉換命令執行一次
3. 將參數中的腳本文件推送到遠程屎務器,在遠程服務器本地執行腳本 sh -x test.sh
說明:ansible執行時,加上-vvvv顯示ansible詳細執行過程,也可以定位異常原因
--syntax-check或-C ansible語法檢查和模擬執行(彩排)
6.2 排錯邏輯
01.劇本執行中的錯誤
02.把劇本中的內容轉換為ansible命令執行
ansible banana -m yum -a "name=rsync state=installed"
03.把參數中的腳本文件推送到遠端服務器,放在遠端被管理服務器本地上執行
sh -x /server/scripts/test.sh
6.3 ansible無法正常使用
6.3.1 常見問題一:在被控端上 root@notty進程一直存在
1 [root@backup ~]# ps -ef|grep sshd 2 3 root 35274 1 0 15:25 ? 00:00:00 /usr/sbin/sshd 4 root 37004 35274 0 16:23 ? 00:00:00 sshd: root@pts/2 5 root 37062 35274 0 16:55 ? 00:00:00 sshd: root@notty 6 root 37154 37006 0 16:55 pts/2 00:00:00 grep --color=auto sshd
解決思路:kill pid將該進程殺死,然后使用ansible的 -vvvv 參數查看執行的錯誤信息
Loading callback plugin minimal of type stdout, v2.0 from /usr/lib/python2.6/site-packages/ansible/plugins/callback/__init__.pyc META: ran handlers Using module file /usr/lib/python2.6/site-packages/ansible/modules/system/ping.py <172.16.1.8> ESTABLISH SSH CONNECTION FOR USER: None <172.16.1.8> SSH: EXEC ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/923ebeb605 172.16.1.8 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
可能為:在/etc/ssh/sshd_config 文件中的第132行為空,導致sftp 無法連接出錯
133 Subsystem sftp /usr/libexec/openssh/sftp-server
6.3.2 常見問題二:
1 [root@m01 ~]# ansible -k 172.16.1.51 -m ping
2
3 SSH password:
4 [WARNING]: No hosts matched, nothing to do
解決思路:在ansible的hosts文件中,沒有配置相應主機地址信息
6.3.3 常見問題三:
1 # ansible -k 172.16.1.51 -m ping 2 3 SSH password: 4 172.16.1.51|FAILED! => { 5 "failed": true, 6 "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host." 7 }
解決思路:在known_hosts文件中沒有受控端指紋信息
6.4 [附錄]pssh命令使用擴展
6.4.1 pssh命令使用場景說明
背景:若同時給上千台服務器執行一個命令,拷貝一個文件,殺一個進程等,有什么簡化運維管理的工具呢?
在小型企業中通常使用for循環,但是數量巨大時:一方面不確定操作是否成功;另一方面for循環語句性能不好估計且是否是同步並行執行,故此時會用到批量並行執行的命令如 pdsh,mussh,cssh,dsh等,及下面說明提到的pssh
6.4.2 pssh軟件安裝部署方式
①通過yum安裝pssh軟件
1 yum install -y pssh <-pssh軟件下載需要依靠epel源
說明:pssh是一個軟件大禮包,里面有很多軟件命令
②通過編譯方式安裝pssh軟件
1 wget http://peak.telecommunity.com/dist/ez_setup.py 2 python ez_setup.py 3 wget http://parallel-ssh.googlecode.com/files/pssh-2.2.2.tar.gz 4 tar zxvf pssh-2.2.2.tar.gz 5 cd pssh-2.2.2 6 python setup.py install
③pssh軟件使用操作說明(ssh key認證密鑰配置完畢)
01.pssh 多主機並行運行命令
1 [root@server pssh-2.2.2]# vim hosts_info.txt 2 3 172.16.1.31:22 4 172.16.1.41:22 5 172.16.1.7:22 //注意我的端口號不僅是默認的22
說明:如果想將執行命令的批量輸出信息重定向到一個文件 加-o 目錄 選項
參數說明:
-h HOST_FILE, --hosts=HOST_FILE hosts file (each line "[user@]host[:port]") -o OUTDIR, --outdir=OUTDIR output directory for stdout files (OPTIONAL) -P, --print print output as we get it
02.pscp 把文件並行地復制到多個主機上(從服務器端給客戶端傳送文件)
1 [root@server pssh-2.2.2]# pscp -h test.txt /etc/sysconfig/network /tmp/network
03.prsync 使用rsync協議從本地計算機同步到遠程主機
1 [root@server ~]# pssh -h test.txt -P mkdir /tmp/etc
2 [root@server ~]# prsync -h test.txt -l dongwm -a -r /etc/sysconfig /tmp/etc
04.pslurp 將文件從遠程主機復制到本地,和pscp方向相反
1 [root@server ~]# pslurp -h test.txt -L /tmp/test -l root /tmp/network test 2 3 [1] 14:53:54 [SUCCESS] 192.168.9.102 9922 4 [2] 14:53:54 [SUCCESS] 192.168.9.104 9922 5 6 [root@server ~]# ll /tmp/test/192.168.9.10 7 192.168.9.102/ 192.168.9.104/ 8 9 [root@server ~]# ll /tmp/test/192.168.9.102/ 10 總計 4.0K 11 -rw-r--r-- 1 root root 60 2011-04-22 14:53 test 12 13 [root@server ~]# ll /tmp/test/192.168.9.104/ 14 總計 4.0K 15 -rw-r--r-- 1 root root 60 2011-04-22 14:53 test
此筆記是本人學習摘記整理而成,此為初稿(尚有諸多不完善之處),原創作品允許轉載,轉載時請務必以超鏈接形式標明文章原始出處,作者信息和本聲明,否則將追究法律責任。http://www.cnblogs.com/bananaaa/