ansible服務及劇本編寫

前幾天因爲工做上的事耽誤了幾天,特來追加更新css

第1章 ansible軟件概念說明

python語言是運維人員必會的語言,而ansible是一個基於Python開發的自動化運維工具 (saltstack)。其功能實現基於SSH遠程鏈接服務;ansible能夠實現批量系統配置、批量軟件部署、批量文件拷貝、批量運行命令等功能html

 

ansible軟件相關參考連接信息:python

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的客戶端linux

02.不須要服務端(no servers)web

03.須要依靠大量的模塊實現批量管理shell

04.配置文件/etc/ansible/ansible.cfg(無需配置)vim

1.2 企業級生產場景批量管理-自動化管理方案

01.最簡單/最經常使用/最強大的選擇是ssh key+shell/pssh方案,通常中小型企業會用(50-100臺如下規模企業)api

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/

相關文章
相關標籤/搜索