ansile(3)playbook 使用说明
一、playbook介紹
二、palybook使用說明
三、roles說明及配置
一、playbook介紹
1.playbook介紹
顧名思義,playbook就是類似演戲的劇本一樣,將所有的戲碼全部放在一起,官方說明如下:
Playbooks是Ansible的配置,部署和編排語言。它們可以描述您希望遠程系統執行的策略,或一般IT流程中的一組步驟。
如果Ansible模塊是車間中的工具,Playbooks是您的使用手冊,您的主機庫存是您的原材料。
在基本層面,劇本可用于管理遠程機器的配置和部署。在更高級的層面上,他們可以對涉及滾動更新的多層次發布進行排序,并且可以將動作委派給其他主機,同時與監視服務器和負載平衡器進行交互。
雖然這里有很多信息,但沒有必要一次學習一切。你可以開始小,并隨著時間的推移更多的功能,當你需要它們。
Playbooks被設計為人類可讀的,并且用基本的文本語言開發。有多種方式來組織劇本和它們包括的文件,我們將提供一些建議,并充分利用Ansible。
二、palybook使用說明
2.playbook的使用及說明
2.1.基本變量及組件
2.1.1.基本組件
主機和用戶說明:
hosts ?為主機的IP,或者主機組名,或者關鍵字all
remote_user 在遠程以哪個用戶身份執行。
become 切換成其它用戶身份執行,值為yes或者no
become_method 與became一起用,指可以為‘sudo’/’su’/’pbrun’/’pfexec’/’doas’
become_user 與bacome_user一起用,可以是root或者其它用戶名?
2.1.2.基本變量
自定義變量需要用` `引用以來即可
例如:
-?host:?cklservervars:?ser_name:?nginxtasks:-?name:?install?{{?ser_name?}}-?yum:?name:?{{?ser_name?}}state:?present2.1.3.注意問題!
但是這樣寫YML會報錯:
-?hosts:?app_serversvars:app_path:?{{?base_path?}}/22解決辦法:要在{ 開始的值加上引號:
-?hosts:?app_serversvars:app_path:?"{{?base_path?}}/22"2.2.task說明
2.2.1.task的基本寫法
tasks:-?name:?make?sure?apache?is?runningservice:?name=httpd?state=running參數太長可以分隔到多行
?tasks:-?name:?Copy?ansible?inventory?file?to?clientcopy:?src=/etc/ansible/hosts?dest=/etc/ansible/hostsowner=root?group=root?mode=0644或者用yml的字典作為參數
?tasks:-?name:?Copy?ansible?inventory?file?to?clientcopy:?src:?/etc/ansible/hosts?dest:?/etc/ansible/hostsowner:?rootgroup:?root?mode:?06442.2.2.task的執行狀態
task中每個action會調用一個module,在module中會去檢查當前系統狀態是否需要重新執行. 具體的判斷規則由各個module自己實現.
? ? .如果執行那么action會得到返回值changed;
? ? .如果不需要執行,那么action得到返回值ok
2.3.示例說明
2.3.1.不廢話看一個簡單的例子:
#?cat?apache.yml? -?hosts:?webserveruser:?roottasks:-?name:?restart?httpdservice:?name=httpd?state=restarted執行結果:
YML文件簡單說明:
-?hosts:?webserver??//服務器組user:?root?//運行用戶tasks:??//任務-?name:?restart?httpd??//任務名稱service:?name=httpd?state=restarted?//操作服務2.3.2.看一個稍微長一點的示例
#?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以上內容說明:
1.添加一個uid為1008的niao用戶
2.安裝httpd服務
3.拷貝配置文件,并修改屬主屬組為niao
4.啟動httpd服務
運行結果:
查看目標文件:
2.4.handler說明
Handlers里面的每一個handler,也是對module的一次調用。而handler與tasks不同的是,handlers不會默認的按順序執行。
Tasks中的任務都是有狀態的,changed或者ok。 Ansible提供了一種機制,只在task的執行狀態為changed的時候,才會觸發執行,這就是handler。
使用情景:
如果你在tasks中修改了apache的配置文件。需要重起apache。此外還安裝了apache的插件。那么還需要重起apache。像這樣的應該場景中,重起apache就可以設計成一個handler.
2.4.1.一個handler最多只執行一次
在所有的任務里表執行之后執行,如果有多個task notify同一個handler,那么只執行一次。
在下面的例子里apache只執行一次
拷貝兩個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運行結果:
action是Changed ,才會執行handler
只有當TASKS種的action的執行狀態是changed時,才會觸發notify handler的執行。
下面的腳本執行兩次,執行結果是不同的:
上面的次執行是,tasks的狀態都是changed,會觸發兩個handler
2.4.2.下面的執行是:
第一個task的狀態是changed,觸發了handlers"call in copy action"
第二個task的狀態是OK,那么不會觸發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運行結果:
2.5.主機的系統變量(facts)
2.5.1.收集變量
ansible會通過module setup來收集主機的系統信息,這些收集到的系統信息叫做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.變量子屬性訪問
那么可以通過下面的兩種方式訪問復雜的變量中的子屬性:
中括號:
{{?ansible_ens3["ipv4"]["address"]?}}點號:
{{?ansible_ens3.ipv4.address?}}關閉facts
-?hosts:?whatevergather_facts:?no2.6.使用命令行變量
在命令行里面傳值得的方法:
ansible-playbook?ckl.yml?--extra-vars?"hosts=web?user=root"還可以用json格式傳遞參數:
ansible-playbook?ckl.yml?--extra-vars?"{'hosts':'ckl1.com',?'user':'root'}"還可以將參數放在文件里面:
ansible-playbook?ckl.yml?--extra-vars?"@vars.json"2.7.include調用
很簡單,看例子就行
Include語句的功能,基本的代碼重用機制。主要重用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文件中使用
運行結果:
三、roles說明及配置
比include更強大的代碼重用機制。一個role可以包含vars_files, tasks, and handlers等等. 通常一個role定義了如何完成一個特定的功能,比如安裝Webservers可以寫成一個role, 安裝Database可以寫成一個role.
role的目錄結構
site.yml roles/dbserver/??files/templates/tasks/handlers/vars/defaults/meta/webserver/files/templates/tasks/handlers/vars/defaults/meta/每個角色都會遵循以下原則:
- 如果'roles/x/tasks/main.yml'存在,里面的任務列表會被添加到`play`中。
- 如果'roles/x/handlers/main.yml'存在,里面的`handlers`會被添加到`play`中。
- 如果'roles/x/vars/main.yml'存在,里面的變量會被添加到`play`中。
- 如果'roles/x/meta/main.yml'存在,里面的角色依賴會被添加到角色列表中。
- 在'roles/x/files'任務所需要被復制的文件,無需絕對路徑或者相對路徑都可以引用該文件。
- 在'roles/x/files'中的任務腳本都可以直接使用該文件,無需指定絕對路徑或者是相對路徑。
- 在'roles/x/templates'中的模板,無需指定絕對路徑或者相對路徑,都可以直接使用文件名引用該文件。
- 需要包含在`roles/x/tasks'中的任務文件時,無需指定絕對路徑或者相對路徑,可以直接使用文件名包含。
測試示例:
目標:apache服務器組安裝httpd并拷貝配置文件,啟動程序
? ? ? dbserver服務器組安裝maridb并拷貝配置文件,啟動程序
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.整體結構
#?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.運行結果:
轉載于:https://blog.51cto.com/ckl893/1887521
總結
以上是生活随笔為你收集整理的ansile(3)playbook 使用说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简述session
- 下一篇: 容器化实践金融业案例一