自動(dòng)運(yùn)維工具 Ansible 實(shí)踐與總結(jié)

ansible是一款自動(dòng)化運(yùn)維工具,基于Python開發(fā),可以實(shí)現(xiàn)批量系統(tǒng)設(shè)置、批量程序部署、批量執(zhí)行命令等功能。特點(diǎn)如下:

Ansible完全基于Python開發(fā),要求python的版本為2.6以上。

Ansible豐富的內(nèi)置模塊,近600個(gè)模塊完全滿足日常功能所需

Ansible默認(rèn)通過(guò)SSH協(xié)議管理機(jī)器,因此,客戶端無(wú)需任何配置,管理端配置好后即可使用。

Ansible目前屬于Redhat公司,最新版本為Ansible2.9。

應(yīng)用環(huán)境:

應(yīng)用代碼自動(dòng)化部署

系統(tǒng)管理配置自動(dòng)化

支持持續(xù)交付自動(dòng)化

支持云計(jì)算,大數(shù)據(jù)平臺(tái)環(huán)境

批量任務(wù)執(zhí)行可以寫成腳本,不用分發(fā)到遠(yuǎn)程就可以執(zhí)行

支持非root用戶管理操作,支持sudo

使用python編寫,維護(hù)更簡(jiǎn)單。

1.ansible的命令套件

安裝完ansible后,ansible一共提供了七個(gè)指令,分別是:ansible、ansible-doc、ansible-galaxy、ansible-lint、ansible-playbook、ansible-pull、ansible-vault 。

(1)ansible

ansible是指令核心部分,其主要用于執(zhí)行ad-hoc命令,即單條命令。默認(rèn)后面需要跟主機(jī)和選項(xiàng)部分,默認(rèn)不指定模塊時(shí),使用的是command模塊。

(2)ansible-doc

該指令用于查看模塊信息,常用參數(shù)有兩個(gè)-l 和 -s ,具體如下:

例如,列出所有已安裝的模塊

# ansible-doc -l

查看具體某模塊的用法,這里如查看command模塊

# ansible-doc -s command

(3)ansible-galaxy

ansible-galaxy 指令用于方便的從https://galaxy.ansible.com/?站點(diǎn)下載第三方擴(kuò)展模塊,可以形象的理解其類似于centos下的yum、python下的pip或easy_install 。

(4)ansible-lint

ansible-lint是對(duì)playbook的語(yǔ)法進(jìn)行檢查的一個(gè)工具。用法是ansible-lint playbook.yml 。

(5)ansible-playbook

該指令是使用最多的指令,其通過(guò)讀取playbook 文件后,執(zhí)行相應(yīng)的動(dòng)作,這個(gè)后面會(huì)做為一個(gè)重點(diǎn)來(lái)講。

(6)ansible-pull

該指令使用需要談到ansible的另一種模式:pull 模式,這和平常經(jīng)常用的push模式剛好相反,其適用于以下場(chǎng)景:

有數(shù)量巨大的機(jī)器需要配置,即使使用非常高的線程還是要花費(fèi)很多時(shí)間

要在一個(gè)沒(méi)有網(wǎng)絡(luò)連接的機(jī)器上運(yùn)行Anisble,比如在啟動(dòng)之后安裝。

(7)ansible-vault

ansible-vault主要應(yīng)用于配置文件中含有敏感信息,又不希望被人看到,vault可以幫你加密/解密這個(gè)配置文件,屬高級(jí)用法。主要對(duì)于playbooks里比如涉及到配置密碼或其他變量時(shí),可以通過(guò)該指令加密,這樣我們通過(guò)cat看到的是一個(gè)密碼串類的文件,編輯的時(shí)候需要輸入事先設(shè)定的密碼才能打開。這種playbook文件在執(zhí)行時(shí),需要加上 –ask-vault-pass參數(shù),同樣需要輸入密碼后才能正常執(zhí)行。

注:上面七個(gè)指令,用的最多的只有兩個(gè)ansible 和ansible-playbook ,這兩個(gè)一定要掌握,其它五個(gè)屬于拓展或高級(jí)部分。

2.ansible的執(zhí)行模式

ansible執(zhí)行自動(dòng)化任務(wù),分為兩種執(zhí)行模式:

(1)、命令行模式:?jiǎn)蝹€(gè)模塊,單條命令的批量執(zhí)行。常用語(yǔ)測(cè)試環(huán)境。

(2)、playbook:這個(gè)可以理解成為面向?qū)ο蟮木幊?,就像上面舉例那樣可以把多個(gè)想要執(zhí)行的任務(wù)放到一個(gè)playbook中,當(dāng)然多個(gè)任務(wù)在事物邏輯上最好是有上下聯(lián)系的。通過(guò)多個(gè)任務(wù)可以完成一個(gè)總體的目標(biāo),這就是playbook。常用于線上生產(chǎn)環(huán)境。

1、簡(jiǎn)單的主機(jī)和組

ansible的配置文件位于/etc/ansible目錄下,主要有ansible.cfg、hosts文件。本節(jié)重點(diǎn)介紹主機(jī)與組定義文件/etc/ansible/hosts.

/etc/ansible/hosts最簡(jiǎn)單的格式如下:

www.ixdba.net

[webservers]

ixdba1.net

ixdba2.net

[dbservers]

db.ixdba1.net

db.ixdba2.net

中括號(hào)中的名字代表組名,可以根據(jù)需求將龐大的主機(jī)分成具有標(biāo)識(shí)的組,如上面分了兩個(gè)組webservers和dbservers組;

主機(jī)(hosts)部分可以使用域名、主機(jī)名、IP地址表示;當(dāng)然使用前兩者時(shí),也需要主機(jī)能反解析到相應(yīng)的IP地址,一般此類配置中多使用IP地址;

2、指定主機(jī)范圍

可在/etc/ansible/hosts文件中,指定主機(jī)的范圍,示例如下:

[web]

www[01:50].ixdba.net

[db]

db[a:f].ixdba.en

3、主機(jī)變量

[web]

192.168.78.11 http_port=80

192.168.78.12 http_port=80

還可以改成這樣:

[web]

192.168.78.11

192.168.78.12

[web:vars]

http_port=80

4、主機(jī)組變量

[webhost]

host1

host2

[dbhost]

host2

host3

[allhosts:children]

webhost

Dbhost

主機(jī)組可以包含主機(jī)組,主機(jī)的變量可以通過(guò)繼承關(guān)系,繼承到最高等級(jí)的組的變量。定義主機(jī)組之間的繼承關(guān)系我們使用”:children”來(lái)表示

3.ansible的命令模式

命令行模式ansible常用選項(xiàng)

命令行模式是指ansible臨時(shí)執(zhí)行的一條或多條命令,并且不需要保存命令,對(duì)于復(fù)雜的命令后面會(huì)講用playbook。在使用ansible時(shí),就要提到模塊,所有的命令執(zhí)行都要依賴于事先寫好的模塊,默認(rèn)安裝好的ansible里面已經(jīng)自帶了很多模塊,如:command、raw、shell、file、cron等,具體可以通過(guò)ansible-doc -l 進(jìn)行查看 。

ansible命令的常用選項(xiàng):

-m MODULE_NAME:指定要執(zhí)行的模塊的名稱,如果不指定-m選項(xiàng),默認(rèn)是COMMAND模塊。

-a MODULE_ARGS,:指定執(zhí)行模塊對(duì)應(yīng)的參數(shù)選項(xiàng)。

-k:提示輸入SSH登錄的密碼而不是基于密鑰的驗(yàn)證

-K:用于輸入執(zhí)行su或sudo操作時(shí)需要的認(rèn)證密碼。

-b:表示提升權(quán)限操作。

--become-method:指定提升權(quán)限的方法,常用的有 sudo和su,默認(rèn)是sudo。

--become-user:指定執(zhí)行 sudo或su命令時(shí)要切換到哪個(gè)用戶下,默認(rèn)是root用戶。

-B SECONDS:后臺(tái)運(yùn)行超時(shí)時(shí)間

-C:測(cè)試一下會(huì)改變什么內(nèi)容,不會(huì)真正去執(zhí)行,主要用來(lái)測(cè)試一些可能發(fā)生的變化

-f FORKS,:設(shè)置ansible并行的任務(wù)數(shù)。默認(rèn)值是5

-i INVENTORY: 指定主機(jī)清單文件的路徑,默認(rèn)為/etc/ansible/hosts

命令行模式的ansible執(zhí)行,需要按以下格式進(jìn)行操作:

ansible 主機(jī)或組 -m 模塊名 -a '模塊參數(shù)' ansible參數(shù)

主機(jī)和組:是在/etc/ansible/hosts 里進(jìn)行指定的部分,當(dāng)然動(dòng)態(tài)Inventory使用的是腳本從外部應(yīng)用里獲取的主機(jī)。

模塊名:可以通過(guò)ansible-doc -l 查看目前安裝的模塊,默認(rèn)不指定時(shí),使用的是command模塊,具體可以查看/etc/ansible/ansible.cfg 的“#module_name = command ” 部分,默認(rèn)模塊可以在該配置文件中進(jìn)行修改;

模塊參數(shù):可以通過(guò) “ansible-doc 模塊名” 查看具體的用法及后面的參數(shù);

ansible參數(shù):可以通過(guò)ansible命令的幫忙信息里查看到,這里有很多參數(shù)可以供選擇,如是否需要輸入密碼、是否sudo等。

4.Playbook

playbook字面意思,即劇本,現(xiàn)實(shí)中由演員按照劇本表演,在Ansible中,這次由計(jì)算機(jī)進(jìn)行表演,由計(jì)算機(jī)安裝,部署應(yīng)用,提供對(duì)外服務(wù),以及組織計(jì)算機(jī)處理各種各樣的事情。

那么為什么要使用playbook呢?

執(zhí)行一些簡(jiǎn)單的任務(wù),使用命令行模式可以方便的解決問(wèn)題,但是有時(shí)一個(gè)設(shè)施過(guò)于復(fù)雜,需要大量的操作時(shí)候,執(zhí)行命令行模式是不適合的,這時(shí)最好使用playbook,就像執(zhí)行shell命令與寫shell腳本一樣,也可以理解為批處理任務(wù),不過(guò)playbook有自己的語(yǔ)法格式。

playbook的構(gòu)成

playbook是由一個(gè)或多個(gè)“play”組成的列表。play的主要功能在于,將事先合并為一組的主機(jī)裝扮成事先通過(guò)ansible定義好的角色。將多個(gè)play組織在一個(gè)playbook中就可以讓它們聯(lián)同起來(lái)按事先編排的機(jī)制完成一系列復(fù)雜的任務(wù)。

其主要有以下四部分構(gòu)成

target部分: 定義將要執(zhí)行 playbook 的遠(yuǎn)程主機(jī)組

variable部分: 定義playbook運(yùn)行時(shí)需要使用的變量

task部分: 定義將要在遠(yuǎn)程主機(jī)上執(zhí)行的任務(wù)列表

handler部分: 定義task 執(zhí)行完成以后需要調(diào)用的任務(wù)

(1) Hosts和Users

playbook中的每一個(gè)play的目的都是為了讓某個(gè)或某些主機(jī)以某個(gè)指定的用戶身份執(zhí)行任務(wù)。

hosts:用于指定要執(zhí)行指定任務(wù)的主機(jī),每個(gè)playbook都必須指定hosts,hosts也可以使用通配符格式。主機(jī)或主機(jī)組在inventory清單中指定,可以使用系統(tǒng)默認(rèn)的/etc/ansible/hosts,也可以自己編輯,在運(yùn)行的時(shí)候加上-i選項(xiàng),可指定自定義主機(jī)清單的位置。在運(yùn)行清單文件的時(shí)候,--list-hosts選項(xiàng)會(huì)顯示那些主機(jī)將會(huì)參與執(zhí)行任務(wù)的過(guò)程中。

remote_user:用于指定在遠(yuǎn)程主機(jī)上執(zhí)行任務(wù)的用戶??梢灾付ㄈ我庥脩簦部梢允褂胹udo,但是用戶必須要有執(zhí)行相應(yīng)任務(wù)的權(quán)限。

(2)任務(wù)列表(tasks list)

play的主體部分是task list。

task list中的各任務(wù)按次序逐個(gè)在hosts中指定的所有主機(jī)上執(zhí)行,即在所有主機(jī)上完成第一個(gè)任務(wù)后再開始第二個(gè)。在運(yùn)行自上而下某playbook時(shí),如果中途發(fā)生錯(cuò)誤,則所有已執(zhí)行任務(wù)都將回滾,因此在更正playbook后需要重新執(zhí)行一次。

task的目的是使用指定的參數(shù)執(zhí)行模塊,而在模塊參數(shù)中可以使用變量。模塊執(zhí)行是冪等的(冪等性; 即一個(gè)命令,即使執(zhí)行一次或多次, 其結(jié)果也一樣),這意味著多次執(zhí)行是安全的,因?yàn)槠浣Y(jié)果均一致。tasks包含name和要執(zhí)行的模塊,name是可選的,只是為了便于用戶閱讀,建議加上去,模塊是必須的,同時(shí)也要給予模塊相應(yīng)的參數(shù)。

定義tasks推薦使用module: options”的格式,例如:

service: name=httpd state=running

(3) handlers

用于當(dāng)關(guān)注的資源發(fā)生變化時(shí)采取一定的操作。handlers是和“notify”配合使用的。

“notify”這個(gè)動(dòng)作可用于在每個(gè)play的最后被觸發(fā),這樣可以避免多次有改變發(fā)生時(shí),每次都執(zhí)行指定的操作,通過(guò)“notify”,僅在所有的變化發(fā)生完成后一次性地執(zhí)行指定操作。

在notify中列出的操作稱為handler,也就是說(shuō)notify用來(lái)調(diào)用handler中定義的操作。

注意:在 notify中定義的內(nèi)容一定要和handlers中定義的“ - name”內(nèi)容一樣,這樣才能達(dá)到觸發(fā)的效果,否則會(huì)不生效。

(4) tags

tags用于讓用戶選擇運(yùn)行或略過(guò)playbook中的部分代碼。ansible具有冪等性,因此會(huì)自動(dòng)跳過(guò)沒(méi)有變化的部分;但是當(dāng)一個(gè)playbook任務(wù)比較多時(shí),一個(gè)一個(gè)的判斷每個(gè)部分是否發(fā)生了變化,也需要很長(zhǎng)時(shí)間。因此,如果確定某些部分沒(méi)有發(fā)生變化,就可以通過(guò)tags跳過(guò)這些代碼片斷

5.Ansible-playbook 應(yīng)用舉例

1、shell 模塊

在遠(yuǎn)程節(jié)點(diǎn)上執(zhí)行命令,用法和command模塊一樣,不過(guò)shell模塊執(zhí)行命令的時(shí)候使用的是/bin/sh,所以shell模塊可以執(zhí)行任何命令。

- hosts: 172.16.213.231

remote_user: root

tasks:

- name: ansible shell

shell: ps -ef|grep sshd&&mkdir /opt/hdp

- name: ansible command

command: touch /opt/hdp/hadoop.txt

上面這個(gè)命令是執(zhí)行遠(yuǎn)程機(jī)器上的腳本,腳本路徑為/tmp/install.sh(遠(yuǎn)程主機(jī)上的腳本,非本機(jī)的),然后將執(zhí)行命令的結(jié)果存放在遠(yuǎn)程主機(jī)路徑/tmp/install.log中,注意在進(jìn)行保存文件的時(shí)候,寫上全路徑,否則就會(huì)保存在登錄之后的默認(rèn)路徑中

2、raw模塊

raw模塊功能類似與前面說(shuō)的command、shell能夠完成的操作,raw也都能完成。不同的是,raw模塊不需要遠(yuǎn)程主機(jī)上的python環(huán)境。

ansible要執(zhí)行自動(dòng)化操作,需要管理機(jī)上裝ansible,客戶機(jī)上也需要安裝python,如果客戶機(jī)上沒(méi)有安裝python模塊,那么command、shell模塊將無(wú)法工作,而raw卻可以正常工作,因此,如果有的機(jī)器是沒(méi)有裝python,或者說(shuō)安裝的python版本在python2.4以下,就可以使用raw模塊來(lái)裝python、python-simplejson等。

- hosts: 172.16.213.231

remote_user: root

tasks:

- name: ansible raw1

raw: ps -ef|grep sshd|awk '{print $2}'>/tmp/ssh.log

- name: ansible raw2

raw: dnf -y install python36-devel

3. file模塊


- hosts: 10.0.8.10?

? remote_user: root?

? tasks:?

?? - name: mkdir cdh directory?

???? file: path=/opt/cdh state=directory mode=0755?

?? - name: chmod bin?

???? file: dest=/opt/bigdata/jdk/bin mode=0755 recurse=yes?

?? - name: link files?

???? file: src=/etc/ssh/sshd_config dest=/mnt/sshd_config owner=timli state=link?

?? - name: delete files?

???? file: path=/tmp/openssl-1.0.1t.tar.gz state=absent?

?? - name: chown files?

???? file: path=/mnt/syncfile.txt owner=nobody mode=0644?

4.copy 模塊

- hosts: 10.0.8.10?

? remote_user: root?

? gather_facts: false?

? tasks:?

?? - name: copy and chown?

???? copy: src=/etc/sudoers dest=/mnt/sudoers owner=root group=root mode=440 backup=yes?

?? - name: checking files?

???? copy: src=/etc/sudoers dest=/mnt/sudoers validate='visudo -cf? %s'?

?? - name: copy directory?

???? copy: src=/etc/crontab/ dest=/mnt/bak owner=hadoop group=hadoop directory_mode=644?

5.Synchronize


比拷貝模塊快很多?

- hosts: 10.0.8.10?

? remote_user: root?

? gather_facts: false?

? tasks:?

?? - name: synchronize rsync directory?

???? synchronize: src=/usr/share/nginx/modules dest=/mnt/bak1 delete=yes?


6.Service 模塊

root@VM-8-6-ubuntu:/etc/ansible#?cat service.yml?

- hosts: 10.0.8.10?

? remote_user: root?

? gather_facts: false?

? tasks:?

??? - name:??

? ? ? service: name=nginx state=restarted enabled=yes?

7 Cron 模塊


?- hosts: 10.0.8.10?

?? remote_user: root?

?? gather_facts: false?

?? tasks:?

???? - name: cron examples?

?????? cron: backup=true name=autobackup weekday=6 minute=30 hour=1 user=root?



- name: create user?

? hosts: 10.0.8.10?

? user: root?

? gather_facts: false?

? tasks:?

??? - name: start createuser?

user: name="{{item.us}}" groups=hadoop,wheel?

????? with_items:?

??????????? - {us: hadoopuser003}?

??????????? - {us: hadoopuser004}?

??????????? - {us: hadoopuser005}?

??????????? - {us: hadoopuser006}?


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容