經過ansible自動化部署zabbix應用

zabbix在實際的應用中,可能須要監控的主機很是多,而每一個主機的操做系統類型、版本也都不盡相同,在這種環境下,經過手動安裝zabbix的agent端已經不現實了,此時就須要藉助自動化工具完成zabbix agent的安裝和配置。javascript

要對海量主機進行zabbix agent的部署,難點有幾個方面,分別是:css

一、要考慮每一個主機的操做系統類型、版本
二、針對不一樣操做系統版本,須要安裝不一樣類型的zabbix agent客戶端版本
三、zabbix agent客戶端安裝完成後,還須要自動化的配置每一個客戶端
四、zabbix agent配置文件中有些配置參數可能和每一個主機有關(例如IP地址),此時就須要將主機信息寫入配置文件中,而每一個主機的配置信息又各不相同。
五、每一個主機上的配置文件自動配置後,最後還要啓動主機上的zabbix agent服務。java

針對上面的5個問題,如何來實現批量自動化部署和配置呢,這裏咱們介紹一款自動化工具ansible,經過此工具,就能夠實現zabbix agent的批量自動化部署。下面咱們將介紹ansible的入門與使用,最後介紹經過ansible-playbook自動化一鍵部署zabbix agent的方法。python

1、 ansible介紹與安裝使用
1.一、 ansible介紹與特色linux

ansible是一款自動化運維工具,基於Python開發,能夠實現批量系統設置、批量程序部署、批量執行命令等功能。特色以下:nginx

Ansible徹底基於Python開發,要求python的版本爲2.6以上。
Ansible豐富的內置模塊,近600個模塊徹底知足平常功能所需
Ansible默認經過SSH協議管理機器,所以,客戶端無需任何配置,管理端配置好後便可使用。
Ansible目前屬於Redhat公司,最新版本爲Ansible2.7。web

ansible的在企業中的應用環境主要有以下幾個方面:正則表達式

應用代碼自動化部署
系統管理配置自動化
支持持續交付自動化
支持雲計算,大數據平臺環境
批量任務執行能夠寫成腳本,不用分發到遠程就能夠執行
支持非root用戶管理操做,支持sudo
使用python編寫,維護更簡單。redis

1.二、 ansible的安裝算法

這裏的安裝環境是centos7.5版本操做系統,首先須要安裝第三方epel源:

[root@ACA8D5EF ~]# yum install epel-release

Ansible依賴python環境,同時,Ansible已是RHEL/Centos的一個組成部分,所以推薦經過yum安裝ansible:

[root@ACA8D5EF ~]# yum install ansible

1.三、 ansible的命令套件

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

(1)、ansible

ansible是指令核心部分,其主要用於執行ad-hoc命令,即單條命令。默認後面須要跟主機和選項部分,默認不指定模塊時,使用的是command模塊。

(2)、ansible-doc

該指令用於查看模塊信息,經常使用參數有兩個-l 和 -s ,具體以下:
例如,列出全部已安裝的模塊:

# ansible-doc -l

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

# ansible-doc -s command

(3)、ansible-galaxy

ansible-galaxy 指令用於方便的從https://galaxy.ansible.com/ 站點下載第三方擴展模塊,能夠形象的理解其相似於centos下的yum、python下的pip或easy_install 。

(4)、ansible-lint

ansible-lint是對playbook的語法進行檢查的一個工具。用法是ansible-lint playbook.yml 。

(5)、ansible-playbook

該指令是使用最多的指令,其經過讀取playbook 文件後,執行相應的動做,這個後面會作爲一個重點來說。

(6)、ansible-pull

該指令使用須要談到ansible的另外一種模式:pull 模式,這和日常常常用的push模式恰好相反,其適用於如下場景:
有數量巨大的機器須要配置,即便使用很是高的線程仍是要花費不少時間
要在一個沒有網絡鏈接的機器上運行Anisble,好比在啓動以後安裝。

(7)、ansible-vault

ansible-vault主要應用於配置文件中含有敏感信息,又不但願被人看到,vault能夠幫你加密/解密這個配置文件,屬高級用法。主要對於playbooks裏好比涉及到配置密碼或其餘變量時,能夠經過該指令加密,這樣咱們經過cat看到的是一個密碼串類的文件,編輯的時候須要輸入事先設定的密碼才能打開。這種playbook文件在執行時,須要加上 –ask-vault-pass參數,一樣須要輸入密碼後才能正常執行。

注:上面七個指令,用的最多的只有兩個ansible 和ansible-playbook ,這兩個必定要掌握,其它五個屬於拓展或高級部分。

2、 ansible架構與運行原理
2.一、 ansible基本架構

下圖是ansible的基本架構:

下面介紹下每一個組成部分的含義:

核心:ansible

核心模塊(Core Modules):是ansible自帶的模塊,Ansible模塊資源分發到遠程節點使其執行特定任務或匹配一個特定的狀態。

擴展模塊(Custom Modules):若是核心模塊不足以完成某種功能,能夠添加擴展模塊。

插件(Plugins):完成較小型的任務。輔助模塊來完成某個功能。

劇本(Playbooks):ansible的任務配置文件,將多個任務定義在劇本中,由ansible自動執行。例如安裝一個nginx服務,那麼咱們能夠把這拆分爲幾個任務放到一個playbook中。例如:第一步須要下載nginx的安裝包。第二步我可能考慮須要作的就是將我事先寫好的nginx.conf的配置文件下發的目標服務器上。第三步,咱們須要把服務啓動起來。第四步,咱們可能須要檢查端口是否正常開啓。那麼這些步驟能夠經過playbook來進行整合,而後經過inventory來下發到想要執行劇本的主機上。

鏈接插件(Connectior Plugins):ansible基於鏈接插件鏈接到各個主機上,默認是基於SSH鏈接到目標機器上執行操做的,可是它還支持其餘的鏈接方法,因此須要有鏈接插件,管理端支持local 、ssh、 paramiko三種方式鏈接被管理端。

主機清單(Host Inventory):定義ansible管理主機的策略,通常小型環境下只須要在host文件中寫入主機的IP地址便可,可是到了中大型環境就須要使用靜態inventory或者動態主機清單來生所須要執行的目標主機。

2.二、 ansible任務執行模式

ansible執行自動化任務,分爲兩種執行模式:

一、ad-hoc:單個模塊,單條命令的批量執行,稱之爲ad-hoc
二、playbook:這個能夠理解成爲面向對象的編程,就像上面舉例那樣能夠把多個想要執行的任務放到一個playbook中,固然多個任務在事物邏輯上最好是有上下聯繫的。經過多個任務能夠完成一個整體的目標,這就是playbook。

3、 ansible主機和組的配置
3.一、簡單的主機和組

ansible的配置文件位於/etc/ansible目錄下,主要有ansible.cfg、hosts文件。本節重點介紹主機與組定義文件/etc/ansible/hosts.

/etc/ansible/hosts最簡單的格式以下:

www.ixdba.net [webservers] ixdba1.net ixdba2.net [dbservers] db.ixdba1.net db.ixdba2.net

中括號中的名字表明組名,能夠根據需求將龐大的主機分紅具備標識的組,如上面分了兩個組webservers和dbservers組;

主機(hosts)部分可使用域名、主機名、IP地址表示;固然使用前二者時,也須要主機能反解析到相應的IP地址,通常此類配置中多使用IP地址;

未分組的機器需保留在hosts的頂部。

3.二、指定主機範圍

可在/etc/ansible/hosts文件中,指定主機的範圍,示例以下:

[web] www[01:50].ixdba.net [db] db[a:f].ixdba.net

3.三、主機變量

如下是Hosts部分中常常用到的變量部分:

ansible_ssh_host #用於指定被管理的主機的真實IP
ansible_ssh_port #用於指定鏈接到被管理主機的ssh端口號,默認是22
ansible_ssh_user #ssh鏈接時默認使用的用戶名
ansible_ssh_pass #ssh鏈接時的密碼
ansible_sudo_pass #使用sudo鏈接用戶時的密碼
ansible_sudo_exec #若是sudo命令不在默認路徑,須要指定sudo命令路徑
ansible_ssh_private_key_file #祕鑰文件路徑,祕鑰文件若是不想使用ssh-agent管理時可使用此選項
ansible_shell_type #目標系統的shell的類型,默認sh
ansible_connection #SSH 鏈接的類型:local , ssh , paramiko,在 ansible1.2以前默認是 paramiko ,後來智能選擇,優先使用基於ControlPersist 的ssh
ansible_pythoninterpreter #用來指定python解釋器的路徑,默認爲/usr/bin/python 一樣能夠指定ruby 、perl的路徑
ansible_interpreter #其餘解釋器路徑,用法與ansible_python_interpreter相似,這裏」」能夠是ruby或perl等其它語言

例子1:

[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

例子2:

[webhost] host1 host2 [dbhost] host2 host3 [allhosts:children] webhost Dbhost

主機組能夠包含主機組,主機的變量能夠經過繼承關係,繼承到最高等級的組的變量。定義主機組之間的繼承關係咱們使用」:children」來表示.

4、 ansible.cfg與默認配置
/etc/ansible/ansible.cfg文件中定義了ansible的主機的默認配置部分,如默認是否須要輸入密碼、是否開啓sudo認證、action_plugins插件的位置、hosts主機組的位置、是否開啓log功能、默認端口、key文件位置等等。

#inventory = /etc/ansible/hosts 該參數表示資源清單inventory文件的位置,資源清單就是一些Ansible須要鏈接管理的主機列表

#library = /usr/share/my_modules/ Ansible的操做動做,不管是本地或遠程,都使用一小段代碼來執行,這小段代碼稱爲模塊,這個library參數就是指向存放Ansible模塊的目錄

#module_utils = /usr/share/my_module_utils/

#remote_tmp = ~/.ansible/tmp 指定遠程執行的路徑

#local_tmp = ~/.ansible/tmp ansible管理節點的執行路徑

#forks = 5 forks 設置默認狀況下Ansible最多能有多少個進程同時工做,默認設置最多5個進程並行處理。具體須要設置多少個,能夠根據控制主機的性能和被管理節點的數量來肯定。

#poll_interval = 15 輪詢間隔

#sudo_user = root sudo使用的默認用戶 ,默認是root

#ask_sudo_pass = True 是否須要用戶輸入sudo密碼

#ask_pass = True 是否須要用戶輸入鏈接密碼

#remote_port = 22 這是指定鏈接對端節點的管理端口,默認是22,除非設置了特殊的SSH端口,否則這個參數通常是不須要修改的

#module_lang = C 這是默認模塊和系統之間通訊的計算機語言,默認爲’C’語言.
host_key_checking = False 跳過ssh首次鏈接提示驗證部分,False表示跳過。

#timeout = 10 鏈接超時時間

#module_name = command 指定ansible默認的執行模塊

#nocolor = 1 默認ansible會爲輸出結果加上顏色,用來更好的區分狀態信息和失敗信息.若是你想關閉這一功能,能夠把’nocolor’設置爲‘1’:

#private_key_file=/path/to/file.pem 在使用ssh公鑰私鑰登陸系統時候,使用的密鑰路徑。

5、 Ad-hoc與commands模塊
5.一、Ad-Hoc 執行格式

Ad-Hoc 是指ansible下臨時執行的一條命令,而且不須要保存的命令,對於複雜的命令後面會講用playbook。講到Ad-hoc 就要提到模塊,全部的命令執行都要依賴於事先寫好的模塊,默認安裝好的ansible裏面已經自帶了不少模塊,如:command、raw、shell、file、cron等,具體能夠經過ansible-doc -l 進行查看 。

ansible命令的經常使用選項:

-m MODULE_NAME:指定要執行的模塊的名稱,若是不指定-m選項,默認是COMMAND模塊。
-a MODULE_ARGS,:指定執行模塊對應的參數選項。
-k:提示輸入SSH登陸的密碼而不是基於密鑰的驗證
-K:用於輸入執行su或sudo操做時須要的認證密碼。
-b:表示提高權限操做。
–become-method:指定提高權限的方法,經常使用的有 sudo和su,默認是sudo。
–become-user:指定執行 sudo或su命令時要切換到哪一個用戶下,默認是root用戶。
-B SECONDS:後臺運行超時時間
-C:測試一下會改變什麼內容,不會真正去執行,主要用來測試一些可能發生的變化
-f FORKS,:設置ansible並行的任務數。默認值是5
-i INVENTORY: 指定主機清單文件的路徑,默認爲/etc/ansible/hosts。

一個ad-hoc命令的執行,須要按如下格式進行執行:

ansible 主機或組   -m  模塊名  -a '模塊參數' ansible參數

主機和組:是在/etc/ansible/hosts 裏進行指定的部分,固然動態Inventory使用的是腳本從外部應用裏獲取的主機。

模塊名:能夠經過ansible-doc -l 查看目前安裝的模塊,默認不指定時,使用的是command模塊,具體能夠查看/etc/ansible/ansible.cfg 的「#module_name = command 」 部分,默認模塊能夠在該配置文件中進行修改;

模塊參數:能夠經過 「ansible-doc 模塊名」 查看具體的用法及後面的參數;

ansible參數:能夠經過ansible命令的幫忙信息裏查看到,這裏有不少參數能夠供選擇,如是否須要輸入密碼、是否sudo等。

5.二、commands模塊

command模塊包含以下選項:

creates:一個文件名,當該文件存在,則該命令不執行,反正,則執行。
free_form:要執行的linux指令
chdir:在執行指令以前,先切換到該指定的目錄
removes:一個文件名,當該文件存在時,則該選項執行,反之,不執行。

注意:commands模塊的執行,在遠程主機上,須要有python環境的支持。

該模塊經過-a跟上要執行的命令能夠直接執行,不過命令裏若是有帶有特殊字符( 「<「, 「>」, 「|」, 「&」等)那麼則執行不成功。

5.三、shell 模塊

在遠程節點上執行命令,用法和command同樣,不過shell模塊執行命令的時候使用的是/bin/sh,因此shell模塊能夠執行任何命令。

ansible 172.16.213.233 -m shell -a 'ps -ef|grep sshd' ansible 172.16.213.233 -m shell -a 'sh /tmp/install.sh >/tmp/install.log'

上面這個命令是執行遠程機器上的腳本,腳本路徑爲/tmp/install.sh(遠程主機上的腳本,非本機的),而後將執行命令的結果存放在遠程主機路徑/tmp/install.log中,注意在進行保存文件的時候,寫上全路徑,不然就會保存在登陸以後的默認路徑中。

官方上說,command用起來更安全,更有可預知性。

5.四、raw模塊

raw模塊功能相似與前面說的command、shell可以完成的操做,raw也都能完成。不一樣的是,raw模塊不須要遠程主機上的python環境。

ansible要執行自動化操做,須要管理機上裝ansible,客戶機上也須要安裝python,若是客戶機上沒有安裝python模塊,那麼command、shell模塊將沒法工做,而raw卻能夠正常工做,所以,若是有的機器是沒有裝python,或者說安裝的python版本在python2.4如下,就可使用raw模塊來裝python、python-simplejson等。

若是有些機器壓根就裝不了python的話(好比交換機,路由器等),那麼,直接用raw模塊是最好的選擇。

舉例:

ansible 172.16.213.233 -m raw -a 「ps -ef|grep sshd|awk ‘{print \$2}’ 」 ansible 172.16.213.107 -m raw -a "yum -y install python26" -k

raw模塊和comand、shell模塊不一樣的還有:raw沒有chdir、creates、removes參數

[root@localhost ansible]# ansible 172.16.213.157 -m command -a 'chdir=/tmp touch test1.txt' -k [root@localhost ansible]# ansible 172.16.213.157 -m shell -a 'chdir=/tmp touch test2.txt' -k [root@localhost ansible]# ansible 172.16.213.157 -m raw -a 'chdir=/tmp touch test3.txt' -k

5.五、script模塊

script模塊是將管理端的shell腳本拷貝到被管理的遠程主機上執行,其原理是先將shell複製到遠程主機,再在遠程主機上執行,此模塊的執行,也不須要遠程主機上的python環境。

ansible 172.16.213.233 -m script -a 'sh /tmp/install1.sh >/tmp/install.log'

腳本/tmp/install1.sh在管理端本機上,script 模塊執行的時候將腳本傳送到遠程的172.16.213.233主機中,而後執行這個腳本,同時,將執行的輸出日誌文件保存在遠程主機對應的路徑/tmp/install.log下,這裏保存日誌文件的時候,最好用全路徑。

6、 ansible其它經常使用功能模塊
6.一、ping模塊

測試主機是不是通的,用法很簡單,不涉及參數:

[root@361way ~]# ansible 172.16.213.170 -m ping 172.16.213.170 | SUCCESS => { "changed": false, "ping": "pong" }

6.二、file模塊

file模塊主要用於遠程主機上的文件操做,file模塊包含以下選項:

force:須要在兩種狀況下強制建立軟連接,一種是源文件不存在但以後會創建的狀況下;另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no
group:定義文件/目錄的屬組
mode:定義文件/目錄的權限
owner:定義文件/目錄的屬主
path:必選項,定義文件/目錄的路徑
recurse:遞歸的設置文件的屬性,只對目錄有效
src:要被連接的源文件的路徑,只應用於state=link的狀況
dest:被連接到的目標路徑,只應用於state=link的狀況
state: 有以下幾個選項:
directory:表示目錄,若是目錄不存在,則建立目錄。
link:建立軟連接
hard:建立硬連接
touch:若是文件不存在,則會建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間
absent:刪除目錄、文件或者取消連接文件。

使用示例:

ansible 172.16.213.233 -m file -a "path=/mnt/abc123 state=directory" ansible 172.16.213.233 -m file -a "path=/mnt/abc123 owner=nobody group=nobody mode=0644 recurse=yes" ansible 172.16.213.233 -m file -a "path=/mnt/syncfile.txt owner=sshd group=sshd mode=0644" ansible 172.16.213.233 -m file -a "path=/mnt/syncfile.txt mode=0444" ansible 172.16.213.233 -m file -a "src=/etc/ssh/sshd_config dest=/mnt/sshd_config owner=sshd state=link" ansible 172.16.213.233 -m file -a "path=/tmp/backup.tar.gz state=absent" ansible 172.16.213.233 -m file -a "path=/tmp/ansibletemp state=touch"

6.三、copy模塊

Copy模塊用於複製文件到遠程主機,copy模塊包含以下選項:

backup:在覆蓋以前將原文件備份,備份文件包含時間信息。有兩個選項:yes|no
content:用於替代」src」,能夠直接設定指定文件的值
dest:必選項。要將源文件複製到的遠程主機的絕對路徑,若是源文件是一個目錄,那麼該路徑也必須是個目錄
directory_mode:遞歸的設定目錄的權限,默認爲系統默認權限
force:若是目標主機包含該文件,但內容不一樣,若是設置爲yes,則強制覆蓋,若是爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes
others:全部的file模塊裏的選項均可以在這裏使用
src:要複製到遠程主機的文件在本地的地址,能夠是絕對路徑,也能夠是相對路徑。若是路徑是一個目錄,它將遞歸複製。在這種狀況下,若是路徑使用」/」來結尾,則只複製目錄裏的內容,若是沒有使用」/」來結尾,則包含目錄在內的整個內容所有複製,相似於rsync。

copy模塊舉例:

ansible 172.16.213.233 -m copy -a 'src=/etc/sudoers dest=/app/sudoers owner=root group=root mode=440 backup=yes' ansible 172.16.213.233 -m copy -a "src=/etc/sudoers dest=/app/sudoers validate='visudo -cf %s'" ansible 172.16.213.233 -m copy -a 'src=/etc/yum dest=/app/ owner=root group=root directory_mode=644' ansible 172.16.213.233 -m copy -a 'src=/etc/yum/ dest=/app/bak owner=root group=root directory_mode=644'

6.四、service模塊

用於管理遠程主機上的服務,該模塊包含以下選項:

enabled:是否開機啓動 yes|no
name:必選項,服務名稱
pattern:定義一個模式,若是經過status指令來查看服務的狀態時,沒有響應,就會經過ps指令在進程中根據該模式進行查找,若是匹配到,則認爲該服務依然在運行
sleep:若是執行了restarted,在則stop和start之間沉睡幾秒鐘
state:對當前服務執行啓動,中止、重啓、從新加載等操做(started,stopped,restarted,reloaded)

使用示例:

ansible 172.16.213.233 -m service -a "name=httpd state=started" ansible 172.16.213.233 -m service -a "name=httpd enabled=yes"

6.五、cron模塊

用於管理計劃任務,包含以下選項:

backup:對遠程主機上的原任務計劃內容修改以前作備份
cron_file:用來指定一個計劃任務文件,也就是將計劃任務寫到遠程主機上/etc/cron.d目錄下,建立一個文件對應的計劃任務。
day:日(1-31,,/2,……)
hour:小時(0-23,,/2,……)
minute:分鐘(0-59,,/2,……)
month:月(1-12,,/2,……)
weekday:周(0-7,*,……)
job:要執行的任務,依賴於state=present
name:定義定時任務的描述信息
special_time: 特殊的時間範圍,參數:reboot(重啓時),annually(每一年),monthly(每個月),weekly(每週),daily(天天),hourly(每小時)
state:確認該任務計劃是建立仍是刪除,有兩個值可選,分別是present和absent,present表示建立定時任務,absent表示刪除定時任務,默認爲present。
user:以哪一個用戶的身份執行job指定的任務。

使用示例:

ansible 172.16.213.233 -m cron -a 'name="job for reboot" special_time=reboot job="/data/bootservice.sh"' ansible 172.16.213.233 -m cron -a 'name="yum autoupdate" weekday="6" minute=20 hour=1 user="root" job="yum -y update"' ansible 172.16.213.233 -m cron -a 'backup="True" name="autobackup" weekday="6" minute=30 hour=1 user="root" job="/home/ixdba/backup.sh"' ansible 172.16.213.233 -m cron -a 'name="checkhttp" minute=30 hour=12 user="root" job="/home/ixdba/check_http.sh" cron_file="check_http_for_ansible" ' ansible 172.16.213.233 -m cron -a 'name="yum autoupdate" state=absent'

6.六、yum模塊

使用yum包管理器來管理軟件包,其選項有:

config_file:yum的配置文件
disable_gpg_check:關閉gpg_check
disablerepo:不啓用某個源
enablerepo:啓用某個源
name:要進行操做的軟件包的名字,也能夠傳遞一個url或者一個本地的rpm包的路徑
state:表示要安裝仍是刪除軟件包,要安裝軟件包,可選擇present(安裝)、installed(安裝)、 latest(安裝最新版本),刪除軟件包可選擇absent、removed。

示例以下:

ansible 172.16.213.77 -m yum -a "name=redis state=installed" ansible 172.16.213.77 -m yum -a "name=redis state=removed" ansible 172.16.213.77 -m yum -a "name=redis state=latest enablerepo=epel" ansible 172.16.213.77 -m yum -a " name=http://mirrors.aliyun.com/centos/7.4.1708/os/x86_64/Packages/bash-4.2.46-28.el7.x86_64.rpm state=present "

6.七、user模塊與group模塊

user模塊是請求的是useradd, userdel, usermod三個指令,goup模塊請求的是groupadd, groupdel, groupmod 三個指令。

name # 指定用戶名
group # 指定用戶的主組
groups # 指定附加組,若是指定爲(‘groups=’)表示刪除全部組。
shell # 指定默認shell
state #設置賬號狀態,不指定爲默認爲present,表示建立,指定值爲absent表示刪除
remove #當使用狀態爲state=absent時使用,相似於userdel –remove選項。

示例:

ansible 172.16.213.77 -m user -a "name=testuser1" ansible 172.16.213.77 -m user -a "name=testuser2 groups=admins,developers" //添加用戶時,同時添加附組 ansible 172.16.213.77 -m user -a "name=testuser3 state=absent remove=yes" //刪除用戶的同時 ,刪除用記家目錄

批量修改用戶密碼:

echo "123456" | openssl passwd -1 -salt $(< /dev/urandom tr -dc '[:alnum:]' | head -c 32) -stdin $1$yjJ74Wid$x0QUaaHzA8EwWU2kG6SRB1 ansible 172.16.213.77 -m user -a 'name=testuser1 password="$1$Kklap7y3$3AYJdqrcmZUMt9W2/MYE4." '

-1:表示採用的是MD5加密算法。
-salt:指定salt值。在使用加密算法進行加密時,即便密碼同樣,salt不同,所計算出來的hash值也不同,除非密碼同樣,salt值也同樣,計算出來的hash值才同樣。
「< /dev/urandom tr -dc ‘[:alnum:]’ | head -c 32「產生一個隨機的salt。

passwd的值不能是明文,passwd關鍵字後面應該是密文,且密文將被保存在/etc/shadow文件中。

6.八、synchronize模塊

此模塊經過調用rsync進行文件或目錄同步。

archive:歸檔,至關於同時開啓recursive(遞歸),links,perms,itmes,owner,group,-D選項都爲yes,默認該選項爲開啓
checksum:跳過檢測sum值,默認關閉
compress:是不開啓壓縮,默認開啓
copy_links:複製連接文件,默認爲no,注意後面還有一個links參數
delete:刪除不存在的文件,默認爲no
dest:目錄路徑
dest_prot:默認爲22,ssh協議
mode:push和pull模塊,push模塊的話,通常用於從本機向遠程主機上傳文件,pull模式用於從遠程主機上拉取文件

示例:

ansible 172.16.213.77 -m synchronize -a 'src=/mnt/a dest=/tmp' ansible 172.16.213.77 -m synchronize -a 'mode=pull src=/mnt/a dest=/tmp'

6.九、setup模塊

setup模塊,主要用於獲取主機信息,在playbooks裏常常會用到的一個參數gather_facts就與該模塊相關。setup模塊下常用的一個參數是filter參數,具體使用示例以下(因爲輸出結果較多,這裏只列命令不寫結果):

[root@linux ~]# ansible 172.16.213.77 -m setup -a 'filter=ansible_*_mb' 表示查看主機內存信息
[root@linux ~]# ansible 172.16.213.77 -m setup -a 'filter=ansible_em[1-2]' 表示查看地接口爲em1-2的網卡信息
[root@linux ~]# ansible all -m setup --tree /tmp/facts 表示將全部主機的信息輸入到/tmp/facts目錄下,每臺主機的信息輸入到主機名文件中(/etc/ansible/hosts裏的主機名)

6.十、get_url模塊

該模塊主要用於從http、ftp、https服務器上下載文件(相似於wget),主要有以下選項:

sha256sum:下載完成後進行sha256 check;
timeout:下載超時時間,默認10s
url:下載的URL
url_password、url_username:主要用於須要用戶名密碼進行驗證的狀況
use_proxy:表示使用代理,代理需事先在環境變動中定義

示例:

ansible 172.16.213.77 -m get_url -a "url=http://172.16.213.157/Python-2.7.14.tgz dest=/mnt/python-2.7.14.tgz"

7、 ansible-playbook的使用
7.一、playbook簡介

playbook字面意思,即劇本,現實中由演員按照劇本表演,在Ansible中,此次由計算機進行表演,由計算機安裝,部署應用,提供對外服務,以及組織計算機處理各類各樣的事情。

那麼爲何要使用playbook呢?

執行一些簡單的任務,使用ad-hoc命令能夠方便的解決問題,可是有時一個設施過於複雜,須要大量的操做時候,執行的ad-hoc命令是不適合的,這時最好使用playbook,就像執行shell命令與寫shell腳本同樣,也能夠理解爲批處理任務,不過playbook有本身的語法格式。

7.二、playbook文件的格式

playbook文件由YAML語言編寫。 YAML是一個相似 XML、JSON的標記性語言,YAML強調以數據爲中心,並非以標識語言爲重點。於是YAML自己的定義比較簡單,號稱「一種人性化的數據格式語言」。首先學習瞭解一下YAML的格式,對後面書寫playbook頗有幫助。

如下爲playbook經常使用到的YAML格式規範。

大小寫敏感
使用空格做爲嵌套縮進工具,縮進時不容許使用Tab鍵
縮進的空格數目不重要,只要相同層級的元素左側對齊便可
使用「-」(橫線) + 單個空格:表示單個列表項
使用 「:」(冒號) + 空格:表示單個鍵值對
使用」{}」表示一個鍵值表
文件的第一行應該以 」—」 (三個連字符)開始,代表YMAL文件的開始。
在同一行中,#以後的內容表示註釋,相似於shell,python和ruby。
YMAL中的列表元素以」-」開頭而後緊跟着一個空格,後面爲元素內容。
同一個列表中的元素應該保持相同的縮進。不然會被當作錯誤處理。
play中hosts,variables,roles,tasks等對象的表示方法都是鍵值中間以」:」分隔表示,」:」後面還要增長一個空格。

下面是yaml文件的格式:

--- # 文檔開始
- 第一章 簡介 - 第二章 設計目錄 # 客戶訂單 date: 2018-09-30 customer:  - name: Jai items: - no: 1234 #訂單號 - descript: cpu

下面是Playbook文件格式例子:

- apple - banana - Orange service: name=httpd state=restarted

等價於JSON的這種格式:

[
 「apple」,
 「banana」,
 「orange」
]

playbook文件是經過ansible-playbook命令進行解析的,ansbile-playbook命令會根據自上而下的順序依次執行playbook文件中的內容。同時,playbook開創了不少特性,它能夠容許傳輸某個命令的狀態到後面的指令,它也能夠從一臺機器的文件中抓取內容並附爲變量,而後在另外一臺機器中使用,這使得playbook能夠實現一些複雜的部署機制,這是ansible命令沒法實現的。

7.三、playbook的構成

playbook是由一個或多個「play」組成的列表。play的主要功能在於,將事先合併爲一組的主機裝扮成事先經過ansible定義好的角色。將多個play組織在一個playbook中就可讓它們聯同起來按事先編排的機制完成一系列複雜的任務。

其主要有如下四部分構成

target部分: 定義將要執行 playbook 的遠程主機組
variable部分: 定義playbook運行時須要使用的變量
task部分: 定義將要在遠程主機上執行的任務列表
handler部分: 定義task 執行完成之後須要調用的任務

而其對應的目錄層爲五個(視狀況可變化),分別爲:

vars 變量層
tasks 任務層
handlers 觸發條件
files 文件
template 模板

7.四、playbook的語法詳解

(1)、Hosts和Users

playbook中的每個play的目的都是爲了讓某個或某些主機以某個指定的用戶身份執行任務。

hosts:用於指定要執行指定任務的主機,每一個playbook都必須指定hosts,hosts也可使用通配符格式。主機或主機組在inventory清單中指定,可使用系統默認的/etc/ansible/hosts,也能夠本身編輯,在運行的時候加上-i選項,可指定自定義主機清單的位置。在運行清單文件的時候,–list-hosts選項會顯示那些主機將會參與執行任務的過程當中。

remote_user:用於指定在遠程主機上執行任務的用戶。能夠指定任意用戶,也可使用sudo,可是用戶必需要有執行相應任務的權限。

(2)、任務列表(tasks list)

play的主體部分是task list。

task list中的各任務按次序逐個在hosts中指定的全部主機上執行,即在全部主機上完成第一個任務後再開始第二個。在運行自上而下某playbook時,若是中途發生錯誤,則全部已執行任務都將回滾,所以在更正playbook後須要從新執行一次。

task的目的是使用指定的參數執行模塊,而在模塊參數中可使用變量。模塊執行是冪等的(冪等性; 即一個命令,即便執行一次或屢次, 其結果也同樣),這意味着屢次執行是安全的,由於其結果均一致。tasks包含name和要執行的模塊,name是可選的,只是爲了便於用戶閱讀,建議加上去,模塊是必須的,同時也要給予模塊相應的參數。

定義tasks推薦使用module: options」的格式,例如:
service: name=httpd state=running

(3)、handlers

用於當關注的資源發生變化時採起必定的操做。handlers是和「notify」配合使用的。

「notify」這個動做可用於在每一個play的最後被觸發,這樣能夠避免屢次有改變發生時,每次都執行指定的操做,經過「notify」,僅在全部的變化發生完成後一次性地執行指定操做。
在notify中列出的操做稱爲handler,也就是說notify用來調用handler中定義的操做。

注意:在 notify中定義的內容必定要和handlers中定義的「 - name」內容同樣,這樣才能達到觸發的效果,不然會不生效。

(4)、tags

tags用於讓用戶選擇運行或略過playbook中的部分代碼。ansible具備冪等性,所以會自動跳過沒有變化的部分;可是當一個playbook任務比較多時,一個一個的判斷每一個部分是否發生了變化,也須要很長時間。所以,若是肯定某些部分沒有發生變化,就能夠經過tags跳過這些代碼片段。

7.五、Playbook執行結果解析

使用ansible-playbook運行playbook文件,輸出的內容爲JSON格式。而且由不一樣顏色組成,便於識別。通常而言,輸出內容中:

綠色表明執行成功,但系統保持原樣
黃色表明系統狀態發生改變,也就是執行的操做生效
紅色表明執行失敗,會顯示錯誤信息。

一個簡單的playbook文件:

- name: create user hosts: 172.16.213.233 user: root gather_facts: false vars: - user1: "testuser" tasks: - name: start createuser user: name="{{ user1 }}"

上面的playbook 實現的功能是新增一個用戶:

name參數對該playbook實現的功能作一個概述,後面執行過程當中,會輸出name的值;
hosts參數指定了對哪些主機進行操做。
user參數指定了使用什麼用戶登陸到遠程主機進行操做。
gather_facts參數指定了在下面任務執行前,是否先執行setup模塊獲取主機相關信息,這在後面的task會使用到setup獲取的信息時須要用到。
vars參數,指定了變量,這裏指字一個user1變量,其值爲testuser,須要注意的是,變量值必定要用引號括起來。
tasks指定了一個任務,其下面的name參數一樣是對任務的描述,在執行過程當中會打印出來。user是一個模塊,user後面的name是user模塊裏的一個參數,而增長的用戶名字調用了上面user1變量的值。

7.六、收集facts信息

facts組件是Ansible用於採集被管理機器設備信息的一個功能。可使用setup模塊查機器的全部facts信息,facts信息包括遠端主機發行版,IP地址,CPU核數,系統架構,主機名等等,可使用filter來查看指定信息。整個facts信息被包裝在一個json格式的數據結構中。

[root@ansible playbook]# ansible 172.16.213.233 -m setup

全部數據格式都是JSON格式,facts還支持查看指定信息,以下所示:

[root@ansible playbook]# ansible 172.16.213.233 -m setup -a 'filter=ansible_all_ipv4_addresses'

playbook在執行的時候,默認的第一個tasks就是收集遠端被管主機的facts信息,若是後面的task不會使用到setup獲取的信息時,能夠禁止ansible收集facts,在playbook中的hosts指令下面設置「gather_facts: false」便可。默認gather_facts的值爲true。

facts常常被用在條件語句和模板當中,也能夠用於根據指定的標準建立動態主機組。

7.七、經過playbook自動化部署zabbix agent應用案例

下面是經過playbook自動化部署zabbix agent的一個yaml文件,內容以下:

- hosts: dlab
  remote_user: root
  gather_facts: yes
  vars:
     IPDD: "{{ ansible_default_ipv4['address'] }}" tasks: - name: update bash in cetnos 7 version yum: name=https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm state=present when: ansible_distribution == 'CentOS' and ansible_distribution_major_version == "7" - name: update bash in cetnos 6 version yum: name=https://repo.zabbix.com/zabbix/4.0/rhel/6/x86_64/zabbix-agent-4.0.1-1.el6.x86_64.rpm state=present when: ansible_distribution == 'CentOS' and ansible_distribution_major_version == "6" - name: Cofiguration zabbix-agent copy: src=/app/zabbix_agentd.conf dest=/etc/zabbix/zabbix_agentd.conf tags: zabbix_agentd.conf - name: modif zabbix-agent.conf lineinfile: dest=/etc/zabbix/zabbix_agentd.conf regexp=^Hostname=myip line=Hostname={{ IPDD }} tags: zabbix_agentd.conf - name: Start zabbix-agent service: name=zabbix-agent state=started enabled=yes tags: start zabbix-agent

這個playbook首先定義了一個主機組dlab,而後開啓了gather_facts,接着,定義了一個變量IPDD,而後開始執行任務,第一個任務根據操做系統版本不一樣,安裝不一樣的zabbix-agent,這裏只涉及到了centos6.x和7.x版本,而後,將本地/app/zabbix_agentd.conf文件拷貝到遠程dlab主機組,這是配置zabbix-agent,接下來,開始修改zabbix_agentd.conf文件中的內容,這裏用到了lineinfile模塊,這是個文件操做模塊,它可使用一個正則表達式替換、刪除一個現有的行。最後一個任務是啓動zabbix-agent服務。

好啦,自動化部署zabbix-agent,經過ansible就能夠很輕鬆愉快的搞定了,而主機在部署zabbix之後,zabbix中能夠經過開啓自動發現功能,讓zabbix web自動發現部署的主機,而後自動加入到zabbix web監控中,這樣,從部署到主機接入zabbix web監控都是自動完成了。

相關文章
相關標籤/搜索