一、playbook概述
1.1 playbook 介紹
playbook 是 ansible 用于配置,部署,和管理被控節(jié)點(diǎn)的劇本。通過 playbook 的詳細(xì)描述,執(zhí)行其中的一系列 tasks ,可以讓遠(yuǎn)端主機(jī)達(dá)到預(yù)期的狀態(tài)。playbook 就像 Ansible 控制器給被控節(jié)點(diǎn)列出的的一系列 to-do-list ,而被控節(jié)點(diǎn)必須要完成。也可以這么理解,playbook 字面意思,即劇本,現(xiàn)實(shí)中由演員按照劇本表演,在 Ansible 中,這次由計(jì)算機(jī)進(jìn)行表演,由計(jì)算機(jī)安裝,部署應(yīng)用,提供對(duì)外服務(wù),以及組織計(jì)算機(jī)處理各種各樣的事情。
1.2 playbook 組成部分
- Tasks:任務(wù),即通過 task 調(diào)用 ansible 的模板將多個(gè)操作組織在一個(gè) playbook 中運(yùn)行
- Variables:變量
- Templates:模板
- Handlers:處理器,當(dāng)changed狀態(tài)條件滿足時(shí),(notify)觸發(fā)執(zhí)行的操作
- Roles:角色;將任務(wù)分類執(zhí)行,彼此之間互不干擾
二、playbook 示例
2.1 playbook 啟動(dòng)及檢測(cè)
//運(yùn)行playbook
ansible-playbook 文件名.yaml
//補(bǔ)充參數(shù):
-k(–ask-pass):用來交互輸入ssh密碼
-K(-ask-become-pass):用來交互輸入sudo密碼
-u:指定用戶
ansible-playbook 文件名.yaml --syntax-check #檢查yaml文件的語(yǔ)法是否正確
ansible-playbook 文件名.yaml --list-task #檢查tasks任務(wù)
ansible-playbook 文件名.yaml --list-hosts #檢查生效的主機(jī)
ansible-playbook 文件名.yaml --start-at-task='install httpd' #指定從某個(gè)task開始運(yùn)行
2.2 實(shí)例一
vim test1.yaml
---
#yaml文件以---開頭,以表明這是一個(gè)yaml文件,可省略
- name: first playbook
#定義一個(gè)play的名稱,可省略
gather_facts: false
#設(shè)置不進(jìn)行facts信息收集,這可以加快執(zhí)行速度,可省略
hosts: webservers
#指定要執(zhí)行任務(wù)的被管理主機(jī)組,如多個(gè)主機(jī)組用冒號(hào)分隔
remote_user: root
#指定被管理主機(jī)上執(zhí)行任務(wù)的用戶
tasks:
#定義任務(wù)列表,任務(wù)列表中的各任務(wù)按次序逐個(gè)在hosts中指定的主機(jī)上執(zhí)行
- name: test connection
#自定義任務(wù)名稱
ping:
#使用 module: [options] 格式來定義一個(gè)任務(wù)
- name: disable selinux
command: '/sbin/setenforce 0'
#command模塊和shell模塊無需使用key=value格式
ignore_errors: True
#如執(zhí)行命令的返回值不為0,就會(huì)報(bào)錯(cuò),tasks停止,可使用ignore_errors忽略失敗的任務(wù)
- name: disable firewalld
service: name=firewalld state=stopped
#使用 module: options 格式來定義任務(wù),option使用key=value格式
- name: install httpd
yum: name=httpd state=latest
- name: install configuration file for httpd
copy: src=/opt/http.conf dest=/etc/httpd/conf/http.conf
#這里需要一個(gè)事先準(zhǔn)備好的/opt/http.conf文件
notify: "restart httpd"
#如以上操作后為changed的狀態(tài)時(shí),會(huì)通過notify指定的名稱觸發(fā)對(duì)應(yīng)名稱的handlers操作
- name: start httpd service
service: enabled=true name=httpd state=started
handlers:
#handlers中定義的就是任務(wù),此處handlers中的任務(wù)使用的是service模塊
- name: restart httpd
#notify和handlers中任務(wù)的名稱必須一致
service: name=httpd state=restarted
##Ansible在執(zhí)行完某個(gè)任務(wù)之后并不會(huì)立即去執(zhí)行對(duì)應(yīng)的handler,而是在當(dāng)前play中所有普通任務(wù)都執(zhí)行完后再去執(zhí)行handler,這樣的好處是可以多次觸發(fā)notify,但最后只執(zhí)行一次對(duì)應(yīng)的handler,從而避免多次重啟。
playbook檢測(cè)
2.3 vars 定義、引用變量
vim test2.yaml
- name: second playbook
hosts: dbservers
remote_user: root
vars: #定義變量
- groupname: mysql #格式為 key: value
- username: nginx
tasks:
- name: create group
group: name={{groupname}} system=yes gid=306 #使用 {{key}} 引用變量的值
- name: create user
user: name={{username}} uid=306 group={{groupname}}
- name: copy file
copy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt #在setup模塊中可以獲取facts變量信息
ansible-playbook test1.yaml -e "username=nginx" #在命令行里定義變量
2.4 指定遠(yuǎn)程主機(jī)sudo切換用戶
- hosts: dbservers
remote_user: zhangsan
become: yes #2.6版本以后的參數(shù),之前是sudo,意思為切換用戶運(yùn)行
become_user: root #指定sudo用戶為root
執(zhí)行playbook時(shí):ansible-playbook test1.yml -K <密碼>
2.5 when條件判斷
在Ansible中,提供的唯一一個(gè)通用的條件判斷是when指令,當(dāng)when指令的值為true時(shí),則該任務(wù)執(zhí)行,否則不執(zhí)行該任務(wù)。
when一個(gè)比較常見的應(yīng)用場(chǎng)景是實(shí)現(xiàn)跳過某個(gè)主機(jī)不執(zhí)行任務(wù)或者只有滿足條件的主機(jī)執(zhí)行任務(wù)
vim test3.yaml
- hosts: all
remote_user: root
tasks:
- name: shutdown host
command: /sbin/shutdown -r now
when: ansible_default_ipv4.address == "192.168.147.106" #when指令中的變量名不需要手動(dòng)加上 {{}}
或
when: inventory_hostname == "<主機(jī)名>"
ansible-playbook test3.yaml
2.6 迭代
Ansible提供了很多種循環(huán)結(jié)構(gòu),一般都命名為with_items,作用等同于 loop 循環(huán)。
vim test4.yaml
- hosts: dbservers
gather_facts: false
tasks:
- name: create directories
file:
path: "{{item}}"
state: directory
with_items: #等同于 loop:
- /tmp/test1
- /tmp/test2
- name: add users
user: name={{item.name}} state=present groups={{item.groups}}
with_items:
- name: test1
groups: wheel
- name: test2
groups: root
或
with_items:
- {name:'test1', groups:'wheel'}
- {name:'test2', groups:'root'}
ansible-playbook test3.yaml
2.7 Templates 模塊
Jinja是基于Python的模板引擎。Template類是Jinja的一個(gè)重要組件,可以看作是一個(gè)編譯過的模板文件,用來產(chǎn)生目標(biāo)文本,傳遞Python的變量給模板去替換模板中的標(biāo)記。
1.先準(zhǔn)備一個(gè)以 .j2 為后綴的 template 模板文件,設(shè)置引用的變量
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
vim /opt/httpd.conf.j2
Listen {{http_port}} #42行,修改
ServerName {{server_name}} #95行,修改
DocumentRoot "{{root_dir}}" #119行,修改
2.修改主機(jī)清單文件,使用主機(jī)變量定義一個(gè)變量名相同,而值不同的變量
vim /etc/ansible/hosts
[webservers]
192.168.147.106 http_port=192.168.147.106:80 server_name=www.zhangsan.com:80 root_dir=/etc/httpd/htdocs
[dbservers]
192.168.147.107 http_port=192.168.147.107:80 server_name=www.lisi.com:80 root_dir=/etc/httpd/htdocs
3.編寫 playbook
vim apache.yaml
---
- hosts: all
remote_user: root
vars:
- package: httpd
- service: httpd
tasks:
- name: install httpd package
yum: name={{package}} state=latest
- name: install configure file
template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #使用template模板
notify:
- restart httpd
- name: create root dir
file: path=/etc/httpd/htdocs state=directory
- name: start httpd server
service: name={{service}} enabled=true state=started
handlers:
- name: restart httpd
service: name={{service}} state=restarted
ansible-playbook apache.yaml
2.8 tags 模塊
可以在一個(gè) playbook 中為某個(gè)或某些任務(wù)定義“標(biāo)簽”,在執(zhí)行此 playbook 時(shí)通過 ansible-playbook 命令使用 --tags 選項(xiàng)能實(shí)現(xiàn)僅運(yùn)行指定的tasks。
playbook還提供了一個(gè)特殊的 tags 為 always 。作用就是當(dāng)使用 always 當(dāng) tags 的 task 時(shí),無論執(zhí)行哪一個(gè) tags 時(shí),定義有 always 的tags 都會(huì)執(zhí)行。
vim webhosts.yaml
- hosts: webservers
remote_user: root
tasks:
- name: Copy hosts file
copy: src=/etc/hosts dest=/opt/hosts
tags:
- only #可自定義
- name: touch file
file: path=/opt/testhost state=touch
tags:
- always #表示始終要運(yùn)行的代碼
ansible-playbook webhosts.yaml --tags="only"
vim dbhosts.yaml
- hosts: dbservers
remote_user: root
tasks:
- name: Copy hosts file
copy: src=/etc/hosts dest=/opt/hosts
tags:
- only
- name: touch file
file: path=/opt/testhost state=touch
ansible-playbook dbhosts.yaml --tags="only"
分別去兩臺(tái)被管理主機(jī)上去查看文件創(chuàng)建情況
2.9 Roles 模塊
Ansible為了層次化、結(jié)構(gòu)化地組織Playbook,使用了角色(roles),roles可以根據(jù)層次型結(jié)構(gòu)自動(dòng)裝載變量文件、task以及handlers等。簡(jiǎn)單來講,roles就是通過分別將變量、文件、任務(wù)、模塊及處理器放置于單獨(dú)的目錄中,并可以便捷地include它們。roles一般用于基于主機(jī)構(gòu)建服務(wù)的場(chǎng)景中,但也可以用于構(gòu)建守護(hù)進(jìn)程等場(chǎng)景中。
roles 的目錄結(jié)構(gòu):
cd /etc/ansible/
tree roles/
roles/
├── web/
│ ├── files/
│ ├── templates/
│ ├── tasks/
│ ├── handlers/
│ ├── vars/
│ ├── defaults/
│ └── meta/
└── db/
├── files/
├── templates/
├── tasks/
├── handlers/
├── vars/
├── defaults/
└── meta/
roles 內(nèi)各目錄含義解釋
目錄 | 含義 |
---|---|
files | 用來存放由 copy 模塊或 script 模塊調(diào)用的文件。 |
templates | 用來存放 jinjia2 模板,template 模塊會(huì)自動(dòng)在此目錄中尋找 jinjia2 模板文件。 |
tasks | 此目錄應(yīng)當(dāng)包含一個(gè) main.yml 文件,用于定義此角色的任務(wù)列表,此文件可以使用 include 包含其它的位于此目錄的 task 文件。 |
handlers | 此目錄應(yīng)當(dāng)包含一個(gè) main.yml 文件,用于定義此角色中觸發(fā)條件時(shí)執(zhí)行的動(dòng)作。 |
vars | 此目錄應(yīng)當(dāng)包含一個(gè) main.yml 文件,用于定義此角色用到的變量。 |
defaults | 此目錄應(yīng)當(dāng)包含一個(gè) main.yml 文件,用于為當(dāng)前角色設(shè)定默認(rèn)變量。 |
meta | 此目錄應(yīng)當(dāng)包含一個(gè) main.yml 文件,用于定義此角色的特殊設(shè)定及其依賴關(guān)系。 |
在一個(gè) playbook 中使用 roles 的步驟:
(1)創(chuàng)建以 roles 命名的目錄
mkdir /etc/ansible/roles/ -p #yum裝完默認(rèn)就有
(2)創(chuàng)建全局變量目錄(可選)
mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all #文件名自己定義,引用的時(shí)候注意
(3)在 roles 目錄中分別創(chuàng)建以各角色名稱命令的目錄,如 httpd、
mysql
mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql
(4)在每個(gè)角色命令的目錄中分別創(chuàng)建files、handlers、tasks、templates、meta、defaults和vars目錄,用不到的目錄可以創(chuàng)建為空目錄,也可以不創(chuàng)建
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
(5)在每個(gè)角色的 handlers、tasks、meta、defaults、vars 目錄下創(chuàng)建 main.yml 文件,千萬不能自定義文件名
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
(6)修改 site.yml 文件,針對(duì)不同主機(jī)去調(diào)用不同的角色
vim /etc/ansible/site.yml
---
- hosts: webservers
remote_user: root
roles:
- httpd
- hosts: dbservers
remote_user: root
roles:
- mysql
(7)運(yùn)行 ansible-playbook
cd /etc/ansible
ansible-playbook site.yml
示例:文章來源:http://www.zghlxwxcb.cn/news/detail-703228.html
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml
------編寫httpd模塊------
寫一個(gè)簡(jiǎn)單的tasks/main.yml
vim /etc/ansible/roles/httpd/tasks/main.yml
- name: install apache
yum: name={{pkg}} state=latest
- name: start apache
service: enabled=true name={{svc}} state=started
//定義變量:可以定義在全局變量中,也可以定義在roles角色變量中,一般定義在角色變量中
vim /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd
svc: httpd
-------編寫mysql模塊-------
vim /etc/ansible/roles/mysql/tasks/main.yml
- name: install mysql
yum: name={{pkg}} state=latest
- name: start mysql
service: enabled=true name={{svc}} state=started
vim /etc/ansible/roles/mysql/vars/main.yml
pkg:
- mariadb
- mariadb-server
svc: mariadb
-------編寫php模塊-----
vim /etc/ansible/roles/php/tasks/main.yml
- name: install php
yum: name={{pkg}} state=latest
- name: start php-fpm
service: enabled=true name={{svc}} state=started
vim /etc/ansible/roles/php/vars/main.yml
pkg:
- php
- php-fpm
svc: php-fpm
-----編寫roles示例-----
vim /etc/ansible/site.yml
---
- hosts: webservers
remote_user: root
roles:
- httpd
- mysql
- php
cd /etc/ansible
ansible-playbook site.yml
文章來源地址http://www.zghlxwxcb.cn/news/detail-703228.html
到了這里,關(guān)于Ansible之playbook劇本的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!