ansile(3)playbook 使用说明
一、playbook介紹
二、palybook使用說(shuō)明
三、roles說(shuō)明及配置
一、playbook介紹
1.playbook介紹
顧名思義,playbook就是類似演戲的劇本一樣,將所有的戲碼全部放在一起,官方說(shuō)明如下:
Playbooks是Ansible的配置,部署和編排語(yǔ)言。它們可以描述您希望遠(yuǎn)程系統(tǒng)執(zhí)行的策略,或一般IT流程中的一組步驟。
如果Ansible模塊是車間中的工具,Playbooks是您的使用手冊(cè),您的主機(jī)庫(kù)存是您的原材料。
在基本層面,劇本可用于管理遠(yuǎn)程機(jī)器的配置和部署。在更高級(jí)的層面上,他們可以對(duì)涉及滾動(dòng)更新的多層次發(fā)布進(jìn)行排序,并且可以將動(dòng)作委派給其他主機(jī),同時(shí)與監(jiān)視服務(wù)器和負(fù)載平衡器進(jìn)行交互。
雖然這里有很多信息,但沒有必要一次學(xué)習(xí)一切。你可以開始小,并隨著時(shí)間的推移更多的功能,當(dāng)你需要它們。
Playbooks被設(shè)計(jì)為人類可讀的,并且用基本的文本語(yǔ)言開發(fā)。有多種方式來(lái)組織劇本和它們包括的文件,我們將提供一些建議,并充分利用Ansible。
二、palybook使用說(shuō)明
2.playbook的使用及說(shuō)明
2.1.基本變量及組件
2.1.1.基本組件
主機(jī)和用戶說(shuō)明:
hosts ?為主機(jī)的IP,或者主機(jī)組名,或者關(guān)鍵字all
remote_user 在遠(yuǎn)程以哪個(gè)用戶身份執(zhí)行。
become 切換成其它用戶身份執(zhí)行,值為yes或者no
become_method 與became一起用,指可以為‘sudo’/’su’/’pbrun’/’pfexec’/’doas’
become_user 與bacome_user一起用,可以是root或者其它用戶名?
2.1.2.基本變量
自定義變量需要用` `引用以來(lái)即可
例如:
-?host:?cklservervars:?ser_name:?nginxtasks:-?name:?install?{{?ser_name?}}-?yum:?name:?{{?ser_name?}}state:?present2.1.3.注意問題!
但是這樣寫YML會(huì)報(bào)錯(cuò):
-?hosts:?app_serversvars:app_path:?{{?base_path?}}/22解決辦法:要在{ 開始的值加上引號(hào):
-?hosts:?app_serversvars:app_path:?"{{?base_path?}}/22"2.2.task說(shuō)明
2.2.1.task的基本寫法
tasks:-?name:?make?sure?apache?is?runningservice:?name=httpd?state=running參數(shù)太長(zhǎng)可以分隔到多行
?tasks:-?name:?Copy?ansible?inventory?file?to?clientcopy:?src=/etc/ansible/hosts?dest=/etc/ansible/hostsowner=root?group=root?mode=0644或者用yml的字典作為參數(shù)
?tasks:-?name:?Copy?ansible?inventory?file?to?clientcopy:?src:?/etc/ansible/hosts?dest:?/etc/ansible/hostsowner:?rootgroup:?root?mode:?06442.2.2.task的執(zhí)行狀態(tài)
task中每個(gè)action會(huì)調(diào)用一個(gè)module,在module中會(huì)去檢查當(dāng)前系統(tǒng)狀態(tài)是否需要重新執(zhí)行. 具體的判斷規(guī)則由各個(gè)module自己實(shí)現(xiàn).
? ? .如果執(zhí)行那么action會(huì)得到返回值changed;
? ? .如果不需要執(zhí)行,那么action得到返回值ok
2.3.示例說(shuō)明
2.3.1.不廢話看一個(gè)簡(jiǎn)單的例子:
#?cat?apache.yml? -?hosts:?webserveruser:?roottasks:-?name:?restart?httpdservice:?name=httpd?state=restarted執(zhí)行結(jié)果:
YML文件簡(jiǎn)單說(shuō)明:
-?hosts:?webserver??//服務(wù)器組user:?root?//運(yùn)行用戶tasks:??//任務(wù)-?name:?restart?httpd??//任務(wù)名稱service:?name=httpd?state=restarted?//操作服務(wù)2.3.2.看一個(gè)稍微長(zhǎng)一點(diǎn)的示例
#?cat?apache.yml? -?hosts:?webserverremote_user:?rootvars:ser_name:?httpdtasks:-?name:?add?run?useruser:?name='niao'?uid=1008?state=present-?name:?install?package?{{?ser_name?}}?yum:?name={{?ser_name?}}?state=present-?name:?copy?{{?ser_name?}}?config?filecopy:?src=/etc/ansible/conf_dir/{{?ser_name?}}.conf?dest=/etc/{{?ser_name?}}/conf/?owner=niao?group=niao-?name:?start?{{?ser_name?}}?serverservice:?name={{?ser_name?}}?state=started以上內(nèi)容說(shuō)明:
1.添加一個(gè)uid為1008的niao用戶
2.安裝httpd服務(wù)
3.拷貝配置文件,并修改屬主屬組為niao
4.啟動(dòng)httpd服務(wù)
運(yùn)行結(jié)果:
查看目標(biāo)文件:
2.4.handler說(shuō)明
Handlers里面的每一個(gè)handler,也是對(duì)module的一次調(diào)用。而handler與tasks不同的是,handlers不會(huì)默認(rèn)的按順序執(zhí)行。
Tasks中的任務(wù)都是有狀態(tài)的,changed或者ok。 Ansible提供了一種機(jī)制,只在task的執(zhí)行狀態(tài)為changed的時(shí)候,才會(huì)觸發(fā)執(zhí)行,這就是handler。
使用情景:
如果你在tasks中修改了apache的配置文件。需要重起apache。此外還安裝了apache的插件。那么還需要重起apache。像這樣的應(yīng)該場(chǎng)景中,重起apache就可以設(shè)計(jì)成一個(gè)handler.
2.4.1.一個(gè)handler最多只執(zhí)行一次
在所有的任務(wù)里表執(zhí)行之后執(zhí)行,如果有多個(gè)task notify同一個(gè)handler,那么只執(zhí)行一次。
在下面的例子里apache只執(zhí)行一次
拷貝兩個(gè)apache的配置文件,重啟一次:
#?vim?httpd.yml?????????????? -?hosts:?webserverremote_user:?rootvars:ser_name:?httpdtasks:-?name:?copy?{{?ser_name?}}?config?file?cklcopy:?src=/etc/ansible/conf_dir/ckl.conf?dest=/etc/{{?ser_name?}}/conf.d/?owner=niao?group=niaonotify:-?call?in?copy?action-?name:?copy?{{?ser_name?}}?config?file?zldcopy:?src=/etc/ansible/conf_dir/zld.conf?dest=/etc/{{?ser_name?}}/conf.d/?owner=niao?group=niaonotify:-?call?in?copy?actionhandlers:-?name:?call?in?copy?actionservice:?name={{?ser_name?}}?state=started運(yùn)行結(jié)果:
action是Changed ,才會(huì)執(zhí)行handler
只有當(dāng)TASKS種的action的執(zhí)行狀態(tài)是changed時(shí),才會(huì)觸發(fā)notify handler的執(zhí)行。
下面的腳本執(zhí)行兩次,執(zhí)行結(jié)果是不同的:
上面的次執(zhí)行是,tasks的狀態(tài)都是changed,會(huì)觸發(fā)兩個(gè)handler
2.4.2.下面的執(zhí)行是:
第一個(gè)task的狀態(tài)是changed,觸發(fā)了handlers"call in copy action"
第二個(gè)task的狀態(tài)是OK,那么不會(huì)觸發(fā)handlers"call in add user action"
#?vim?call_by.yml? -?hosts:?webserverremote_user:?rootvars:ser_name:?httpdtasks:-?name:?copy?{{?ser_name?}}?config?file?cklcopy:?src=/etc/ansible/conf_dir/ckl.conf?dest=/etc/{{?ser_name?}}/conf.d/?owner=niao?group=niaonotify:-?call?in?copy?action-?name:?add?user?niaouser:?name='niao'?uid=1008notify:-?call?in?add?user?actionhandlers:-?name:?call?in?copy?actionservice:?name={{?ser_name?}}?state=started-?name:?call?in?add?user?actionservice:?name={{?ser_name?}}?state=started運(yùn)行結(jié)果:
2.5.主機(jī)的系統(tǒng)變量(facts)
2.5.1.收集變量
ansible會(huì)通過(guò)module setup來(lái)收集主機(jī)的系統(tǒng)信息,這些收集到的系統(tǒng)信息叫做facts,這些facts信息可以直接以變量的形式使用。
ansible?dbserver?-m?setup?-u?root ..."ipv4":?{"address":?"172.16.110.49",?"broadcast":?"172.16.110.255",?"netmask":?"255.255.255.0",?"network":?"172.16.110.0"},?"ipv6":?[{"address":?"fe80::4986:a223:c2d8:0",?"prefix":?"64",?"scope":?"link"},? ...."ansible_hostname":?"localhost",?"ansible_interfaces":?["lo",?"ens33"],? ...."ansible_nodename":?"localhost.localdomain",?"ansible_os_family":?"RedHat",?"ansible_pkg_mgr":?"yum",?"ansible_processor":?["GenuineIntel",?"Intel(R)?Core(TM)?i7-6500U?CPU?@?2.50GHz"],? ...2.5.2.使用facts變量示例:
-?hosts:?dbserveruser:?roottasks:-?name:?echo?systemshell:?echo?{{?ansible_os_family?}}-?name?install?ntp?on?RedHat?linuxyum:?name=ntp?state=installedwhen:?ansible_os_family?==?"RedHat"2.5.3.變量子屬性訪問
那么可以通過(guò)下面的兩種方式訪問復(fù)雜的變量中的子屬性:
中括號(hào):
{{?ansible_ens3["ipv4"]["address"]?}}點(diǎn)號(hào):
{{?ansible_ens3.ipv4.address?}}關(guān)閉facts
-?hosts:?whatevergather_facts:?no2.6.使用命令行變量
在命令行里面?zhèn)髦档玫姆椒?#xff1a;
ansible-playbook?ckl.yml?--extra-vars?"hosts=web?user=root"還可以用json格式傳遞參數(shù):
ansible-playbook?ckl.yml?--extra-vars?"{'hosts':'ckl1.com',?'user':'root'}"還可以將參數(shù)放在文件里面:
ansible-playbook?ckl.yml?--extra-vars?"@vars.json"2.7.include調(diào)用
很簡(jiǎn)單,看例子就行
Include語(yǔ)句的功能,基本的代碼重用機(jī)制。主要重用tasks。
主配置yml:
#?cat?main.yml? -?hosts:?webserverremote_user:?rootvars:ser_name:?httpdtasks:-?include:?taks/call_by.yml需要include的yml文件:
#?cat?taks/call_by.yml? -?name:?copy?{{?ser_name?}}?config?file?cklcopy:?src=/etc/ansible/conf_dir/ckl.conf?dest=/etc/{{?ser_name?}}/conf.d/?owner=niao?group=niaonotify:-?call?in?copy?action -?name:?add?user?niao?user:?name='niao'?uid=1008?notify:-?call?in?add?user?action主配置的變量可以在include文件中使用
運(yùn)行結(jié)果:
三、roles說(shuō)明及配置
比include更強(qiáng)大的代碼重用機(jī)制。一個(gè)role可以包含vars_files, tasks, and handlers等等. 通常一個(gè)role定義了如何完成一個(gè)特定的功能,比如安裝Webservers可以寫成一個(gè)role, 安裝Database可以寫成一個(gè)role.
role的目錄結(jié)構(gòu)
site.yml roles/dbserver/??files/templates/tasks/handlers/vars/defaults/meta/webserver/files/templates/tasks/handlers/vars/defaults/meta/每個(gè)角色都會(huì)遵循以下原則:
- 如果'roles/x/tasks/main.yml'存在,里面的任務(wù)列表會(huì)被添加到`play`中。
- 如果'roles/x/handlers/main.yml'存在,里面的`handlers`會(huì)被添加到`play`中。
- 如果'roles/x/vars/main.yml'存在,里面的變量會(huì)被添加到`play`中。
- 如果'roles/x/meta/main.yml'存在,里面的角色依賴會(huì)被添加到角色列表中。
- 在'roles/x/files'任務(wù)所需要被復(fù)制的文件,無(wú)需絕對(duì)路徑或者相對(duì)路徑都可以引用該文件。
- 在'roles/x/files'中的任務(wù)腳本都可以直接使用該文件,無(wú)需指定絕對(duì)路徑或者是相對(duì)路徑。
- 在'roles/x/templates'中的模板,無(wú)需指定絕對(duì)路徑或者相對(duì)路徑,都可以直接使用文件名引用該文件。
- 需要包含在`roles/x/tasks'中的任務(wù)文件時(shí),無(wú)需指定絕對(duì)路徑或者相對(duì)路徑,可以直接使用文件名包含。
測(cè)試示例:
目標(biāo):apache服務(wù)器組安裝httpd并拷貝配置文件,啟動(dòng)程序
? ? ? dbserver服務(wù)器組安裝maridb并拷貝配置文件,啟動(dòng)程序
1.配置webserver
#?cd?roles #?mkdir?-p?webserver/{files,templates,tasks,handlers,vars,defaults,meta}1.1.拷貝配置文件:
cp?httpd.conf?webserver/files1.2.配置tasks:
#?cat?roles/webserver/tasks/main.yml? -?name:?add?run?useruser:?name='niao'?uid=1008?state=present -?name:?install?package?httpdyum:?name=httpd?state=present -?name:?copy?httpd?config?filecopy:?src=httpd.conf?dest=/etc/httpd/conf/?owner=niao?group=niao1.3.配置handlers
#?cat?roles/webserver/handlers/main.yml? -?name:?start?httpd?serverservice:?name=httpd?state=started2.配置dbserver
#?mkdir?-p?dbserver/{files,templates,tasks,handlers,vars,defaults,meta}2.1.拷貝配置文件
cp?my.cnf?dbserver/files2.2.配置tasks:
#?cat?roles/dbserver/tasks/main.yml??????????????????? -?name:?install?mariadb?packageyum:?name=mariadb-server?state=present -?name:?copy?config?filecopy:?src=my.cnf?dest=/etc/2.3.配置handlers
#?cat?roles/dbserver/handlers/main.yml?????? -?name:?start?mariadb?serverservice:?name=mariadb?state=started3.整體結(jié)構(gòu)
#?tree ├──?roles │???├──?dbserver │???│???├──?defaults │???│???├──?files │???│???│???└──?my.cnf │???│???├──?handlers │???│???│???└──?main.yml │???│???├──?meta │???│???├──?tasks │???│???│???└──?main.yml │???│???├──?templates │???│???└──?vars │???└──?webserver │???????├──?defaults │???????├──?files │???????│???└──?httpd.conf │???????├──?handlers │???????│???└──?main.yml │???????├──?meta │???????├──?tasks │???????│???└──?main.yml │???????├──?templates │???????└──?vars ├──?site.retry ├──?site.yml4.site配置
#?cat?site.yml? -?hosts:?webserverremote_user:?rootroles:-?webserver -?hosts:?dbserverremote_user:?rootroles:-?dbserver5.運(yùn)行結(jié)果:
轉(zhuǎn)載于:https://blog.51cto.com/ckl893/1887521
總結(jié)
以上是生活随笔為你收集整理的ansile(3)playbook 使用说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简述session
- 下一篇: 容器化实践金融业案例一