目錄
1.playbook相關(guān)知識(shí)
1.1 playbook 的簡(jiǎn)介
1.2 playbook的?各部分組成
2. 基礎(chǔ)的playbook劇本編寫實(shí)例
2.1 playbook編寫Apache安裝劇本(yum方式安裝)
?報(bào)錯(cuò)集:
?實(shí)例2:playbook編寫nginx 的yum安裝并且能修改其監(jiān)聽端口的劇本
實(shí)例3:定義、引用變量?
實(shí)例4:指定遠(yuǎn)程主機(jī)sudu切換用戶
實(shí)例5:when條件判斷
實(shí)例6: 迭代
實(shí)例7:Templates 模塊
實(shí)例8:tags 模塊
3.Roles 模塊
3.1 roles 的目錄結(jié)構(gòu):
3.2 roles 內(nèi)各目錄含義解釋
1.playbook相關(guān)知識(shí)
1.1 playbook 的簡(jiǎn)介
playbook是 一個(gè)不同于使用Ansible命令行執(zhí)行方式的模式,其功能更強(qiáng)大靈活。簡(jiǎn)單來說,playbook是一個(gè)非常簡(jiǎn)單的配置管理和多主機(jī)部署系統(tǒng),不同于任何已經(jīng)存在的模式,可作為一個(gè)適合部署復(fù)雜應(yīng)用程序的基礎(chǔ)。Playbook可以定制配置,可以按照指定的操作步驟有序執(zhí)行,支持同步和異步方式。我們完成一個(gè)任務(wù),例如安裝部署一個(gè)httpd服務(wù),我們需要多個(gè)模塊(一個(gè)模塊也可以稱之為task)提供功能來完成。而playbook就是組織多個(gè)task的容器,他的實(shí)質(zhì)就是一個(gè)文件,有著特定的組織格式,它采用的語法格式是YAML(Yet Another Markup Language)。
1.2 playbook的?各部分組成
(1)Tasks:任務(wù),即通過 task 調(diào)用 ansible 的模板將多個(gè)操作組織在一個(gè) playbook 中運(yùn)行
(2)Variables:變量
(3)Templates:模板
(4)Handlers:處理器,當(dāng)changed狀態(tài)條件滿足時(shí),(notify)觸發(fā)執(zhí)行的操作
(5)Roles:角色
2. 基礎(chǔ)的playbook劇本編寫實(shí)例
playbook中運(yùn)用的模塊就是ansible中的模塊,就像docker-compose一樣將docker操作容器的指令歸納為一個(gè)yaml文件,開啟運(yùn)行yaml中的指令模塊就能按照預(yù)設(shè)計(jì)的方向去完成。?
2.1 playbook編寫Apache安裝劇本(yum方式安裝)
劇本編寫實(shí)現(xiàn)的需求:對(duì)Ansible管理的所有的webservers組的成員,yum安裝最新版本的apache服務(wù)軟件,并進(jìn)行相應(yīng)環(huán)境的調(diào)整,確保webservers的apache服務(wù)能夠正常運(yùn)行并設(shè)置開機(jī)自啟?
cd /etc/ansible #在ansible的所在目錄中創(chuàng)建該項(xiàng)目的目錄
mkdir apache
vim apache.yaml
---
- name: apache yum apply
gather_facts: false
hosts: webservers
remote_user: root
tasks:
- name: test connection
ping:
- name: stop firewalld
service: name=firewalld state=stopped
- name: stop selinux
command: '/usr/sbin/setenforce 0'
ignore_errors: true
- name: yum install apache service
yum: name=httpd state=latest
- name: start apache service
service: name=httpd state=started enabled=yes
?運(yùn)行劇本:
//運(yùn)行playbook
ansible-playbook apache.yaml
//補(bǔ)充參數(shù):
-k(–ask-pass):用來交互輸入ssh密碼
-K(-ask-become-pass):用來交互輸入sudo密碼
-u:指定用戶
ansible-playbook apache.yaml --syntax-check #檢查yaml文件的語法是否正確
ansible-playbook apache.yaml --list-task #檢查tasks任務(wù)
ansible-playbook apache.yaml --list-hosts #檢查生效的主機(jī)
ansible-playbook apache.yaml --start-at-task='install httpd' #指定從某個(gè)task開始運(yùn)行
?報(bào)錯(cuò)集:
?實(shí)例2:playbook編寫nginx 的yum安裝并且能修改其監(jiān)聽端口的劇本
?需求:通過yum安裝nginx服務(wù),并且能夠控制被管理的主機(jī)的服務(wù)的開啟,按照預(yù)設(shè)的配置在運(yùn)行時(shí)的端口。
在編寫劇本前,需要準(zhǔn)備相應(yīng)的兩個(gè)文件,一個(gè)為nginx的yum源。一個(gè)為相對(duì)應(yīng)的主配置文件,在主配置文件中修改其端口,在將該配置移至被管理主機(jī)中,作為運(yùn)行啟動(dòng)時(shí)的默認(rèn)配置?
mkdir /etc/ansible/nginx
vim nginx.yaml
---
- name: nginx script
gather_facts: false
hosts: webservers
remote_user: root
tasks:
- name: test connection
ping:
- name: stop firewalld
service: name=firewalld state=stopped enabled=no
- name: stop selinux
command: '/usr/sbin/setenforce 0'
ignore_errors: true
- name: prepare nginx repo
copy: src=/etc/ansible/nginx/nginx.repo dest=/etc/yum.repos.d/nginx.repo
- name: install nginx
yum: name=nginx state=latest
- name: change port
copy: src=/opt/default.conf dest=/etc/nginx/conf.d/default.conf
notify: "restart nginx"
- name: start nginx
service: name=nginx state=started enabled=yes
handlers:
- name: restart nginx
service: name=nginx state=restarted
實(shí)例3:定義、引用變量?
- name: second play
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" #在命令行里定義變量
實(shí)例4:指定遠(yuǎn)程主機(jī)sudu切換用戶
---
- 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 <密碼>
實(shí)例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 test2.yaml
---
- hosts: all
remote_user: root
tasks:
- name: shutdown host
command: /sbin/shutdown -r now
when: ansible_default_ipv4.address == "192.168.10.14" #when指令中的變量名不需要手動(dòng)加上 {{}}
或
when: inventory_hostname == "<主機(jī)名>"
ansible-playbook test2.yaml
實(shí)例6: 迭代
Ansible提供了很多種循環(huán)結(jié)構(gòu),一般都命名為with_items,作用等同于 loop 循環(huán)。
vim test3.yaml
---
- name: play1
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.yam
實(shí)例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.10.14 http_port=192.168.10.14:80 server_name=www.accp.com:80 root_dir=/etc/httpd/htdocs
[dbservers]
192.168.10.15 http_port=192.168.0.15:80 server_name=www.benet.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
實(shí)例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)建情況
3.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)景中。
3.1 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/
3.2 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)變量。文章來源:http://www.zghlxwxcb.cn/news/detail-691091.html●meta
此目錄應(yīng)當(dāng)包含一個(gè) main.yml 文件,用于定義此角色的特殊設(shè)定及其依賴關(guān)系。文章來源地址http://www.zghlxwxcb.cn/news/detail-691091.html
//在一個(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
示例:
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
到了這里,關(guān)于【云原生】Ansible自動(dòng)化批量操作工具&playbook劇本的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!