企業級自動化運維工具——ansible

ansible是什麼


​ ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
​ ansible是基於 paramiko 開發的,並且基於模塊化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。ansible不需要在遠程主機上安裝client/agents,因爲它們是基於ssh來和遠程主機通訊的。ansible目前已經已經被紅帽官方收購,是自動化運維工具中大家認可度最高的,並且上手容易,學習簡單。是每位運維工程師必須掌握的技能之一。

ansible特點


1、部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
2、默認使用SSH協議對設備進行管理;
3、有大量常規運維操作模塊,可實現日常絕大部分操作。
4、配置簡單、功能強大、擴展性強;
5、支持API及自定義模塊,可通過Python輕鬆擴展;
6、通過Playbooks來定製強大的配置、狀態管理;
7、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
8、提供一個功能強大、操作性強的Web管理界面和REST API接口——AWX平臺。

ansible架構圖


企業級自動化運維工具——ansible

Ansible:Ansible核心程序。
HostInventory:記錄由Ansible管理的主機信息,包括端口、密碼、ip等。
Playbooks:“劇本”YAML格式文件,多個任務定義在一個文件中,定義主機需要調用哪些模塊來完成的功能。
CoreModules:核心模塊,主要操作是通過調用核心模塊來完成管理任務。
CustomModules:自定義模塊,完成核心模塊無法完成的功能,支持多種語言。
ConnectionPlugins:連接插件,Ansible和Host通信使用

ansible任務執行模式


Ansible系統由控制主機對被管節點的操作方式可分爲兩類,即ad-hoc和playbook:

·ad-hoc模式使用單個模塊,支持批量執行單條命令。 ad-hoc 命令是一種可以快速輸入的命令,而且不需要保存起來的命令。就相當於bash中的一句話shell。

·playbook模式是Ansible主要管理方式,也是Ansible功能強大的關鍵所在。playbook通過多個task集合完成一類功能,如Web服務的安裝部署、數據庫服務器的批量備份等。可以簡單地把playbook理解爲通過組合多條ad-hoc操作作的配置文件。

ansible架構圖2


企業級自動化運維工具——ansible

ansible執行流程


企業級自動化運維工具——ansible

簡單理解就是Ansible在運行時,首先讀取ansible.cfg中的配置,根據規則獲取Inventory中的管理主機列表,並行的在這些主機中執行配置的任務,最後等待執行返回的結果。

Ansible命令執行過程


1、加載自己的配置文件 默認/etc/ansible/ansible.cfg
2、查找對應的主機配置文件,找到要執行的主機或者組
3、加載自己對應的模塊文件,如command
4、通過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器的
5、對應執行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件
6、給文件+x執行
7、執行並返回結果
8、刪除臨時py文件,sleep 0退出

ansible安裝方式


ansible安裝常用兩種方式,yum安裝和pip程序安裝

這裏提供二種安裝方式,任選一種即可
1使用yum安裝
yum install epel-release -y
yum install ansible –y

2 使用pip(python的包管理模塊)安裝pip install ansible ,如果沒pip,需先安裝pip.yum可直接安裝:
yum install python-pip
pip install ansible

ansible程序結構


安裝目錄
配置文件目錄:/etc/ansible/
執行文件目錄:/usr/bin/
Lib庫依賴目錄:/usr/lib/pythonX.X/site-packages/ansible/
Help文檔目錄:/usr/share/doc/ansible-X.X.X/
Man文檔目錄:/usr/share/man/man1/

(1).檢查環境變量ANSIBLE_CONFIG指向的路徑文件(export
ANSIBLE_CONFIG=/etc/ansible.cfg)
(2).~/.ansible.cfg,檢查當前目錄下的ansible.cfg配置文件
(3)./etc/ansible.cfg 檢查etc目錄的配置文件

Ansible配置文件


設置ansible.cfg配置參數,ansible有許多參數,下面列出常用的參數:

inventory: #這個參數表示資源清單inventory文件的位置,資源清單就是一些Ansible需要連接管理的主 機列表。這個參數的配置實例如下:
inventory = /etc/ansible/hosts

library:Ansible的操作動作,無論是本地或遠程,都使用一小段代碼來執行,這小段代碼稱爲模塊,這個library參數就是指向存放Ansible模塊的目錄。配置實例如下:
library = /usr/share/ansible
Ansible支持多個目錄方式,只要用冒號(:)隔開就可以,同時也會檢查當前執行playbook位置下的./library目錄。

forks: 設置默認情況下Ansible最多能有多少個進程同時工作, 從Ansible 1.3開始,fork數量默認自動設置爲主機數量或者潛在的主機數量,默認設置最多5個進程並行處理。具體需要設置多少個,可以根據控制主機的性能和被管節點的數量來確定,可能是 50或100。默認值5是非常保守的值,配置實例如下:
forks = 5

sudo_user:

這是默認執行命令的用戶,也可以在playbook中重新設置這個參數。配置實例如下:sudo_user=root

remote_port:

這是指定連接被管節點的管理端口,默認是22。除非設置了特殊的ssh端口,不然這個參數一般是不需要修改的。配置實例如下:remote_port = 22

一般在生產環境中 不建議使用ssh端口,可以更改端口,通過修改sshd的配置文件來修改端口,以防止***使用掃描工具掃描出默認端口從而進行***。

host_key_checking:

這是設置是否檢查ssh主機的密鑰。可以設置爲TRUE或False,關閉第一次連接沒有提示。配置實例如下:host_key_checking = False

timeout:

這是設置ssh連接的超時間隔,單位是秒。配置實例如下:timeout = 60

log_path:

Ansible系統默認是不記錄日誌的,如果想把Ansible系統的輸出記錄到日誌文件中,需要設置log_path來指定一個存儲Ansible日誌的文件。配置實例如下:

log_path = /var/log/ansible.log

另外需要注意,執行Ansible的用戶需要有寫入日誌的權限,模塊將會調用被管節點的syslog來記錄

Ansible主機清單


編輯/etc/ansible/hosts:

vim /etc/ansible/hosts定義方式:

1、直接指明主機地址或主機名:

green.example.com

blue.example.com

192.168.100.1

192.168.100.10

2、定義一個主機組[組名]把地址或主機名加進去
[mysql_test]
192.168.253.159
192.168.253.160
192.168.253.153

在IP分佈較合理時,組成員可以使用通配符來匹配,如下 192.168.2.[1:6] #表示匹配從192.168.2.1——192.168.2.6的主機

Ansible常用命令


/usr/bin/ansible:Ansibe AD-Hoc 臨時命令執行工具,常用於臨時命的執行

/usr/bin/ansible-doc:Ansible 模塊功能查看工具

/usr/bin/ansible-galaxy:下載/上傳優秀代碼或Roles模塊 的官網平臺,基於網絡的

/usr/bin/ansible-playbook:Ansible 定製自動化的任務集編排工具

/usr/bin/ansible-pull:Ansible遠程執行命令的工具,拉取配置而非推送配置(使用較少,海量機器時使用,對運維的架構能力要求較高)

/usr/bin/ansible-vault:Ansible 文件加密工具

/usr/bin/ansible-console:Ansible基於Linux Consoble界面可與用戶交互的命令執行工具

Ansible-doc命令

查看 ansible-doc 的使用說明:
一般用法:
ansible-doc -l 獲取模塊信息
ansible-doc -s MOD_NAME 獲取指定模塊的使用幫助

ansible-doc

-h Usage: ansible-doc [options] [module...]
Options:
-h, --help show this help message and exit # 顯示命令參數API文檔
-l, --list List available modules #列出可用的模塊
-M MODULE_PATH, --module-path=MODULE_PATH #指定模塊的路徑specify path(s) to module library (default=None)

-s, --snippet Show playbook snippet for specified module(s) #顯示playbook制定模塊的用法
--version show program's version number and exit # 顯示ansible-doc的版本號查看模塊列表:ion

ansible-doc -l

Ansible命令詳解

命令格式:

ansible <host-pattern>  [-f forks][-m module_name][-a args]

我們可以通過 ansible -h查看幫助

Usage: ansible <host-pattern> [options] Options:

-a MODULE_ARGS, --args=MODULE_ARGS 模塊的參數,如果執行默COMMAND的模塊,即是命令參數,如:“date”,“pwd”等等 module arguments 模塊參數

-k, --ask-pass ask for SSH password 登錄密碼,提示輸入SSH密碼而不是假設基於密鑰的驗證

--ask-su-pass ask for su password su切換密碼

-K, --ask-sudo-pass ask for sudo password 提示密碼使用sudo,sudo表示提權操作

--ask-vault-pass ask for vault password

-B SECONDS, --background=SECONDS 後臺運行超時時間

run asynchronously, failing after X seconds (default=N/A)

-C, --check don‘t make any changes; instead, try to predict some of the changes that may occur

只是測試一下會改變什麼內容,不會真正去執行;相反,試圖預測一些可能發生的變化

-c CONNECTION, --connection=CONNECTION 連接類型使用。。

connection type to use (default=smart)

-f FORKS, --forks=FORKS 並行任務數。NUM被指定爲一個整數,默認是5

specify number of parallel processes to use (default=5)

-h, --help show this help message and exit 打開幫助文檔API

-i INVENTORY, --inventory-file=INVENTORY 指定庫存主機文件的路徑,默認爲/etc/ansible/hosts

specify inventory host file (default=/etc/ansible/hosts)

--list-hosts outputs a list of matching hosts; does not execute anything else

-m MODULE_NAME, --module-name=MODULE_NAME 執行模塊的名字,默認使用 command 模塊,所以如

果是隻執行單一命令可以不用 -m參數module name to execute (default=command)

-M MODULE_PATH, --module-path=MODULE_PATH 要執行的模塊的路徑,默認爲/usr/share/ansible/

specify path(s) to module library (default=/usr/share/ansible/)

-o, --one-line condense output 壓縮輸出,摘要輸出.嘗試一切都在一行上輸出。

-P POLL_INTERVAL, --poll=POLL_INTERVAL 調查背景工作每隔數秒。需要- b

set the poll interval if using -B (default=15)

-o, --one-line condense output 壓縮輸出,摘要輸出.嘗試一切都在一行上輸出。

-P POLL_INTERVAL, --poll=POLL_INTERVAL 調查背景工作每隔數秒。需要-b

set the poll interval if using -B (default=15)

--private-key=PRIVATE_KEY_FILE 私鑰路徑,使用這個文件來驗證連接

use this file to authenticate the connection

-S, --su run operations with su 用 su 命令

-R SU_USER, --su-user=SU_USER 指定SU的用戶,默認是root用戶

run operations with su as this user (default=root)

-s, --sudo run operations with sudo (nopasswd)

-U SUDO_USER, --sudo-user=SUDO_USER sudo到哪個用戶,默認爲 root

desired sudo user (default=root)

-T TIMEOUT, --timeout=TIMEOUT 指定SSH默認超時時間, 默認是10S

override the SSH timeout in seconds (default=10)

-t TREE, --tree=TREE log output to this directory 將日誌內容保存在該輸出目錄,結果保存在一個文件中在每臺主機

上。

-u REMOTE_USER, --user=REMOTE_USER 遠程用戶, 默認是root用戶 connect as this user (default=root)

--vault-password-file=VAULT_PASSWORD_FILE vault password file

-v, --verbose verbose mode (-vvv for more, -vvvv to enable 詳細信息

connection debugging)

--version show program's version number and exit 輸出ansible的版本

配置ansible使用公鑰驗證


雖然ansible支持其他主機認證方式,但是我們最常用的的還是基於祕
鑰的認證:
1、首先生成祕鑰
ssh-keygen -t rsa -P ‘’
2、然後向主機分發祕鑰:
ssh-copy-id root@ #@後面跟主機名或者IP地址3、如果出現以下情況:
# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.6.72
-bash: ssh-copy-id: command not found請嘗試:
yum -y install openssh-clientsansible

Ansible常用模塊


1、主機連通性測試:
#ansible all -m ping執行效果如下:
[root@desperadochn ~]# ansible all -m ping
192.168.253.138 | SUCCESS => { “changed”: false,
“ping”: “pong” }
192.168.253.137 | SUCCESS => { "changed": false,
"ping": "pong" }
2、command:在遠程主機執行命令;不支持|管道命令
[root@desperadochn ~]# ansible all -m command -a ‘ifconfig’
192.168.253.137 | SUCCESS | rc=0 >>
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAS
T> mtu 1500
inet 192.168.253.137 netmask 255.255.255.0 broadcast 192.168.
253.255
inet6 fe80::20c:29ff:fef6:313f prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:f6:31:3f txqueuelen 1000 (Ethernet)
RX packets 296 bytes 97349 (95.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 267 bytes 78840 (76.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2、Command
命令模塊接受命令名稱,後面是空格分隔的列表參數。給定的命令將在
所有選定的節點上執行。它不會通過shell進行處理,比如$HOME和操
作如”小於”<“,”>”, “|”, “;”,”&”‘ 工作(需要使用(shell)模塊
實現這些功能)。
action: command
chdir # 在執行命令之前,先切換到該目錄
creates # 一個文件名,當這個文件存在,則該命令不執行,可以
用來做判斷
executable # 切換shell來執行命令,需要使用命令的絕對路徑
free_form # 要執行的Linux指令,一般使用Ansible的-a參數代替。
removes # 一個文件名,這個文件不存在,則該命令不執行,與
creates相反的判斷
3、shell模塊在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,
例如管道等 :
[root@ansiable ~]# ansible webservers -m shell -
a ‘cat /etc/passwd |grep “root”’
192.168.253.142 | SUCCESS | rc=0 >> root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
192.168.253.151 | SUCCESS | rc=0 >> root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
4、copy:複製文件到遠程主機,可以改權限等
用法:
(1) 複製文件
-a “src= dest= ”
(2) 給定內容生成文件
-a "content= dest= "
[root@ansiable ~]# ansible webservers -m copy -
a ‘content=“hello\nworld” dest=/tmp/test.ansible mode=666’
192.168.253.151 | SUCCESS =>
{ "changed": true,
"checksum": "7db827c10afc1719863502cf95397731b23b8bae",
"dest": "/tmp/test.ansible", "gid": 0, "group": "root",
"md5sum": "9195d0beb2a889e1be05ed6bb1954837",
"mode": "0666", "owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0", "size": 11,
"src": "/root/.ansible/tmp/ansible-tmp-1476904825.49-
4、copy:複製文件到遠程主機,可以改權限等
相關選項如下:
backup:在覆蓋之前,將源文件備份,備份文件包含時間信息。有兩個選項:
yes|no
content:用於替代“src”,可以直接設定指定文件的值
dest:必選項。要將源文件複製到的遠程主機的絕對路徑,如果源文件是一個目
錄,那麼該路徑也必須是個目錄
directory_mode:遞歸設定目錄的權限,默認爲系統默認權限
force:如果目標主機包含該文件,但內容不同,如果設置爲yes,則強制覆蓋,如
果爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes
others:所有的file模塊裏的選項都可以在這裏使用
src:被複制到遠程主機的本地文件,可以是絕對路徑,也可以是相對路徑。如果
路徑是一個目錄,它將遞歸複製。在這種情況下,如果路徑使用“/”來結尾,則
只複製目錄裏的內容,如果沒有使用“/”來結尾,則包含目錄在內的整個內容全
部複製,類似於rsync。
5、file 設置文件屬性:
創建目錄:-a “path= state=directory”
創建鏈接文件:-a “path= src= state=link”
刪除文件:-a “path= state=absent”
[root@ansiable ~]# ansible webservers -m file -
a ‘path=/tmp/test state=directory’
192.168.253.151 | SUCCESS => { "changed": true, "gid": 0,
"group": "root", "mode": "0755", "owner": "root",
"path": "/tmp/test",
"secontext": "unconfined_u:object_r:user_tmp_t:s0", "size": 6,
"state": "directory", "uid": 0 }
force:需要在兩種情況下強制創建軟鏈接,一種是源文件不存在,但之後會建立
的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然後創建新的軟鏈,有兩個選項:yes|no
group:定義文件/目錄的屬組 mode:定義文件/目錄的權限
owner:定義文件/目錄的屬主 path:必選項,定義文件/目錄的路徑
recurse:遞歸設置文件的屬性,只對目錄有效 src:被鏈接的源文件路徑,只應用
於state=link的情況
dest:被鏈接到的路徑,只應用於state=link的情況
state:
directory:如果目錄不存在,就創建目錄
file:即使文件不存在,也不會被創建
link:創建軟鏈接
hard:創建硬鏈接
touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,
則更新其最後修改時間
absent:刪除目錄、文件或者取消鏈接文件
6、fetch從遠程某主機獲取文件到本地:
dest:用來存放文件的目錄,例如存放目錄爲backup,源文件名稱爲/etc/profile
在主機pythonserver中,那麼保存爲/backup/pythonserver/etc/profile
Src:在遠程拉取的文件,並且必須是一個file,不能是目錄
實例:
[root@ansiable ~]# ansible webservers -m fetch -
a 'src=/var/log/messages dest=/root' 192.168.253.142 | SUCCESS => {
"changed": true,
"checksum": "5b28cfc1e2926a64441fa3a7e3a6968fe3cdb416",
"dest": "/root/192.168.253.142/var/log/messages",
"md5sum": "f843282c8246d545ef07205d5094ada7",
"remote_checksum": "5b28cfc1e2926a64441fa3a7e3a6968fe3cdb416",
"remote_md5sum": null }
7、cron 管理cron計劃任務:
a “”: 設置管理節點生成定時任務
action: cron backup= # 如果設置,創建一個crontab備份 【yes|no】
cron_file= #如果指定, 使用這個文件cron.d,而不是單個用戶
crontab
day= #日應該運行的工作( 1-31, *, */2, )
hour= # 小時 ( 0-23, *, */2, )
minute= #分鐘( 0-59, *, */2, )
month= # 月( 1-12, *, /2, )
weekday # 周 ( 0-6 for Sunday-Saturday,, )
job= #指明運行的命令是什麼
name= #定時任務描述
reboot # 任務在重啓時運行,不建議使用,建議使用special_time
special_time #特殊的時間範圍,參數:reboot(重啓時),annually(每年),monthly(每月),weekly
(每週),daily(每天),hourly(每小時)
state #指定狀態,present表示添加定時任務,也是默認設置,absent表示刪除定時任務
user # 以哪個用戶的身份執行
ansible mysql_test -m cron -
a 'name="sync time from ntpserver" minute="*/10" job="/sbin/ntpdate asia.pool.ntp.org &>/dev/null"
8、yum安裝軟件
conf_file #設定遠程yum安裝時所依賴的配置文件。如配置文件沒有在默認的位置。
disable_gpg_check #是否禁止GPG checking,只用於`present‘ or `latest’。
disablerepo #臨時禁止使用yum庫。 只用於安裝或更新時。
enablerepo #臨時使用的yum庫。只用於安裝或更新時。
name= #所安裝的包的名稱
state= #present安裝, latest安裝最新的, absent 卸載軟件。
update_cache #強制更新yum的緩存。
[root@ansiable ~]# ansible webservers -m yum -a 'name=htop state=present' #安裝個
htop試試 192.168.253.142 | SUCCESS => {
9、service: 服務程序管理
arguments #命令行提供額外的參數
enabled #設置開機啓動。
name= #服務名稱
runlevel #開機啓動的級別,一般不用指定。
sleep #在重啓服務的過程中,是否等待。如在服務關閉以後等待2秒再啓動。
state #started啓動服務, stopped停止服務, restarted重啓服務, reloaded重載配置
啓動nginx服務並設置範圍自啓動:
[root@ansiable ~]# ansible webservers -m service -
a 'name=nginx state=started enabled=true' 192.168.253.142 | SUCCESS => {
"changed": false, "enabled": true, "name": "nginx", "state": "started" }
10、user模塊管理
用戶模塊,管理用戶帳號action: user
comment # 用戶的描述信息
createhome # 是否創建家目錄
force # 在使用state=absent是, 行爲與userdel –force一致.
group # 指定基本組
groups # 指定附加組,如果指定爲(groups=)表示刪除所有組
home # 指定用戶家目錄
move_home # 如果設置爲home=時, 試圖將用戶主目錄移動到指定的目錄
name # 指定用戶名
non_unique # 該選項允許改變非唯一的用戶ID值
password # 指定用戶密碼
remove # 在使用state=absent時, 行爲是與userdel –remove一致
shell # 指定默認shell
state # 設置帳號狀態,不指定爲創建,指定值爲absent表示刪除
system # 當創建一個用戶,設置這個用戶是系統用戶。這個設置不能更改現有用戶
uid # 指定用戶的uid
update_password # 密碼更新模式
ansible web -m user -a 'name=tom comment="tom is tom" uid=1066 group=tom groups=wheel
shell=/bin/zshell home=/home/tomhome'
11、group
用戶組模塊,添加或刪除組
action: group
gid # 設置組的GID號
name= # 管理組的名稱
state # 指定組狀態,默認爲創建,設置值爲absent爲刪除
system # 設置值爲yes,表示爲創建系統組
創建名爲tom的組
[root@Ansible ~]#ansible web -m group -a 'name=tom state=present'
12、script在指定節點運行服務端的腳本
[root@Ansible ~]#vim
test.sh
#/bin/bash
touch /tmp/test.sh.log
#創建/tmp/test.sh.log
echo “hello” >> /tmp/test.sh.log
#將date命令結果輸出到/tmp/test.sh.log
在web組中所有主機執行/root/test.sh腳本
[root@Ansible ~]#ansible web -m script -a ‘/root/test.sh’
[root@Ansible ~]#cat /tmp/test.sh.log hello
[root@node1 ~]#cat /tmp/test.sh.log hello
查看172.16.251.163主機下的/tmp/test.sh.log
[root@Ansible ~]#ansible 172.16.251.163 -m shell -a ‘cat /tmp/test.sh.log’
172.16.251.163 | SUCCESS | rc=0 >> hello
13、setup模塊
facts組件是Ansible用於採集被管機器設備信息的一個功能,我們可以使用setup模塊查機器的所有facts信息
,可以使用filter來查看指定信息。整個facts信息被包裝在一個JSON格式的數據結構中,ansible_facts是最上
層的值。
facts就是變量,內建變量 。每個主機的各種信息,cpu顆數、內存大小等。會存在facts中的某個變量中。調
用後返回很多對應主機的信息,在後面的操作中可以根據不同的信息來做不同的操作。如redhat系列用yum安
裝,而debian系列用apt來安裝軟件。
setup模塊,主要用於獲取主機信息,在playbooks裏經常會用到的一個參數gather_facts就與該模塊相關。
setup模塊下經常使用的一個參數是filter參數,具體使用示例如下(由於輸出結果較多,這裏只列命令不寫結
果):
#ansible 10.212.52.252 -m setup -a 'filter=ansible_*_mb' //查看主機內存信息
#ansible 10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]' //查看地接口爲eth0-2的網卡信息
ansible all -m setup --tree /tmp/facts //將所有主機的信息輸入到/tmp/facts目錄下,每臺主機的信息輸入
到主機名文件中(/etc/ansible/hosts裏的主機名)

Ansible playbook簡介


playbook是ansible用於配置,部署,和管理被控節點的劇本。
通過playbook的詳細描述,執行其中的一系列tasks,可以讓遠端主機達到預期的狀態。playbook就像Ansible控制器給被控節點列出的的一系列to-do-list,而被控節點必須要完成。
也可以這麼理解,playbook 字面意思,即劇本,現實中由演員按照劇本表演,在Ansible中,這次由計算機進行表演,由計算機安裝,部署應用,提供對外服務,以及組織計算機處理各種各樣的事情。

Ansible playbook使用場景


執行一些簡單的任務,使用ad-hoc命令可以方便的解決問題,但是有時一個設施過於複雜,需要大量的操作時候,執行的ad-hoc命令是不適合的,這時最好使用
playbook。
就像執行shell命令與寫shell腳本一樣,也可以理解爲批處理任務,不playbook有自己的語法格式。
使用playbook你可以方便的重用這些代碼,可以移植到不同的機器上面,像函數一樣,最大化的利用代碼。在你使用Ansible的過程中,你也會發現,你所處理的大部分操作都是編寫playbook。可以把常見的應用都編寫成playbook,之後管理服務器會變得十分簡單。

Ansible playbook格式


playbook由YMAL語言編寫。YAML( /ˈjæməl/ )參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822,Clark Evans在2001年5月在首次發表了這種語言,另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者。
YMAL格式是類似於JSON的文件格式,便於人理解和閱讀,同時便於書寫。首先學習瞭解一下YMAL的格式,對我們後面書寫playbook很有幫助。以下爲playbook常用到的YMAL格式。

文件的第一行應該以 ”—” (三個連字符)開始,表明YMAL文件的開始。在同一行中,#之後的內容表示註釋,類似於shell,python和ruby。YMAL中的列表元素以”-”開頭然後緊跟着一個空格,後面爲元素內容。

就像這樣

- apple - banana - orange等價於JSON的這種格式
[ “apple”, “banana”, “orange” ]
同一個列表中的元素應該保持相同的縮進。否則會被當做錯誤處理。

play中hosts,variables,roles,tasks等對象的表示方法都是鍵值中間以”:”分隔表示,”:”後面還要增加一
個空格。
house:
family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 12345 }

企業級自動化運維工具——ansible

在mysql.yml中,主要由三個部分組成。

hosts部分:

使用hosts指示使用哪個主機或主機組來運行下面的tasks,每個playbook都必須指定hosts,hosts也可以使用通配符格式。主機或主機組在inventory清單中指定,可以使用系統默認的/etc/ansible/hosts,也可以自己編輯,在運行的時候加上-i選項,指定清單的位置即可。在運行清單文件的時候,–list-hosts選項會顯示那些主機將會參與執行task的過程中。
remote_user:

指定遠端主機中的哪個用戶來登錄遠端系統,在遠端系統執行task的用戶,可以任意指定,也可以使用sudo,但是用戶必須要有執行相應task的權限。
tasks:

指定遠端主機將要執行的一系列動作。tasks的核心爲ansible的模塊,前面已經提到模塊的用法。tasks包含name和要執行的模塊,name是可選的,只是爲了便於用戶閱讀,不過還是建議加上去,模塊是必須的,同時也要給予模塊相應的參數。

使用ansible-playbook運行playbook文件,得到如下輸出信息,輸出內容爲JSON格式。並且由不同顏色組成,便於識別。一般而言

l 綠色代表執行成功,系統保持原樣

l ×××代表系統代表系統狀態發生改變

l 紅色代表執行失敗,顯示錯誤輸出。

執行有三個步驟:1、收集facts 2、執行tasks 3、報告結果

企業級自動化運維工具——ansible

Playbook的核心元素:

  • Hosts:主機
  • Tasks:任務列表
  • Variables
  • Templates:包含了模板語法的文本文件;
  • Handlers:由特定條件觸發的任務;

Playbooks配置文件的基礎組件:

  • Hosts:運行指定任務的目標主機;
  • remoute_user: 在遠程主機上執行任務的用戶;
  • sudo_user:
  • tasks:任務列表
  • 模塊,模塊參數;

格式:

(1)action: module arguments
(2) module: arguments

注意:shell和command模塊後面直接跟命令,而非key=value類的參數列表;

(1) 某任務的狀態在運行後爲changed時,可通過“notify”通知給相應的handlers;
(2) 任務可以通過“tags“打標籤,而後可在ansible-playbook命令上使用-t指定進行調用;

handlers:

任務,在特定條件下觸發;
接收到其它任務的通知時被觸發;
tasks:
– name: TASK_NAME
module: arguments
notify: HANDLER_NAME
handlers:
– name: HANDLER_NAME
module: arguments
variables:
(1) facts:可直接調用;
注意:可使用setup模塊直接獲取目標主機的facters;
(2) 用戶自定義變量:
(a) ansible-playbook命令的命令行中的
-e VARS, --extra-vars=VARS
(b) 在playbook中定義變量的方法:
vars:

- var1: value1

- - var2: value2

(3) 通過roles傳遞變量;
(4) Host Inventory
(a) 用戶自定義變量
​ (i) 向不同的主機傳遞不同的變量;
​ IP/HOSTNAME varaiable=value var2=value2
​ (ii) 向組中的主機傳遞相同的變量;
​ [groupname:vars]
​ variable=value
[web]
172.17.251.188
172.17.250.209
[web:vars]
rpmname=samba
運行playbook的方式:
(1) 測試
ansible-playbook --check 只檢測可能會發生的改變,但不真正執行操作;
ansible-playbook --list-hosts 列出運行任務的主機;
(2) 直接運行

模板:templates
文本文件,嵌套有腳本(使用模板編程語言編寫)
Jinja2:Jinja2是python的一種模板語言,以Django的模板語言爲原本
支持:
字符串:使用單引號或雙引號;
數字:整數,浮點數;
列表:[item1, item2, ...]
元組:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布爾型:true/false
算術運算:
+, -, *, /, //, %, **
比較操作:
==, !=, >, >=, <, <=
邏輯運算:
and, or, not

企業級自動化運維工具——ansible

Ansible playbook示例


企業級自動化運維工具——ansible

- hosts: websrvs
  remote_user: root
  tasks:
    - name: install nginx
      yum: name=nginx state=present
    - name: install conf file
      template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify: restart nginx
      tags: instconf
    - name: start nginx service
      service: name=nginx state=started
      handlers:
    - name: restart nginx
      service: name=nginx state=restarted

模板配置文件 :nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }};
listen {{ http_port }};

Ansible playbook條件測試


when語句:在task中使用,jinja2的語法格式
tasks:
- name: install conf file to centos7
template: src=files/nginx.conf.c7.j2
when: ansible_distribution_major_version == "7"
- name: install conf file to centos6
template: src=files/nginx.conf.c6.j2
when: ansible_distribution_major_version == "6"
循環:迭代,需要重複執行的任務;
對迭代項的引用,固定變量名爲”item“
而後,要在task中使用with_items給定要迭代的元素列表;

企業級自動化運維工具——ansible

Ansible playbook字典

- name: install some packages
  yum: name={{ item }} state=present
  with_items:
    - nginx
    - memcached
    - php-fpm
- name: add some groups
  group: name={{ item }} state=present
  with_items:
    - group11
    - group12
    - group13
- name: add some users
  user: name={{ item.name }} group={{ item.group }} state=present
  with_items:
    - { name: 'user11', group: 'group11' }
    - { name: 'user12', group: 'group12' }
    - { name: 'user13', group: 'group13' }

企業級自動化運維工具——ansible

角色定製:roles


​ 對於以上所有的方式有個弊端就是無法實現複用假設在同時部署Web、db、ha 時或不同服務器組合不同的應用就需要寫多個yml文件。很難實現靈活的調用。

​ roles 用於層次性、結構化地組織playbook。roles 能夠根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量(vars)、文件(file)、任務(tasks)、模塊(modules)及處理器(handlers)放置於單獨的目錄中,並可以便捷地include它們的一種機制。角色一般用於基於主機構建服務的場景中,但也可以是用於構建守護進程等場景中。

roles目錄結構


角色集合:roles/
mysql/
httpd/
nginx/
files/:存儲由copy或script等模塊調用的文件;
tasks/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各task;其它的文件需要由main.yml
進行“包含”調用;
handlers/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各handler;其它的文件需要由
main.yml進行“包含”調用;
vars/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各variable;其它的文件需要由
main.yml進行“包含”調用;
templates/:存儲由template模塊調用的模板文本;
meta/:此目錄中至少應該有一個名爲main.yml的文件,定義當前角色的特殊設定及其依賴關係;其它的
文件需要由main.yml進行“包含”調用;
default/:此目錄中至少應該有一個名爲main.yml的文件,用於設定默認變量;

角色定製:roles


1、在roles目錄下生成對應的目錄結構
mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}
2、定義/tasks/main.yml的配置文件

- name: cp
  copy: src=nginx-1.10.2-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm
- name: install
  yum: name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm state=latest
- name: conf
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  tags: nginxconf
  notify: new conf to reload
- name: start service
  service: name=nginx state=started enabled=true

3、修改邊變量文件

vars/main.yml 添加變量nginx_port: “8888”

4、定義handlers文件

handlers/main.yml
- name: new conf to reload
service: name=nginx state=restarted
5、定義/etc/ansible/nginx.yml的playbook文件
- hosts: nginx
remote_user: root
roles:
- nginx

6、可以通過roles傳遞變量

- hosts: nginx
remote_user: root
roles:
- { role: nginx, nginxport: 12345 }

7、也可以配置多個角色

roles:
# - { role: nginx, nginxport: 12345 }
- { role: memcached}
文件目錄結構:
├── default
├── files
│├── nginx-1.10.2-1.el7.ngx.x86_64.rpm
│ ├
─
─
handlers
│ └── main.yml
├── meta
├── tasks
│└── main.yml
├── templates
│ └── nginx.conf.j2
└── vars
├── main.yml
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章