武漢網(wǎng)站制作模板小程序推廣方案
文章目錄
- 一.playbooks介紹
- 1.playbooks簡(jiǎn)述
- 2.playbooks劇本格式
- 3.playbooks組成部分
- 4.運(yùn)行playbooks及檢測(cè)文件配置
- 二.模塊實(shí)戰(zhàn)實(shí)例
- 1.playbooks模塊實(shí)戰(zhàn)實(shí)例
- 2.vars模塊實(shí)戰(zhàn)實(shí)例
- 3.指定遠(yuǎn)程主機(jī)sudo切換用戶
- 4.when模塊實(shí)戰(zhàn)實(shí)例
- 5.with_items迭代模塊實(shí)戰(zhàn)實(shí)例
- 6.Templates 模塊實(shí)戰(zhàn)實(shí)例
- (1)先準(zhǔn)備一個(gè)以 .j2 為后綴的 template 模板文件,設(shè)置引用的變量
- (2)修改主機(jī)清單文件,使用主機(jī)變量定義一個(gè)變量名相同,而值不同的變量
- (3)編寫(xiě) playbook
- 7.tags 模塊模塊實(shí)戰(zhàn)實(shí)例
- (1)創(chuàng)建文件
- (2)分別去兩臺(tái)被管理主機(jī)上去查看文件創(chuàng)建情況
- 8.Roles 模塊模塊實(shí)戰(zhàn)實(shí)例
- (1)roles 的目錄結(jié)構(gòu):
- (2)roles 內(nèi)各目錄含義解釋
- (3)在一個(gè) playbook 中使用 roles 的步驟:
- (4)編寫(xiě)httpd模塊
- (5)定義變量:可以定義在全局變量中,也可以定義在roles角色變量中,一般定義在角色變量中
一.playbooks介紹
1.playbooks簡(jiǎn)述
(1)playbooks是ansible用于配置,部署,和管理被控節(jié)點(diǎn)的劇本。
(2)通過(guò)playbooks的詳細(xì)描述,執(zhí)行其中的tasks,可以讓遠(yuǎn)端主機(jī)達(dá)到預(yù)期的狀態(tài)。playbooks是由一個(gè)或多個(gè)”play”組成的列表。 當(dāng)對(duì)一臺(tái)機(jī)器做環(huán)境初始化的時(shí)候往往需要不止做一件事情,使用playbooks。
(3)通過(guò)playbooks可以一次在多臺(tái)機(jī)器執(zhí)行多個(gè)指令。通過(guò)這種預(yù)先設(shè)計(jì)的配置保持了機(jī)器的配置統(tǒng)一,并很簡(jiǎn)單的執(zhí)行日常任務(wù)。
(4)ansible通過(guò)不同的模塊實(shí)現(xiàn)相應(yīng)的管理,管理的方式通過(guò)定義的清單文件(hosts)所管理的主機(jī)包括認(rèn)證的方式連接的端口等。所有的功能都是通過(guò)調(diào)用不同的模塊(modules)來(lái)完成不同的功能的。不管是執(zhí)行單條命令還是play-book都是基于清單文件。
2.playbooks劇本格式
playbooks由YMAL語(yǔ)言編寫(xiě),YMAL格式是類似于JSON的文件格式,一個(gè)文件中有多個(gè)play,一個(gè)play中只能有一個(gè)tasks,一個(gè)tasks中可以有多個(gè)name任務(wù)。
注意事項(xiàng):
①大小寫(xiě)注意
②通過(guò)縮進(jìn)表示層級(jí)關(guān)系
③不支持制表符tab鍵縮進(jìn),只能使用空格縮進(jìn)
④縮進(jìn)的空格數(shù)目不重要,只要相同層級(jí)左右對(duì)齊,通常開(kāi)頭縮進(jìn)2個(gè)空格
⑤#號(hào)注釋
⑥符號(hào)字符后縮進(jìn)1個(gè)空格,如冒號(hào):逗號(hào),橫杠-后面空一個(gè)格
⑦如果包含特殊字符用單引號(hào)和雙引號(hào)引起來(lái)會(huì)作為字符串處理,單引號(hào)不識(shí)別變量,雙引號(hào)識(shí)別變量。
3.playbooks組成部分
模塊名 | 注釋 |
---|---|
Tasks | 任務(wù),即通過(guò) task 調(diào)用 ansible 的模板將多個(gè)操作組織在一個(gè) playbook 中運(yùn)行 |
Variables | 變量 |
Templates | 模板 |
Handlers | 處理器,當(dāng)changed狀態(tài)條件滿足時(shí),(notify)觸發(fā)執(zhí)行的操作 |
Roles | 角色 |
4.運(yùn)行playbooks及檢測(cè)文件配置
ansible-playbook 文件名.yaml
#從某個(gè)task開(kāi)始執(zhí)行或只執(zhí)行某個(gè)標(biāo)簽的name
ansible-playbook 文件.yaml --start-at-task=‘任務(wù)名/標(biāo)簽’
#啟動(dòng)此文件補(bǔ)充參數(shù):
-k(-ask-pass):用來(lái)交互式輸入ssh密碼
-K(-ask-become-pass):用來(lái)交互式輸入sudo密碼
-U:指定用戶
ansible-playbook 文件.yaml --list-task #檢查yml文件
ansible-playbook 文件.yaml --list-hosts #檢測(cè)主機(jī)
ansible-playbook 文件.yaml --syntax-check #檢測(cè)語(yǔ)法
二.模塊實(shí)戰(zhàn)實(shí)例
1.playbooks模塊實(shí)戰(zhàn)實(shí)例
#在ansible的機(jī)器上需要提前安裝httpd服務(wù),因?yàn)橐獙⒆约旱膆ttps.conf文件復(fù)制到需要自動(dòng)化控制安裝的機(jī)器上
yum install httpd -y
cd /etc/httpd/conf
cp httpd.conf /opt/
vim /etc/ansible/hosts
[webservers]
192.168.198.12
[dbservers]
192.168.198.13
cd ~
vim test1.yaml---
#yaml文件以---開(kāi)頭,以表明這是一個(gè)yaml文件,可省略
- name: first play
#定義一個(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] 格式來(lái)定義一個(gè)任務(wù)- name: disable selinuxcommand: '/sbin/setenforce 0'
#command模塊和shell模塊無(wú)需使用key=value格式ignore_errors: True
#如執(zhí)行命令的返回值不為0,就會(huì)報(bào)錯(cuò),tasks停止,可使用ignore_errors忽略失敗的任務(wù)- name: disable firewalldservice: name=firewalld state=stopped
#使用 module: options 格式來(lái)定義任務(wù),option使用key=value格式- name: install httpdyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
#這里需要一個(gè)事先準(zhǔn)備好的/opt/httpd.conf文件notify: "restart httpd"
#如以上操作后為changed的狀態(tài)時(shí),會(huì)通過(guò)notify指定的名稱觸發(fā)對(duì)應(yīng)名稱的handlers操作- name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers:
#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,從而避免多次重啟。
#檢測(cè)文件是否有誤
ansible-playbook test1.yaml --syntax-check
#執(zhí)行文件
ansible-playbook test1.yaml
#192.168.198.12上查看httpd服務(wù)是否安裝并且服務(wù)狀態(tài)開(kāi)啟
systemctl status httpd
2.vars模塊實(shí)戰(zhàn)實(shí)例
定義、引用變量
建立一個(gè)變量組,在調(diào)用的時(shí)候直接調(diào)用
為何定義:方便,只需修改變量即可不用修改任務(wù)里的內(nèi)容
vim test2.yaml- name: second playhosts: dbserversremote_user: rootvars: #定義變量- groupname: testgroup #格式為 key: value- username: testusertasks:- name: create groupgroup: name={{groupname}} system=yes gid=308 #使用 {{key}} 引用變量的值- name: create useruser: name={{username}} uid=309 group={{groupname}} - name: copy filecopy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt #在setup模塊中可以獲取facts變量信息
#檢測(cè)文件配置
ansible-playbook test2.yaml --syntax-check
#執(zhí)行文件
ansible-playbook test2.yaml
ansible-playbook test2.yaml -e "username=testuser" #在命令行里定義變量
#查看創(chuàng)建的用戶、組信息
ansible dbservers -a 'id testuser'
3.指定遠(yuǎn)程主機(jī)sudo切換用戶
注:
webservers中要有zjf用戶,首先需要?jiǎng)?chuàng)建用戶,切換到普通用戶
[root@test2 ~]# useradd zjf
[root@test2 ~]# su zjf
[zjf@test2 root]$
#在ansible主機(jī)創(chuàng)建
vim test3.yaml- name: Sudohosts: webserversgather_facts: falsetasks:- name: zjfbecome: truebecome_method: sudobecome_user: root #指定sudo用戶為rootcommand: whoamiregister: result- name: zjfdebug:var: result.stdout
#檢測(cè)文件
ansible-playbook test3.yaml --syntax-check
#執(zhí)行文件
ansible-playbook test3.yaml
在打開(kāi)一個(gè)終端即切換成功
4.when模塊實(shí)戰(zhàn)實(shí)例
在Ansible中,提供的唯一一個(gè)通用的條件判斷是when指令,當(dāng)when指令的值為true時(shí),則該任務(wù)執(zhí)行,否則不執(zhí)行該任務(wù)。
when一個(gè)比較常見(jiàn)的應(yīng)用場(chǎng)景是實(shí)現(xiàn)跳過(guò)某個(gè)主機(jī)不執(zhí)行任務(wù)或者只有滿足條件的主機(jī)執(zhí)行任務(wù)
vim test4.yaml---
- hosts: allremote_user: roottasks:- name: test when service: name=httpd state=stoppedwhen: ansible_default_ipv4.address == "192.168.198.12" #when指令中的變量名不需要手動(dòng)加上 {{}}
或 when: inventory_hostname == "<主機(jī)名>"
ansible-playbook test4.yaml
5.with_items迭代模塊實(shí)戰(zhàn)實(shí)例
Ansible提供了很多種循環(huán)結(jié)構(gòu),一般都命名為with_items,作用等同于 loop 循環(huán)
vim test5.yaml---
- name: play1hosts: webserversgather_facts: falsetasks:- name: create directoriesfile:path: "{{item}}"state: directorywith_items: #等同于 loop:- /tmp/test1- /tmp/test2- name: add usersuser: name={{item.name}} state=present groups={{item.groups}}with_items:- name: test1groups: wheel- name: test2groups: root
或with_items:- {name:'test1', groups:'wheel'}- {name:'test2', groups:'root'}
#檢測(cè)文件
ansible-playbook test5.yaml --syntax-check
#執(zhí)行
ansible-playbook test5.yaml
6.Templates 模塊實(shí)戰(zhàn)實(shí)例
Jinja是基于Python的模板引擎。Template類是Jinja的一個(gè)重要組件,可以看作是一個(gè)編譯過(guò)的模板文件,用來(lái)產(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.j2Listen {{http_port}} #42行,修改
ServerName {{server_name}} #95行,修改
DocumentRoot "{{root_dir}}" #119行,修改
(2)修改主機(jī)清單文件,使用主機(jī)變量定義一個(gè)變量名相同,而值不同的變量
vim /etc/ansible/hosts [webservers]
192.168.198.12 http_port=192.168.198.12:80 server_name=www.accp.com:80 root_dir=/etc/httpd/htdocs[dbservers]
192.168.198.13 http_port=192.168.198.13:80 server_name=www.benet.com:80 root_dir=/etc/httpd/htdocs
(3)編寫(xiě) playbook
vim apache.yaml---
- hosts: allremote_user: rootvars:- package: httpd- service: httpdtasks:- name: install httpd packageyum: name={{package}} state=latest- name: install configure filetemplate: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #使用template模板notify:- restart httpd- name: create root dirfile: path: /etc/httpd/htdocs state: directory- name: start httpd serverservice: name={{service}} enabled=true state=startedhandlers:- name: restart httpdservice: name={{service}} state=restarted
ansible-playbook apache.yaml
7.tags 模塊模塊實(shí)戰(zhàn)實(shí)例
可以在一個(gè)playbook中為某個(gè)或某些任務(wù)定義“標(biāo)簽”,在執(zhí)行此playbook時(shí)通過(guò)ansible-playbook命令使用–tags選項(xiàng)能實(shí)現(xiàn)僅運(yùn)行指定的tasks。
playbook還提供了一個(gè)特殊的tags為always。作用就是當(dāng)使用always當(dāng)tags的task時(shí),無(wú)論執(zhí)行哪一個(gè)tags時(shí),定義有always的tags都會(huì)執(zhí)行。
(1)創(chuàng)建文件
vim webhosts.yaml- hosts: webserversremote_user: roottasks:- name: Copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags:- only #可自定義- name: touch filefile: path=/opt/testhost state=touchtags:- always #表示始終要運(yùn)行的代碼
ansible-playbook webhosts.yaml --tags="only"
vim dbhosts.yaml- hosts: dbserversremote_user: roottasks:- name: Copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags:- only- name: touch filefile: path=/opt/testhost state=touch
ansible-playbook dbhosts.yaml --tags="only"
(2)分別去兩臺(tái)被管理主機(jī)上去查看文件創(chuàng)建情況
8.Roles 模塊模塊實(shí)戰(zhàn)實(shí)例
Ansible為了層次化、結(jié)構(gòu)化地組織Playbook,使用了角色(roles),roles可以根據(jù)層次型結(jié)構(gòu)自動(dòng)裝載變量文件、task以及handlers等。簡(jiǎn)單來(lái)講,roles就是通過(guò)分別將變量、文件、任務(wù)、模塊及處理器放置于單獨(dú)的目錄中,并可以便捷地include它們。roles一般用于基于主機(jī)構(gòu)建服務(wù)的場(chǎng)景中,但也可以用于構(gòu)建守護(hù)進(jìn)程等場(chǎng)景中。
(1)roles 的目錄結(jié)構(gòu):
yum install tree -y
cd /etc/ansible/
tree roles/
roles/
(2)roles 內(nèi)各目錄含義解釋
目錄 | 解釋 |
---|---|
files | 用來(lái)存放由 copy 模塊或 script 模塊調(diào)用的文件。 |
templates | 用來(lái)存放 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)系。 |
(3)在一個(gè) playbook 中使用 roles 的步驟:
①創(chuàng)建以 roles 命名的目錄
#yum裝完默認(rèn)就有
mkdir /etc/ansible/roles/ -p
②創(chuàng)建全局變量目錄(可選)
mkdir /etc/ansible/group_vars/ -p
#文件名自己定義,引用的時(shí)候注意
touch /etc/ansible/group_vars/all
③在 roles 目錄中分別創(chuàng)建以各角色名稱命令的目錄,如 httpd、mysql
mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql
④在每個(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}
⑤在每個(gè)角色的 handlers、tasks、meta、defaults、vars 目錄下創(chuàng)建 main.yml 文件,千萬(wàn)不能自定義文件名
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
⑥修改 site.yml 文件,針對(duì)不同主機(jī)去調(diào)用不同的角色
vim /etc/ansible/site.yml- hosts: webserversremote_user: rootroles:- httpd
- hosts: dbserversremote_user: rootroles:- mysql
⑦運(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} -ptouch /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
(4)編寫(xiě)httpd模塊
寫(xiě)一個(gè)簡(jiǎn)單的tasks/main.yml
vim /etc/ansible/roles/httpd/tasks/main.yml
- name: install apacheyum: name={{pkg}} state=latest
- name: start apacheservice: enabled=true name={{svc}} state=started
(5)定義變量:可以定義在全局變量中,也可以定義在roles角色變量中,一般定義在角色變量中
vim /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd
svc: httpd
①編寫(xiě)mysql模塊
vim /etc/ansible/roles/mysql/tasks/main.yml- name: install mysqlyum: name={{pkg}} state=latest
- name: start mysqlservice: enabled=true name={{svc}} state=started
vim /etc/ansible/roles/mysql/vars/main.yml
pkg:- mariadb- mariadb-server
svc: mariadb
②編寫(xiě)php模塊
vim /etc/ansible/roles/php/tasks/main.yml- name: install phpyum: name={{pkg}} state=latest
- name: start php-fpmservice: enabled=true name={{svc}} state=started
vim /etc/ansible/roles/php/vars/main.yml
pkg:- php- php-fpm
svc: php-fpm
③編寫(xiě)roles示例
vim /etc/ansible/site.yml
- hosts: webserversremote_user: rootroles:- httpd- mysql- php
cd /etc/ansible
ansible-playbook site.yml
systemctl status httpd.service
systemctl status php-fpm.service
systemctl status mariadb.service
lsof -i:9000
lsof -i:80
lsof -i:3306