一、簡(jiǎn)介
在Linux自動(dòng)化運(yùn)維中,常見的自動(dòng)化運(yùn)維工具可分為需要安裝終端的puppet、func和不需要安裝終端的ansible,fabric。而ansible就是其中一個(gè)模塊化的自動(dòng)運(yùn)維管理工具,其基于Python語言實(shí)現(xiàn),由Paramiko,PYYAML和Jinjia2三個(gè)關(guān)鍵模塊組成。Ansible無需再控制終端安裝客戶端,因此部署起來十分簡(jiǎn)單。Ansible的主要特點(diǎn)包括以下幾點(diǎn):
- agentless,去中心化。
- 模塊化部署,可自定義模塊。
- 支持playbook。
- 冪等性,多次執(zhí)行結(jié)果相同。
二、Ansible的架構(gòu)

Ansible的架構(gòu)由以下幾個(gè)核心組件構(gòu)成:
ansible:ansible的核心程序,提供一個(gè)命令行接口給用戶對(duì)ansible進(jìn)行管理操作;
Host Inventory:為Ansible定義了管理主機(jī)的策略。一般小型環(huán)境下我們只需要在host文件中寫入主機(jī)的IP地址即可,但是到了中大型環(huán)境我們有可能需要使用靜態(tài)inventory或者動(dòng)態(tài)主機(jī)清單來生成我們所需要執(zhí)行的目標(biāo)主機(jī)。
Core Modules:用于執(zhí)行管理任務(wù)的核心模塊,在Ansible管理主機(jī)之前,先調(diào)用core Modules中的模塊,然后指明管理Host Lnventory中的主機(jī),就可以完成管理主機(jī)。
Custom Modules:自定義模塊,如何ansible自帶的模塊無法滿足我么你的需求,用戶可自定義相應(yīng)的模塊來滿足自己的需求。
Connection Plugins:Ansible默認(rèn)是基于SSH連接到目標(biāo)機(jī)器上執(zhí)行操作的,但是其也支持其他不同的連接方法,此時(shí)就需要連接插件幫助我們進(jìn)行連接。
Playbook:定義需要給遠(yuǎn)程主機(jī)執(zhí)行的一系列任務(wù)。
三、ansible的安裝和配置
-
ansible的安裝
ansible的安裝來源于epel倉庫,因此在安裝前需確保安裝了正確的epel源。
[root@localhost ~]# yum install -y epel-release
[root@localhost ~]# yum install -y ansible
-
ansible的配置文件
ansible的配置文件為/etc/ansible/ansible.cfg,包含著下面幾個(gè)配置段,每個(gè)配置段下都有自己默認(rèn)的配置,多數(shù)配置保持默認(rèn)即可:
(1)[defaults]
#inventory = /etc/ansible/hosts # 主機(jī)列表配置文件
#library = /usr/share/my_modules/ # 庫文件存放目錄
#remote_tmp = $HOME/.ansible/tmp # 生成的臨時(shí)py命令文件存放在遠(yuǎn)程主機(jī)的目錄
#local_tmp = $HOME/.ansible/tmp # 本機(jī)的臨時(shí)命令執(zhí)行目錄
#forks = 5 # 默認(rèn)并發(fā)數(shù)
#poll_interval = 15 # 默認(rèn)的線程池
#sudo_user = root # 默認(rèn)sudo 用戶
#ask_sudo_pass = True
#ask_pass = True
#transport = smart
#remote_port = 22
#module_lang = C
#module_set_locale = False
host_key_checking = False ### 檢查對(duì)應(yīng)服務(wù)器的host_key
(2)[privilege_escalation]
(3)[paramiko_connection]
(4)[ssh_connection]
(5)[accelerate]
(6)[selinux]
(7)[colors]
-
ansible的主機(jī)清單
/etc/ansible/hosts文件為ansible用于定義管理主機(jī)的配置,其定義方式包括:
直接指明主機(jī)地址或主機(jī)名
node1
10.10.10.11
或者定義一個(gè)主機(jī)組,把主機(jī)地址或者主機(jī)名寫進(jìn)去,然后通過組名來調(diào)用主機(jī)組:
[webservers]
10.10.10.11
10.10.10.12
[dbservers]
db1
10.10.10.13
/etc/ansible/hosts文件支持使用以下變量設(shè)置相關(guān)的遠(yuǎn)程主機(jī)信息:
ansible_ssh_host #用于指定被管理的主機(jī)的真實(shí)IP
ansible_ssh_port #用于指定連接到被管理主機(jī)的ssh端口號(hào),默認(rèn)是22
ansible_ssh_user #ssh連接時(shí)默認(rèn)使用的用戶名
ansible_ssh_pass #ssh連接時(shí)的密碼
ansible_sudo_pass #使用sudo連接用戶時(shí)的密碼
ansible_sudo_exec #如果sudo命令不在默認(rèn)路徑,需要指定sudo命令路徑
ansible_ssh_private_key_file #秘鑰文件路徑,秘鑰文件如果不想使用ssh-agent管理時(shí)可以使用此選項(xiàng)
ansible_shell_type #目標(biāo)系統(tǒng)的shell的類型,默認(rèn)sh
ansible_connection #SSH 連接的類型: local , ssh , paramiko,在 ansible 1.2 之前默認(rèn)是 paramiko ,后來智能選擇,優(yōu)先使用基于 ControlPersist 的 ssh (支持的前提)
ansible_python_interpreter #用來指定python解釋器的路徑,默認(rèn)為/usr/bin/python 同樣可以指定ruby 、perl 的路徑
ansible_*_interpreter #其他解釋器路徑,用法與ansible_python_interpreter類似,這里"*"可以是ruby或才perl等其他語言
-
ansible的管理遠(yuǎn)程主機(jī)
默認(rèn)情況下ansible使用ssh連接到遠(yuǎn)程主機(jī)上去進(jìn)行管理,此時(shí)需要提供相應(yīng)的ssh認(rèn)證才能完成遠(yuǎn)程管理。
ansible可以通過以下兩種方式完成ssh認(rèn)證:
1、通過在主機(jī)清單中配置對(duì)應(yīng)主機(jī)的ssh賬號(hào)及密碼來完成認(rèn)證:
[root@Monitor ansible]# vim /etc/ansible/hosts
[webserver]
#192.168.180.4
192.168.180.5 ansible_ssh_port=10022 ansible_ssh_user=root ansible_ssh_pass='123456'
192.168.180.6 ansible_ssh_user=root ansible_ssh_pass='123456'
192.168.180.23 ansible_ssh_user=appuser ansible_ssh_pass='123456'
但是這種方式在管理大量的遠(yuǎn)程主機(jī)的配置會(huì)顯得特別麻煩,而且容易泄露賬號(hào)密碼信息,因此通常只作為測(cè)試使用。
2、使用ssh的免密鑰登錄方式來遠(yuǎn)程管理主機(jī)。
首先需要在ansible主機(jī)上生成ssh的公鑰和私鑰文件:
[root@ansible ~]# ssh-keygen -t rsa -N ''
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
eb:74:58:83:93:11:3a:fa:9b:8f:3f:88:4a:94:16:a0 root@ansible
The key's randomart image is:
+--[ RSA 2048]----+
|. . |
|.. . . |
|E . o . |
| o . . + |
| + . S o |
| o . = . |
| . ...+ . |
| . . .*.. |
| .. +o+. |
+-----------------+
[root@ansible ~]# ll /root/.ssh/
總用量 12
-rw-------. 1 root root 1675 6月 4 17:44 id_rsa #生成的私鑰文件
-rw-r--r--. 1 root root 394 6月 4 17:44 id_rsa.pub #生成的公鑰文件
-rw-r--r--. 1 root root 348 6月 4 17:12 known_hosts
接著將生成的公鑰文件送往遠(yuǎn)程主機(jī):
[root@ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.83
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.83's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.0.83'"
and check to make sure that only the key(s) you wanted were added.
[root@ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.84
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.84's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.0.84'"
and check to make sure that only the key(s) you wanted were added.
分發(fā)之后默認(rèn)會(huì)在遠(yuǎn)程主機(jī)的/root/.ssh下生成authorized_keys這個(gè)文件。隨后即可使用ansible對(duì)遠(yuǎn)程主機(jī)進(jìn)行管理操作:
[root@ansible ~]# ansible webservers -m ping
192.168.0.83 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.0.84 | SUCCESS => {
"changed": false,
"ping": "pong"
}
四、ansible的命令工具
ansible的命令工具有以下幾種:
/usr/bin/ansible:Ansibe AD-Hoc 臨時(shí)命令執(zhí)行工具,常用于臨時(shí)命令的執(zhí)行
/usr/bin/ansible-doc:Ansible 模塊功能查看工具
/usr/bin/ansible-galaxy:下載/上傳優(yōu)秀代碼或Roles模塊的官網(wǎng)平臺(tái),基于網(wǎng)絡(luò)的
/usr/bin/ansible-playbook:Ansible 定制自動(dòng)化的任務(wù)集編排工具
/usr/bin/ansible-pull:Ansible遠(yuǎn)程執(zhí)行命令的工具(使用較少,海量機(jī)器時(shí)使用,對(duì)運(yùn)維的架構(gòu)能力要求較高)
/usr/bin/ansible-vault:Ansible 文件加密工具
/usr/bin/ansible-console:Ansible基于Linux Consoble界面可與用戶交互的命令執(zhí)行工具
其中最為常用的當(dāng)屬/usr/bin/ansible,/usr/bin/ansible-doc和/usr/bin/ansible-playbook了。ansible和playbook分別對(duì)應(yīng)著ansible的兩種任務(wù)的執(zhí)行方式:AD-Hoc和playbook,而ansible-doc則可以方便于管理員查詢指定的模塊功能的使用方式。
-
ansible命令
ansible命令的使用語法為:
ansible <host-pattern> [options]
其中options常見的參數(shù)有:
-C,--check:測(cè)試模式,只顯示測(cè)試的結(jié)果而不做出實(shí)際的改變。
-m module_name:用于指定要執(zhí)行的模塊的名字,如:ansible all -m ping;
-a MODULE_ARGS:用于指定要執(zhí)行的模塊的參數(shù),參數(shù)格式類似于key=value,如:ansible all -m group -a "gid=3000 name=mygrp state=absent system=no";
使用示例:
[root@ansible ~]# ansible all -m shell -a "echo magedu"
192.168.0.83 | SUCCESS | rc=0 >>
magedu
192.168.0.84 | SUCCESS | rc=0 >>
magedu
-
ansible-doc命令:
ansible-doc命令的使用語法為:
ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
其中常用的參數(shù)的解釋為:
-l:列出所有可用的模塊;
-s:顯示指定的模塊的片段參數(shù);
-F:列出模塊名字及其對(duì)應(yīng)的python腳本文件;
使用示例:
[root@ansible ~]# ansible-doc -s copy
- name: Copies files to remote locations
copy:
attributes: # Attributes the file or directory should have. To get supported flags look at the man page for `chattr' on the target system.
This string should contain the attributes in the same order as the one displayed by `lsattr'.
backup: # Create a backup file including the timestamp information so you can get the original file back if you somehow clobbered it
incorrectly.
checksum: # SHA1 checksum of the file being transferred. Used to valdiate that the copy of the file was successful. If this is not
provided, ansible will use the local calculated checksum of the src file.
content: # When used instead of `src', sets the contents of a file directly to the specified value. For anything advanced or with
formatting also look at the template module.
......
-
ansible-playbook命令
ansible-playbook的使用語法為:
ansible-playbook [options] [playbooks]
其中playbooks為以.yaml結(jié)尾的文本文件,里面包含著以yaml語言所編寫的執(zhí)行內(nèi)容。
而常用的options包括:
--check:測(cè)試模式,檢查playbook的執(zhí)行結(jié)果,不是真正的執(zhí)行操作;ansible-syntax-check也可以用于檢查指定playbook的語法是否有錯(cuò);
--list-hosts:列出運(yùn)行指定playbook的主機(jī);
-t tags_name:執(zhí)行yaml文件中的指定的tags配置;
-e VARS=value:自定義在playbook中使用到的變量;
使用示例:
ansible-playbook -e pkgname=memcached -C fourth.yaml
-
ansible的常用模塊
上述三個(gè)命令的運(yùn)行都需要調(diào)用到ansible的模塊來執(zhí)行,這是因?yàn)閍nsible是模塊化的工具,不同的功能被劃分為不同的模塊來方便管理員進(jìn)行調(diào)用,而查看對(duì)應(yīng)可用的模塊及使用方式則使用上述所說到的ansible-doc -l或者ansible-doc -s module_name。
下面我們來看看ansible常用的模塊有哪些:
1)command模塊
此模塊用于在遠(yuǎn)程主機(jī)上執(zhí)行ansible所設(shè)置命令。需要注意的是command模塊要執(zhí)行命令無須為key=value格式,而是直接給出要執(zhí)行的命令即可。
其常用的模塊參數(shù)有:
chdir=path :切換路徑到指定的目錄下,然后執(zhí)行指定的命令
使用示例:
ansible all -m command -a "ifconfig"
ansible all -m command -a "chdir=/var/tmp mkdir hi.dir"
2)shell模塊
因?yàn)閏ommand模塊不支持管道符號(hào)等shell的特性,因此當(dāng)需要指定的命令需要利用到管道等shell特性時(shí),需要調(diào)用shell模塊,這樣即可在遠(yuǎn)程主機(jī)的shell進(jìn)程下運(yùn)行命令。
使用示例:
ansible all -m shell -a "echo magedu | passwd --stdin testuser"
3)file模塊
file模塊用于在遠(yuǎn)程主機(jī)上創(chuàng)建或設(shè)置文件屬性。
其常用的模塊參數(shù)有:
group=GROUPNAME:用于指定創(chuàng)建文件的屬組;
mode=value:用于指定文件的權(quán)限;
owner=USERNAME:用于指定文件的屬主;
path=PATH:用于指定目標(biāo)文件的路徑;
src=PATH:指定要被鏈接的源文件路徑,只應(yīng)用于state=link的情況;
dest=PATH:指定創(chuàng)建鏈接文件的路徑,只應(yīng)用于state=link的情況;
state=ATTIBUTES:用于指定文件屬性狀態(tài),常見的屬性狀態(tài)有:
directory:指定文件類型為目錄,如果目錄不存在則創(chuàng)建目錄;
file:指定文件類型為file,即使文件不存在,也不會(huì)創(chuàng)建文件;
hard:創(chuàng)建硬鏈接
link:創(chuàng)建軟鏈接
touch:如果文件不存在,則會(huì)常見一個(gè)新的文件,如果文件或目錄已存在,則更新其最后修改的時(shí)間
absent:刪除文件、目錄或取消鏈接文件;
present:新增文件、目錄或鏈接文件
使用示例;
#在遠(yuǎn)程主機(jī)的指定目錄下創(chuàng)建目錄
ansible all -m file -a "path=/var/tmp/hello.dir state=directory"
4)copy模塊
copy模塊用于將本地文件復(fù)制到遠(yuǎn)程主機(jī)的指定路徑下。
其模塊參數(shù)有:
src:指定復(fù)制文件的來源,注意路徑最后是否帶有/會(huì)影響復(fù)制的是目錄,還是目錄下的文件。
content:將指定的內(nèi)容復(fù)制保存為指定路徑的文件內(nèi)容;
dest:指定復(fù)制文件的存放目錄;
mode:指定復(fù)制目標(biāo)文件的文件權(quán)限;
owner:指定復(fù)制目標(biāo)文件的屬主;
group:指定復(fù)制目標(biāo)文件的屬組;
使用示例:
#將源文件復(fù)制到遠(yuǎn)程主機(jī)的指定路徑,并設(shè)置文件權(quán)限為600
ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=600"
#將指定的content內(nèi)容,復(fù)制保存為遠(yuǎn)程主機(jī)指定路徑下的文件
ansible all -m copy -a "content='hi there\n' dest=/tmp/hi.txt"
-
cron模塊
cron模塊用于在遠(yuǎn)程主機(jī)上設(shè)置cron周期性任務(wù)。
常見模塊參數(shù):
minute:定義cron任務(wù)每幾分鐘運(yùn)行一次;
hour:定義cron任務(wù)每幾個(gè)小時(shí)運(yùn)行一次;
day:定義cron任務(wù)每幾天運(yùn)行一次;
month:定義cron任務(wù)每幾個(gè)月運(yùn)行一次;
weekday:定義cron任務(wù)每星期幾運(yùn)行;
name:定義cron任務(wù)的名字;
job:定義cron任務(wù)的工作內(nèi)容;
state:通常為present或absent,新增或刪除cron任務(wù);
使用示例:
#在遠(yuǎn)程主機(jī)創(chuàng)建時(shí)間同步的cron任務(wù)
ansible all -m cron -a "minute=*/3 job='/usr/sbin/update ntp1.aliyun.com &> /dev/null' name=dateupdate
#在遠(yuǎn)程主機(jī)上刪除時(shí)間同步的cron任務(wù)
ansible all -m cron -a "minute=*/3 job='/usr/sbin/update ntp1.aliyun.com &> /dev/null' name=dateupdate state=absent "
-
user模塊
user模塊故名思義就是用來管理用戶賬號(hào)的,其常用模塊參數(shù)有:
name:指定用戶的名稱;
system:指定用戶是否為系統(tǒng)用戶,yes or no;
uid:指定用戶的uid;
shell:指定用戶的默認(rèn)shell;
group:指定用戶的屬組;
groups:指定用戶的附加組;
home:指定用戶的家目錄;
state:指定是否在遠(yuǎn)程主機(jī)上創(chuàng)建或刪除指定的用戶,present為創(chuàng)建,absent為刪除;
使用示例:
ansible all -m user -a "uid=5000 name=testuser state=present group=mygrp shell=/bin/tcsh"
-
group模塊
此模塊用于管理用戶組,其常見模塊參數(shù)有:
gid:用于指定用戶組的id;
name:用于指定用戶組的名稱;
state:是否在遠(yuǎn)程主機(jī)上創(chuàng)建或刪除指定的組,present為創(chuàng)建,absent為刪除;
system:用于指定用戶組是否為系統(tǒng)組;
使用示例:
ansible all -m group -a "gid=3000 name=mygrp state=present system=no"
-
yum模塊
yum模塊用于在遠(yuǎn)程主機(jī)上安裝指定的程序包,其模塊參數(shù)有:
name:指明要安裝的程序包的名字;
state:指明安裝或卸載的方式,包括present、installed、latest、absent、removed;
使用示例:
ansible all -m yum -a "name=epel-release state=installed"
-
service模塊
用于管理遠(yuǎn)程主機(jī)服務(wù)的模塊,其常用模塊參數(shù)有:
name:指定要管理的服務(wù)的名稱;
enabled:指定管理的服務(wù)是否開機(jī)自啟動(dòng);
state:設(shè)置服務(wù)的狀態(tài)為started、stopped或者restarted、reloaded;
使用示例:
ansible all -m service -a "name=nginx state=started"
-
script模塊
可以將本地腳本復(fù)制到遠(yuǎn)程主機(jī)上去執(zhí)行,其常用模塊參數(shù)有:
chdir:指定腳本執(zhí)行的目錄路徑;
使用示例:
ansible all -m script -a "chdir=/etc/ /root/ehco.sh"
-
template模塊
可以基于模板文件,分別為不同的遠(yuǎn)程主機(jī)復(fù)制生成對(duì)應(yīng)的目標(biāo)文件。其常用參數(shù)有:
src:本地Jinjia2模版的template文件位置;
dest:遠(yuǎn)程節(jié)點(diǎn)上的絕對(duì)路徑,用于放置template文件;
group:設(shè)置遠(yuǎn)程節(jié)點(diǎn)上的的template文件的所屬用戶組;
owner:設(shè)置遠(yuǎn)程節(jié)點(diǎn)上的的template文件的所屬用戶組;
mode:設(shè)置遠(yuǎn)程節(jié)點(diǎn)上的template文件權(quán)限;
使用示例:
#模板文件
[root@ansible playbooks]# vim mylisten.conf
Listen {{ http_port }}
#ansible主機(jī)變量:
[root@ansible playbooks]# vim /etc/ansible/hosts
[webservers]
192.168.0.83 http_port=8080
192.168.0.84 http_port=10080
#yaml配置:
[root@ansible ~]# vim first.yaml
- hosts: webservers
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=latest
- name: install config file
template: src=/root/playbooks/mylisten.conf dest=/etc/httpd/conf.d/mylisten.conf
- name: start httpd
service: name=httpd state=started
#ansible-playbook執(zhí)行調(diào)用
[root@ansible ~]# ansible-playbook all first.yaml
五、Ansible-playbook
playbook應(yīng)該說是ansible的核心模塊了,一個(gè)playbook相當(dāng)于是一堆task任務(wù)的合集。執(zhí)行一個(gè)playbook,相當(dāng)于執(zhí)行了一堆task任務(wù),而且這個(gè)playbook還是可復(fù)用的,這樣就能大大減少了重復(fù)性的工作量。Playbook是使用一種叫YAML語言來編寫的,其本身就是一種可讀性高,用于表達(dá)數(shù)據(jù)序列的格式的語言。一個(gè)playbook文件應(yīng)以.yaml結(jié)尾。
playbook由以下幾個(gè)核心元素組成:
1、Hosts:指遠(yuǎn)程控制的主機(jī);
2、Tasks:指在遠(yuǎn)程控制主機(jī)上執(zhí)行的任務(wù);
3、Variables:執(zhí)行Tasks任務(wù)時(shí)調(diào)用的變量;
4、Templates:包含了模板語法的文本文件;
5、Handlers:根據(jù)特殊的觸發(fā)條件而判斷執(zhí)行某個(gè)具體的Task任務(wù);
6、Roles:Playbook的角色,將經(jīng)常調(diào)用的Task任務(wù)定義成一個(gè)角色,方便日后進(jìn)行復(fù)用;
下面我們來看每個(gè)元素在playbook里面的實(shí)現(xiàn)。
-
Hosts
ansible playbook的hosts主機(jī)通常存放在/etc/ansible/hosts文件中,其定義的方式之前已經(jīng)提及到,這里就不再重復(fù)了。
在playbook里面的實(shí)現(xiàn)方式為:
#調(diào)用全部主機(jī)
- hosts: all
#調(diào)用指定的主機(jī)組
- hosts: webservers
-
Tasks
Tasks就是指遠(yuǎn)程主機(jī)要執(zhí)行的任務(wù),其格式通常為:
1)action:module arguments;
2)module:arguments
注意,shell和command模塊后面只需直接添加命令,而不是使用key=value類似的參數(shù)列表。另外某任務(wù)的狀態(tài)在運(yùn)行后為changed時(shí),可通過“notify”通知給相應(yīng)的handlers;任務(wù)可以通過“tags"打標(biāo)簽,而后可在ansible-playbook命令上使用-t指定進(jìn)行調(diào)用。
Tasks在playbook中的實(shí)現(xiàn):
- hosts: all #定義遠(yuǎn)程主機(jī)
remote_user: root #定于遠(yuǎn)程主機(jī)上執(zhí)行任務(wù)的用戶
tasks:
- name: install redis #定義第一個(gè)task任務(wù)
yum: name=redis state=latest #定義task任務(wù)的內(nèi)容
- name: install nginx #定義第二個(gè)task任務(wù)
yum: name=nginx state=latest
notify: restart nginx #調(diào)用名為restart nginx的handlers
tags: installngx #添加installngx的tags標(biāo)簽
-
handlers
handlers用于在playbook中匹配特定的條件后觸發(fā)執(zhí)行的任務(wù),通常在接到其他任務(wù)的notify通知后被觸發(fā)。
其在playbook文件中的實(shí)現(xiàn)方式為:
- hosts: all
remote_user: root
tasks:
- name: install redis
yum: name=redis state=latest
- name: copy config file
copy: src=/root/playbooks/redis.conf dest=/etc/redis.conf owner=redis
notify: restart redis #調(diào)用指定的handlers
tags: configfile
- name: start redis
service: name=redis state=started enabled=true
handlers:
- name: restart redis #定義一個(gè)handlers
service: name=redis state=restarted #定義handlers所觸發(fā)的任務(wù)
-
variables
playbook中可調(diào)用的變量分為好幾種,分別為:
1)facts:即系統(tǒng)變量facts,可利用命令ansible all -m setup來調(diào)用獲取目標(biāo)主機(jī)的facters。
常見的facters有:
ansible_distribution:目標(biāo)主機(jī)系統(tǒng)的社區(qū)版本
ansible_os_family:目標(biāo)主機(jī)系統(tǒng)派系
ansible_default_ipv4.address:目標(biāo)主機(jī)的Ip地址
2)用戶自定義變量
包括通過ansible-playbook -e VARS=value playbook.yaml命令所指定的變量,以及在playbook中通過下面方式定義的變量:
- hosts: all
gather_facts: False
vars:
pkgname: nginx
tasks:
- name: install nginx
yum: name={{ pkgname }} state=latest
3)通過roles傳遞變量;
4)通過在/etc/ansible/hosts文件中定義變量,如:
#向不同的主機(jī)傳遞不同的變量
[root@ansible playbooks]# vim /etc/ansible/hosts
[webservers]
192.168.0.83 http_port=8080
192.168.0.84 http_port=10080
#向組中的主機(jī)傳遞相同的變量
[webservers]
192.168.0.83
192.168.0.84
[webservers:vars]
http_port=8080
-
roles
playbook的roles存放在/etc/ansible/roles目錄下,每一個(gè)roles以特定的層級(jí)目錄結(jié)構(gòu)進(jìn)行組織,將原本編寫在一個(gè)playbook里面的配置分解保存位層級(jí)目錄結(jié)構(gòu)中的各個(gè)目錄節(jié)點(diǎn)。
一個(gè)roles通常包含著以下的目錄節(jié)點(diǎn):
files/:存放由copy或script模塊等調(diào)用的文件;
templates/ : 存放template模塊查找所需要模板文件的目錄;
tasks/ :至少應(yīng)該包含一個(gè)名為mail.yml的文件,此文件保存著與tasks相關(guān)的信息,其它的文件需要在此文件中通過include進(jìn)行包含;
handlers/ :至少應(yīng)該包含一個(gè)名為mail.yml的文件,此文件保存著與handlers相關(guān)的信息,其他的文件需要在此文件中通過include進(jìn)行包含;
vars/:至少應(yīng)該包含一個(gè)名為mail.yml的文件,此文件保存著與vars相關(guān)的信息,其他的文件需要在此文件中通過include進(jìn)行包含;
meta/:至少應(yīng)該包含一個(gè)名為mail.yml的文件,定義當(dāng)前角色的特殊設(shè)定及其依賴關(guān)系;其他的文件需要在此文件中通過include進(jìn)行包含;
default/:設(shè)定默認(rèn)變量時(shí)使用此目錄的mail.yml文件;
一個(gè)roles的目錄架構(gòu):
[root@ansible ~]# tree /etc/ansible/roles/nginx/
/etc/ansible/roles/nginx/
├── default
├── files
│ └── index.html
├── handlers
│ └── main.yml
├── meta
├── tasks
│ └── main.yml
├── templates
│ └── vhost1.conf.j2
└── vars
└── main.yml
在playbook中調(diào)用角色的方法:
- hosts: webservers
remote_user: root
roles:
- mysql
- memcached
- { role: nginx,username: nginx} #將username變量傳遞給nginx角色
-
條件測(cè)試
playbook還支持條件測(cè)試語句when,如根據(jù)目標(biāo)系統(tǒng)為RedHat或Debian時(shí)執(zhí)行不同的安裝指令:
tasks:
- hosts: webservers
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=installed
when: ansible_os_family == "RedHat"
- name: install apahce2
apt: name=apache2 state=installed
when: ansible_os_family == "Debian"
也可以根據(jù)when條件測(cè)試來實(shí)現(xiàn)角色的調(diào)用:
- hosts: webservers
remote_user: root
roles:
- { role: nginx, when: "ansible_distribution_major_version == '7' " }
另外在playbook中也可以實(shí)現(xiàn)循環(huán)迭代的操作,其實(shí)現(xiàn)需要在tasks引用用固定變量"item",然后在task中使用with_items給定要循環(huán)迭代的元素列表,列表支持以字符串或者字典的方式提供,如:
- hosts: webservers
remote_user: root
tasks:
- name: install {{ item }} package
yum: name={{ item }} state=latest #引用固定變量item
with_items:
- tomcat #列表方式
- tomcat-webapps
- tomcat-admin-webapps
- 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' }