1念秧、ansible 是什么?
ansible是目前最受運(yùn)維歡迎的自動化運(yùn)維工具滚局,基于Python開發(fā),集合了眾多運(yùn)維工具(SaltStack puppet顽频、chef藤肢、func、fabric)的優(yōu)點(diǎn)糯景,實(shí)現(xiàn)了批量系統(tǒng)配置嘁圈、批量程序部署省骂、批量運(yùn)行命令等功能。 ansible是基于 paramiko 開發(fā)的,并且基于模塊化工作最住,本身沒有批量部署的能力钞澳。真正具有批量部署的是ansible所運(yùn)行的模塊,ansible只是提供一種框架涨缚。ansible不需要在遠(yuǎn)程主機(jī)上安裝client/agents轧粟,因?yàn)樗鼈兪腔趕sh來和遠(yuǎn)程主機(jī)通訊的。ansible目前已經(jīng)已經(jīng)被紅帽官方收購脓魏,是自動化運(yùn)維工具中大家認(rèn)可度最高的逃延,并且上手容易,學(xué)習(xí)簡單轧拄。是每位運(yùn)維工程師必須掌握的技能之一揽祥。
2、ansible 特點(diǎn)
部署簡單檩电,只需在主控端部署Ansible環(huán)境拄丰,被控端無需做任何操作;
默認(rèn)使用SSH協(xié)議對設(shè)備進(jìn)行管理俐末;
有大量常規(guī)運(yùn)維操作模塊料按,可實(shí)現(xiàn)日常絕大部分操作;
配置簡單卓箫、功能強(qiáng)大载矿、擴(kuò)展性強(qiáng);
支持API及自定義模塊烹卒,可通過Python輕松擴(kuò)展闷盔;
通過Playbooks來定制強(qiáng)大的配置、狀態(tài)管理旅急;
輕量級逢勾,無需在客戶端安裝agent,更新時藐吮,只需在操作機(jī)上進(jìn)行一次更新即可溺拱;
提供一個功能強(qiáng)大、操作性強(qiáng)的Web管理界面和REST API接口——AWX平臺谣辞。
3迫摔、ansible 架構(gòu)圖
上圖中我們看到的主要模塊如下:
Ansible:Ansible核心程序。
HostInventory:記錄由Ansible管理的主機(jī)信息泥从,包括端口句占、密碼、ip等歉闰。
Playbooks:“劇本”YAML格式文件辖众,多個任務(wù)定義在一個文件中卓起,定義主機(jī)需要調(diào)用哪些模塊來完成的功能。
CoreModules:核心模塊凹炸,主要操作是通過調(diào)用核心模塊來完成管理任務(wù)戏阅。
CustomModules:自定義模塊,完成核心模塊無法完成的功能啤它,支持多種語言奕筐。
ConnectionPlugins:連接插件,Ansible和Host通信使用
1变骡、ansible 任務(wù)執(zhí)行模式
Ansible 系統(tǒng)由控制主機(jī)對被管節(jié)點(diǎn)的操作方式可分為兩類离赫,即ad-hoc和playbook:
????ad-hoc模式(點(diǎn)對點(diǎn)模式)使用單個模塊,支持批量執(zhí)行單條命令塌碌。ad-hoc 命令是一種可以快速輸入的命令渊胸,而且不需要保存起來的命令。就相當(dāng)于bash中的一句話shell台妆。
????playbook模式(劇本模式)是Ansible主要管理方式翎猛,也是Ansible功能強(qiáng)大的關(guān)鍵所在。playbook通過多個task集合完成一類功能接剩,如Web服務(wù)的安裝部署切厘、數(shù)據(jù)庫服務(wù)器的批量備份等“萌保可以簡單地把playbook理解為通過組合多條ad-hoc操作的配置文件疫稿。
2、ansible 執(zhí)行流程
3腾降、ansible 命令執(zhí)行過程
加載自己的配置文件拣度,默認(rèn)/etc/ansible/ansible.cfg;
查找對應(yīng)的主機(jī)配置文件螃壤,找到要執(zhí)行的主機(jī)或者組抗果;
加載自己對應(yīng)的模塊文件,如 command奸晴;
通過ansible將模塊或命令生成對應(yīng)的臨時py文件(python腳本)冤馏, 并將該文件傳輸至遠(yuǎn)程服務(wù)器;
對應(yīng)執(zhí)行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件寄啼;
給文件 +x 執(zhí)行權(quán)限逮光;
執(zhí)行并返回結(jié)果代箭;
刪除臨時py文件,sleep 0退出涕刚;
1嗡综、 準(zhǔn)備環(huán)境----關(guān)閉防護(hù)墻和selinux
環(huán)境:主機(jī):4臺? 一個控制節(jié)點(diǎn) 3個被控制節(jié)點(diǎn)
解析:本地互相解析(所有機(jī)器)
# vim /etc/hosts
192.168.1.10 ansible-web1
192.168.1.11 ansible-web2
192.168.1.12 ansible-web3
192.168.1.9? ansible-server? (控制節(jié)點(diǎn)服務(wù)器端)
配置ssh公鑰認(rèn)證:控制節(jié)點(diǎn)需要發(fā)送ssh公鑰給所有非被控制節(jié)點(diǎn)
[root@ansible-server ~]# ssh-keygen
[root@ansible-server ~]# ssh-copy-id -i 192.168.1.10? #所有機(jī)器
所有機(jī)器:
systemctl stop firewalld && setenforce 0
2.安裝:控制節(jié)點(diǎn)
1. 配置EPEL網(wǎng)絡(luò)yum源
[root@ansible-server ~]# yum install -y epel-release
2. 安裝ansible
[root@ansible-server ~]# yum install -y ansible
3.查看版本
[root@ansiable-server ~]# ansible --version
4.看幫助
[root@ansible-server ~]# ansible --help
3晒喷、ansible基礎(chǔ)----inventory主機(jī)清單
官方文檔:? http://docs.ansible.com/ansible/intro_inventory.html#>
inventory文件通常用于定義要管理主機(jī)的認(rèn)證信息道批,例如ssh登錄用戶名臂港、密碼以及key相關(guān)信息揖曾。
查看配置文件:
[root@ansible-server ~]# rpm? -qc ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts
-q:---query查詢
1.主配置文件:
inventory = /etc/ansible/ansible.cfg? #主要設(shè)置一些ansible初始化的信息果复,比如日志存放路徑憾朴、模塊倒槐、等配置信息 -i
library = /usr/share/ansible #指向存放Ansible模塊的目錄惕艳,支持多個目錄方式锈至,只要用冒號(:)隔開就可以
forks = 5? ? ? #并發(fā)連接數(shù)晨缴,默認(rèn)為5
sudo_user = root? ? ? ? #設(shè)置默認(rèn)執(zhí)行命令的用戶
remote_port = 22? ? ? ? #指定連接被管節(jié)點(diǎn)的管理端口,默認(rèn)為22端口峡捡,建議修改喜庞,能夠更加安全
host_key_checking = False #設(shè)置是否檢查SSH主機(jī)的密鑰,值為True/False棋返。關(guān)閉后第一次連接不會提示配置實(shí)例
timeout = 60? ? ? ? #設(shè)置SSH連接的超時時間延都,單位為秒
log_path = /var/log/ansible.log? ? #指定一個存儲ansible日志的文件(默認(rèn)不記錄日志)
2.主機(jī)清單文件:
默認(rèn)位置/etc/ansible/hosts
1.添加主機(jī)或者主機(jī)組:
[root@ansible-server ~]# vim /etc/ansible/hosts? #在最后追加被管理端的機(jī)器
ansible-web1? ? ? ? ? ? ? ? ? ? ? #單獨(dú)指定主機(jī),可以使用主機(jī)名稱或IP地址
2.添加主機(jī)組:
[webservers]? ? ? ? #使用[]標(biāo)簽指定主機(jī)組 ----標(biāo)簽自定義
192.168.10.11? ? ? ? #如果未解析添加ip
ansible-web2? ? ? #解析添加主機(jī)名
3.組可以包含其他組:
[webservers1]? ? #組一
ansible-web1
[webservers2]? ? #組二
ansible-web2
[weball:children]? ? ? #children-照寫 #weball包括兩個子組
webservers1? ? ? ? #組一
webservers2? ? ? ? #組二
4.為一個組指定變量睛竣,組內(nèi)每個主機(jī)都可以使用該變量:
[weball:vars]? ? ? ? #設(shè)置變量,vars--照寫
ansible_ssh_port=22 ? ?
ansible_ssh_user=root
ansible_ssh_private_key_file=/root/.ssh/id_rsa ?
#ansible_ssh_pass=1? ? ? #也可以定義密碼晰房,如果沒有互傳秘鑰可以使用密碼。
查看組內(nèi)主機(jī)列表:
語法:ansible? 組名? --list-hosts
[root@ansible-server ~]# ansible? weball --list-hosts
hosts (2):
? ? ansible-web1
? ? ansible-web2
====================================
擴(kuò)展:自定義主機(jī)列表使用密碼登錄:(了解)
[root@ansible-server ~]# vim /opt/hostlist
[all:vars]
ansible_ssh_port=22
ansible_ssh_user=root
#ansible_ssh_private_key_file=/root/.ssh/id_rsa
ansible_ssh_pass=test
[all]
ansible-web1
ansible-web2
使用:
[root@ansible-server ~]# ansible -i /opt/hostlist all -m ping -o
-i:指定清單文件
注意:這里的ping并不是真正意義上的ping而是探測遠(yuǎn)程主機(jī)ssh是否可以連接射沟!判斷ssh端口是否存活
4.測試????ansible web -m ping -o語法:# ansible? <pattern>? -m <module_name>? -a <arguments>
pattern--主機(jī)清單里定義的主機(jī)組名,主機(jī)名,IP,別名等,all表示所有的主機(jī),支持通配符,正則
-a MODULE_ARGS #模塊的參數(shù)殊者,如果執(zhí)行默認(rèn)COMMAND的模塊,即是命令參數(shù)验夯,如: “date”猖吴,“pwd”等等
-k,--ask-pass #ask for SSH password挥转。登錄密碼海蔽,提示輸入SSH密碼而不是假設(shè)基于密鑰的驗(yàn)證
--ask-su-pass #ask for su password。su切換密碼
-K绑谣,--ask-sudo-pass #ask for sudo password党窜。提示密碼使用sudo,sudo表示提權(quán)操作
--ask-vault-pass #ask for vault password借宵。假設(shè)我們設(shè)定了加密的密碼幌衣,則用該選項進(jìn)行訪問
-B SECONDS #后臺運(yùn)行超時時間
-C #模擬運(yùn)行環(huán)境并進(jìn)行預(yù)運(yùn)行,可以進(jìn)行查錯測試
-c CONNECTION #連接類型使用
-f FORKS #并行任務(wù)數(shù)壤玫,默認(rèn)為5
-i INVENTORY #指定主機(jī)清單的路徑豁护,默認(rèn)為/etc/ansible/hosts
--list-hosts #查看有哪些主機(jī)組-m MODULE_NAME #執(zhí)行模塊的名字哼凯,默認(rèn)使用 command 模塊,所以如果是只執(zhí)行單一命令可以不用
?-m參數(shù)-o #壓縮輸出楚里,嘗試將所有結(jié)果在一行輸出挡逼,一般針對收集工具使用
-S #用 su 命令-R SU_USER #指定 su 的用戶,默認(rèn)為 root 用戶-s #用 sudo 命令
-U SUDO_USER #指定 sudo 到哪個用戶腻豌,默認(rèn)為 root 用戶
-T TIMEOUT #指定 ssh 默認(rèn)超時時間家坎,默認(rèn)為10s,也可在配置文件中修改
-u REMOTE_USER #遠(yuǎn)程用戶吝梅,默認(rèn)為 root 用戶
-v #查看詳細(xì)信息虱疏,同時支持-vvv,-vvvv可查看更詳細(xì)信息
5苏携、Ad-Hoc
ad hoc其實(shí)就是執(zhí)行簡單的命令——一條命令做瞪。對于復(fù)雜的命令則為 playbook。
幫助文檔:
列出ansible支持的模塊:
-l:獲取列表
-s module_name:獲取指定模塊的使用信息
看所有模塊(A10右冻,華為装蓬,docker,EC2纱扭,aws等等廣大廠商設(shè)備)
[root@ansible-server ~]# ansible-doc -l
查看模塊使用信息牍帚,了解其功能:
[root@ansible-server ~]# ansible-doc -s modelname
常用模塊
1.command 模塊這個模塊可以直接在遠(yuǎn)程主機(jī)上執(zhí)行命令,并將結(jié)果返回本主機(jī)乳蛾。舉例如下: ansible web -m command -a 'ss -ntl'
命令模塊接受命令名稱暗赶,后面是空格分隔的列表參數(shù)。給定的命令將在所有選定的節(jié)點(diǎn)上執(zhí)行肃叶。它不會通過shell進(jìn)行處理蹂随,比如$HOME和操作如"<",">"因惭,"|"岳锁,";","&" 工作(需要使用(shell)模塊實(shí)現(xiàn)這些功能)蹦魔。注意激率,該命令不支持| 管道命令。 下面來看一看該模塊下常用的幾個命令:
chdir ? # 在執(zhí)行命令之前版姑,先切換到該目錄
executable? ? # 切換shell來執(zhí)行命令柱搜,需要使用命令的絕對路徑
free_form # 要執(zhí)行的Linux指令,一般使用Ansible的-a參數(shù)代替剥险。
creates ? ? ? # 一個文件名,當(dāng)這個文件存在宪肖,則該命令不執(zhí)行,可以用來做判斷
removes? ? ? ? # 一個文件名表制,這個文件不存在健爬,則該命令不執(zhí)行
ansible web -m command -a 'chdir=/data/ ls' #先切換到/data/ 目錄,再執(zhí)行“l(fā)s”命令
2么介、shell 模塊
shell模塊可以在遠(yuǎn)程主機(jī)上調(diào)用shell解釋器運(yùn)行命令娜遵,支持shell的各種功能,例如管道等壤短。
ansible web -m shell -a 'cat /etc/passwd |grep "keer"'
只要是我們的shell命令设拟,都可以通過這個模塊在遠(yuǎn)程主機(jī)上運(yùn)行,這里就不一一舉例了久脯。
3纳胧、copy 模塊
這個模塊用于將文件復(fù)制到遠(yuǎn)程主機(jī),同時支持給定內(nèi)容生成文件和修改權(quán)限等帘撰。 其相關(guān)選項如下:
src #被復(fù)制到遠(yuǎn)程主機(jī)的本地文件跑慕。可以是絕對路徑摧找,也可以是相對路徑核行。如果路徑是一個目錄,則會遞歸復(fù)制蹬耘,用法類似于"rsync"
content #用于替換"src"芝雪,可以直接指定文件的值
dest ? #必選項,將源文件復(fù)制到的遠(yuǎn)程主機(jī)的絕對路徑
backup #當(dāng)文件內(nèi)容發(fā)生改變后综苔,在覆蓋之前把源文件備份绵脯,備份文件包含時間信息directory_mode #遞歸設(shè)定目錄的權(quán)限,默認(rèn)為系統(tǒng)默認(rèn)權(quán)限
force #當(dāng)目標(biāo)主機(jī)包含該文件休里,但內(nèi)容不同時蛆挫,設(shè)為"yes",表示強(qiáng)制覆蓋妙黍;設(shè)為"no"悴侵,表示目標(biāo)主機(jī)的目標(biāo)位置不存在該文件才復(fù)制。默認(rèn)為"yes"
others #所有的 file 模塊中的選項可以在這里使用
1.復(fù)制文件????ansible web -m copy -a 'src=~/hello dest=/data/hello'?
2. 給定內(nèi)容生成文件拭嫁,并制定權(quán)限????ansible web -m copy -a 'content="I am keer\n" dest=/data/name mode=666'
3.關(guān)于覆蓋???? ansible web -m copy -a 'content="I am keerya\n" backup=yes dest=/data/name mode=666'
4可免、file 模塊
該模塊主要用于設(shè)置文件的屬性,比如創(chuàng)建文件做粤、創(chuàng)建鏈接文件浇借、刪除文件等。 下面是一些常見的命令:
force #需要在兩種情況下強(qiáng)制創(chuàng)建軟鏈接怕品,一種是源文件不存在妇垢,但之后會建立的情況下;另一種是目標(biāo)軟鏈接已存在,需要先取消之前的軟鏈闯估,然后創(chuàng)建新的軟鏈灼舍,有兩個選項:yes|no
group #定義文件/目錄的屬組。后面可以加上mode:定義文件/目錄的權(quán)限
owner #定義文件/目錄的屬主涨薪。后面必須跟上path:定義文件/目錄的路徑
recurse #遞歸設(shè)置文件的屬性骑素,只對目錄有效,后面跟上src:被鏈接的源文件路徑刚夺,只應(yīng)用于state=link的情況
dest #被鏈接到的路徑献丑,只應(yīng)用于state=link的情況
state #狀態(tài),有以下選項:
directory:如果目錄不存在侠姑,就創(chuàng)建目錄
file:即使文件不存在创橄,也不會被創(chuàng)建
link:創(chuàng)建軟鏈接
hard:創(chuàng)建硬鏈接
touch:如果文件不存在,則會創(chuàng)建一個新的文件结借,如果文件或目錄已存在筐摘,則更新其最后修改時間
absent:刪除目錄、文件或者取消鏈接文件
1.創(chuàng)建目錄:ansible web -m file -a 'path=/data/app state=directory'
2.創(chuàng)建鏈接文件????ansible web -m file -a 'path=/data/bbb.jpg src=aaa.jpg state=link'
3.刪除文件????ansible web -m file -a 'path=/data/a state=absent'
5船老、fetch 模塊
該模塊用于從遠(yuǎn)程某主機(jī)獲瓤臁(復(fù)制)文件到本地。 有兩個選項:
dest:用來存放文件的目錄
src:在遠(yuǎn)程拉取的文件柳畔,并且必須是一個file馍管,不能是目錄
ansible web -m fetch -a 'src=/data/hello dest=/data'
6、cron 模塊
該模塊適用于管理cron計劃任務(wù)的薪韩。 其使用的語法跟我們的crontab文件中的語法一致确沸,同時,可以指定以下選項:
day=? ? ? #日應(yīng)該運(yùn)行的工作( 1-31, , /2, )
hour= ? ? # 小時 ( 0-23, , /2, )
minute= #分鐘( 0-59, , /2, )
month= ? # 月( 1-12, *, /2, )
weekday=? ? ? # 周 ( 0-6 for Sunday-Saturday,, )
job= ? ? ? #指明運(yùn)行的命令是什么
name=? ? #定時任務(wù)描述
reboot? # 任務(wù)在重啟時運(yùn)行俘陷,不建議使用罗捎,建議使用
special_timespecial_time #特殊的時間范圍,參數(shù):reboot(重啟時)拉盾,annually(每年)桨菜,monthly(每月),weekly(每周)捉偏,daily(每天)倒得,hourly(每小時)
state ? #指定狀態(tài),present表示添加定時任務(wù)夭禽,也是默認(rèn)設(shè)置霞掺,absent表示刪除定時任務(wù)
user ? ? # 以哪個用戶的身份執(zhí)行
1.添加計劃任務(wù)????ansible web -m cron -a 'name="ntp update every 5 min" minute=*/5? job="/sbin/ntpdate 172.17.0.1 &> /dev/null"'
2.查看????ansible web -m shell -a 'crontab -l'
3.刪除計劃任務(wù)????ansible web -m cron -a 'name="df everyday" hour=15 job="df -lh >> /tmp/disk_total &> /dev/null" state=absent'
7.yum模塊
name= #所安裝的包的名稱
state= #present--->安裝, latest--->安裝最新的, absent---> 卸載軟件讹躯。
update_cache #強(qiáng)制更新yum的緩存
conf_file #指定遠(yuǎn)程yum安裝時所依賴的配置文件(安裝本地已有的包)菩彬。disable_pgp_check #是否禁止GPG checking缠劝,只用于presentor latest。
disablerepo #臨時禁止使用yum庫挤巡。 只用于安裝或更新時剩彬。
enablerepo #臨時使用的yum庫酷麦。只用于安裝或更新時矿卑。
ansible web -m yum -a 'name=htop state=present'
8.service模塊
arguments #命令行提供額外的參數(shù)
enabled #設(shè)置開機(jī)啟動。
name= #服務(wù)名稱
runlevel #開機(jī)啟動的級別沃饶,一般不用指定母廷。
sleep #在重啟服務(wù)的過程中,是否等待糊肤。如在服務(wù)關(guān)閉以后等待2秒再啟動琴昆。(定義在劇本中。)state #有四種狀態(tài)馆揉,分別為:started--->啟動服務(wù)业舍, stopped--->停止服務(wù), restarted--->重啟服務(wù)升酣, reloaded--->重載配置
1.開啟服務(wù)并設(shè)置自啟動????ansible web -m service -a 'name=nginx state=started enabled=true'?
2.關(guān)閉服務(wù)????ansible web -m service -a 'name=nginx state=stopped'
9.script模塊
該模塊用于將本機(jī)的腳本在被管理端的機(jī)器上運(yùn)行舷暮。
該模塊直接指定腳本的路徑即可,我們通過例子來看一看到底如何使用的:
首先噩茄,我們寫一個腳本下面,并給其加上執(zhí)行權(quán)限:
[root@server ~]# vim /tmp/df.sh
? #!/bin/bash
? date >> /tmp/disk_total.log
? df -lh >> /tmp/disk_total.log?
[root@server ~]# chmod +x /tmp/df.sh?
ansible web -m script -a '/tmp/df.sh'
ansible-playbook 劇本(1)
Playbook介紹
playbook是ansible用于配置,部署绩聘,和管理被控節(jié)點(diǎn)的劇本沥割。通過playbook的詳細(xì)描述,執(zhí)行其中的tasks凿菩,可以讓遠(yuǎn)端主機(jī)達(dá)到預(yù)期的狀態(tài)机杜。playbook是由一個或多個”play”組成的列表。? 當(dāng)對一臺機(jī)器做環(huán)境初始化的時候往往需要不止做一件事情衅谷,這時使用playbook會更加適合椒拗。通過playbook你可以一次在多臺機(jī)器執(zhí)行多個指令。通過這種預(yù)先設(shè)計的配置保持了機(jī)器的配置統(tǒng)一会喝,并很簡單的執(zhí)行日常任務(wù)陡叠。
ansible通過不同的模塊實(shí)現(xiàn)相應(yīng)的管理,管理的方式通過定義的清單文件(hosts)所管理的主機(jī)包括認(rèn)證的方式連接的端口等肢执。所有的功能都是通過調(diào)用不同的模塊(modules)來完成不同的功能的枉阵。不管是執(zhí)行單條命令還是p ? lay-book都是基于清單文件。
playbook格式
playbook由YMAL語言編寫预茄。YMAL格式是類似于JSON的文件格式兴溜,便于人理解和閱讀侦厚,同時便于書寫∽净眨 1刨沦、文件的第一行應(yīng)該以 "---" (三個連字符)開始,表明YMAL文件的開始膘怕∠胱纾 2、在同一行中岛心,#之后的內(nèi)容表示注釋来破,類似于shell,python和ruby忘古∨墙 3、YMAL中的列表元素以”-”開頭然后緊跟著一個空格髓堪,后面為元素內(nèi)容送朱。 4干旁、同一個列表中的元素應(yīng)該保持相同的縮進(jìn)驶沼。否則會被當(dāng)做錯誤處理“淘校 5商乎、play中hosts,variables祭阀,roles鹉戚,tasks等對象的表示方法都是鍵值中間以":"分隔表示,":"后面還要增加一個空格专控。
我們的文件名稱應(yīng)該以.yml結(jié)尾抹凳,像我們上面的例子就是mysql.yml。其中伦腐,有三個部分組成:
host部分:使用 hosts 指示使用哪個主機(jī)或主機(jī)組來運(yùn)行下面的 tasks 赢底,每個 playbook 都必須指定 hosts ,hosts也可以使用通配符格式柏蘑。主機(jī)或主機(jī)組在 inventory 清單中指定幸冻,可以使用系統(tǒng)默認(rèn)的/etc/ansible/hosts,也可以自己編輯咳焚,在運(yùn)行的時候加上-i選項洽损,指定清單的位置即可。在運(yùn)行清單文件的時候革半,–list-hosts選項會顯示那些主機(jī)將會參與執(zhí)行 task 的過程中碑定。remote_user:指定遠(yuǎn)端主機(jī)中的哪個用戶來登錄遠(yuǎn)端系統(tǒng)流码,在遠(yuǎn)端系統(tǒng)執(zhí)行 task 的用戶,可以任意指定延刘,也可以使用 sudo漫试,但是用戶必須要有執(zhí)行相應(yīng) task 的權(quán)限。
tasks:指定遠(yuǎn)端主機(jī)將要執(zhí)行的一系列動作碘赖。tasks 的核心為 ansible 的模塊驾荣,前面已經(jīng)提到模塊的用法。tasks 包含 name 和要執(zhí)行的模塊崖疤,name 是可選的秘车,只是為了便于用戶閱讀典勇,不過還是建議加上去劫哼,模塊是必須的,同時也要給予模塊相應(yīng)的參數(shù)割笙。
使用ansible-playbook運(yùn)行playbook文件权烧,得到如下輸出信息,輸出內(nèi)容為JSON格式伤溉。并且由不同顏色組成般码,便于識別。一般而言
| 綠色代表執(zhí)行成功乱顾,系統(tǒng)保持原樣
| 黃色代表系統(tǒng)代表系統(tǒng)狀態(tài)發(fā)生改變
|紅色代表執(zhí)行失敗板祝,顯示錯誤輸出
執(zhí)行有三個步驟:1、收集facts? 2走净、執(zhí)行tasks? 3券时、報告結(jié)果
一個劇本里面可以有多個play,每個play只能有一個tasks伏伯,每個tasks可以有多個name
核心元素:
Hosts:主機(jī)組橘洞;
Tasks:任務(wù)列表;
Variables:變量说搅,設(shè)置方式有四種炸枣;
Templates:包含了模板語法的文本文件;
Handlers:由特定條件觸發(fā)的任務(wù)弄唧;
基本組件
Hosts:運(yùn)行指定任務(wù)的目標(biāo)主機(jī)
remoute_user:在遠(yuǎn)程主機(jī)上執(zhí)行任務(wù)的用戶适肠;
sudo_user:
tasks:任務(wù)列表
格式:
tasks:
– name: TASK_NAME
module: arguments
notify: HANDLER_NAME
handlers:
– name: HANDLER_NAME
module: arguments
模塊,模塊參數(shù):
格式: (1) action: module arguments (2) module: arguments
注意:shell和command模塊后面直接跟命令候引,而非key=value類的參數(shù)列表侯养;
handlers:任務(wù),在特定條件下觸發(fā)背伴;接收到其它任務(wù)的通知時被觸發(fā)沸毁;
(1) 某任務(wù)的狀態(tài)在運(yùn)行后為changed時峰髓,可通過“notify”通知給相應(yīng)的handlers;
(2) 任務(wù)可以通過“tags“打標(biāo)簽息尺,而后可在ansible-playbook命令上使用-t指定進(jìn)行調(diào)用携兵;
舉例
① 定義playbook
檢測語法:--syntax-check
[root@ansible-server ansible]# ansible-playbook --syntax-check test.yml?
playbook: test.yml
運(yùn)行Playbook:
[root@ansible-server ansible]# ansible-playbook test.yml #加劇本名稱
③ 測試標(biāo)簽
我們在里面已經(jīng)打上了一個標(biāo)簽,所以可以直接引用標(biāo)簽搂誉。但是我們需要先把服務(wù)關(guān)閉徐紧,再來運(yùn)行劇本并引用標(biāo)簽:
[root@server ansible]# ansible web -m shell -a 'systemctl stop nginx'
[root@server ansible]# ansible-playbook nginx.yml -t startnginx
5、模板 templates
模板是一個文本文件炭懊,嵌套有腳本(使用模板編程語言編寫)并级。 Jinja2:Jinja2是python的一種模板語言侮腹,以Django的模板語言為原本嘲碧。模板支持:
通常來說,模板都是通過引用變量來運(yùn)用的父阻。舉例
① 定義模板 我們直接把之前定義的/tmp/nginx.conf改個名愈涩,然后編輯一下,就可以定義成我們的模板文件了:
② 修改劇本 我們現(xiàn)在需要去修改劇本來定義變量:vim nginx.yml
角色訂制:roles
① 簡介
對于以上所有的方式有個弊端就是無法實(shí)現(xiàn)復(fù)用假設(shè)在同時部署Web加矛、db履婉、ha 時或不同服務(wù)器組合不同的應(yīng)用就需要寫多個yml文件。很難實(shí)現(xiàn)靈活的調(diào)用斟览。
roles 用于層次性毁腿、結(jié)構(gòu)化地組織playbook。roles 能夠根據(jù)層次型結(jié)構(gòu)自動裝載變量文件苛茂、tasks以及handlers等已烤。要使用roles只需要在playbook中使用include指令即可。簡單來講味悄,roles就是通過分別將變量(vars)草戈、文件(file)姨丈、任務(wù)(tasks)枯怖、模塊(modules)及處理器(handlers)放置于單獨(dú)的目錄中,并可以便捷地include它們的一種機(jī)制柠掂。角色一般用于基于主機(jī)構(gòu)建服務(wù)的場景中涨颜,但也可以是用于構(gòu)建守護(hù)進(jìn)程等場景中费韭。
② 角色集合
角色集合:roles/
mysql/
httpd/
nginx/
files/:存儲由copy或script等模塊調(diào)用的文件;
tasks/:此目錄中至少應(yīng)該有一個名為main.yml的文件庭瑰,用于定義各task星持;其它的文件需要由main.yml進(jìn)行“包含”調(diào)用;
handlers/:此目錄中至少應(yīng)該有一個名為main.yml的文件弹灭,用于定義各
handler督暂;其它的文件需要由main.yml進(jìn)行“包含”調(diào)用揪垄;
vars/:此目錄中至少應(yīng)該有一個名為main.yml的文件,用于定義各
variable逻翁;其它的文件需要由main.yml進(jìn)行“包含”調(diào)用饥努;
templates/:存儲由template模塊調(diào)用的模板文本;
meta/:此目錄中至少應(yīng)該有一個名為main.yml的文件八回,定義當(dāng)前角色的特殊設(shè)定及其依賴關(guān)系酷愧;其它的文件需要由main.yml進(jìn)行“包含”調(diào)用;
default/:此目錄中至少應(yīng)該有一個名為main.yml的文件缠诅,用于設(shè)定默認(rèn)變量溶浴;
③ 角色定制實(shí)例
1. 在roles目錄下生成對應(yīng)的目錄結(jié)構(gòu)
2. 定義配置文件 我們需要修改的配置文件為/tasks/main.yml,下面管引,我們就來修改一下:
3. 放置我們所需要的文件到指定目錄 因?yàn)槲覀兌x的角色已經(jīng)有了新的組成方式士败,所以我們需要把文件都放到指定的位置,這樣汉匙,才能讓配置文件找到這些并進(jìn)行加載拱烁。 rpm包放在files目錄下噩翠,模板放在templates目錄下:
4. 修改變量文件 我們在模板中定義的變量,也要去配置文件中加上
[root@server nginx]# vim vars/main.yml
nginxprot: 9999
5. 定義handlers文件 我們在配置文件中定義了notify邦投,所以我么也需要定義handlers伤锚,我們來修改配置文件:
6. 定義劇本文件 接下來,我們就來定義劇本文件志衣,由于大部分設(shè)置我們都單獨(dú)配置在了roles里面屯援,所以,接下來劇本就只需要寫一點(diǎn)點(diǎn)內(nèi)容即可:
7. 啟動服務(wù) 劇本定義完成以后念脯,我們就可以來啟動服務(wù)了: