Ansible之playbooks劇本
一.playbooks介紹
1.playbooks簡(jiǎn)述
(1)playbooks是ansible用于配置,部署,和管理被控節(jié)點(diǎn)的劇本。
(2)通過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)通過playbooks可以一次在多臺(tái)機(jī)器執(zhí)行多個(gè)指令。通過這種預(yù)先設(shè)計(jì)的配置保持了機(jī)器的配置統(tǒng)一,并很簡(jiǎn)單的執(zhí)行日常任務(wù)。
(4)ansible通過不同的模塊實(shí)現(xiàn)相應(yīng)的管理,管理的方式通過定義的清單文件(hosts)所管理的主機(jī)包括認(rèn)證的方式連接的端口等。所有的功能都是通過調(diào)用不同的模塊(modules)來完成不同的功能的。不管是執(zhí)行單條命令還是play-book都是基于清單文件。
2.playbooks劇本格式
playbooks由YMAL語言編寫,YMAL格式是類似于JSON的文件格式,一個(gè)文件中有多個(gè)play,一個(gè)play中只能有一個(gè)tasks,一個(gè)tasks中可以有多個(gè)name任務(wù)。
注意事項(xiàng):
①大小寫明個(gè)
②通過縮進(jìn)表示層級(jí)關(guān)系
③不支持制表符tab鍵縮進(jìn),只能使用空格縮進(jìn)
④縮進(jìn)的空格數(shù)目不重要,只要相同層級(jí)左右對(duì)齊,通常開頭縮進(jìn)2個(gè)空格
⑤#號(hào)注釋
⑥符號(hào)字符后縮進(jìn)1個(gè)空格,如冒號(hào):逗號(hào),橫杠-后面空一個(gè)格
⑦如果包含特殊字符用單引號(hào)和雙引號(hào)引起來會(huì)作為字符串處理,單引號(hào)不識(shí)別變量,雙引號(hào)識(shí)別變量。
3.playbooks組成部分
模塊名 | 注釋 |
---|---|
Tasks | 任務(wù),即通過 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開始執(zhí)行或只執(zhí)行某個(gè)標(biāo)簽的name
ansible-playbook 文件.yaml --start-at-task=‘任務(wù)名/標(biāo)簽’
#啟動(dòng)此文件補(bǔ)充參數(shù):
-k(-ask-pass):用來交互式輸入ssh密碼
-K(-ask-become-pass):用來交互式輸入sudo密碼
-U:指定用戶
ansible-playbook 文件.yaml --list-task #檢查yml文件
ansible-playbook 文件.yaml --list-hosts #檢測(cè)主機(jī)
ansible-playbook 文件.yaml --syntax-check #檢測(cè)語法
二.模塊實(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文件以---開頭,以表明這是一個(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] 格式來定義一個(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/httpd.conf dest=/etc/httpd/conf/httpd.conf
#這里需要一個(gè)事先準(zhǔn)備好的/opt/httpd.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,從而避免多次重啟。
#檢測(cè)文件是否有誤
ansible-playbook test1.yaml --syntax-check
#執(zhí)行文件
ansible-playbook test1.yaml
#192.168.198.12上查看httpd服務(wù)是否安裝并且服務(wù)狀態(tài)開啟
systemctl status httpd
2.vars模塊實(shí)戰(zhàn)實(shí)例
定義、引用變量
vim test2.yaml
- name: second play
hosts: dbservers
remote_user: root
vars: #定義變量
- groupname: testgroup #格式為 key: value
- username: testuser
tasks:
- name: create group
group: name={{groupname}} system=yes gid=308 #使用 {{key}} 引用變量的值
- name: create user
user: name={{username}} uid=309 group={{groupname}}
- name: copy file
copy: 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]$
vim test3.yaml
- name: Sudo
hosts: webservers
gather_facts: false
tasks:
- name: zjf
become: true
become_method: sudo
become_user: root #指定sudo用戶為root
command: whoami
register: result
- name: zjf
debug:
var: result.stdout
#檢測(cè)文件
ansible-playbook test3.yaml --syntax-check
#執(zhí)行文件
ansible-playbook test3.yaml
在打開一個(gè)終端即切換成功
4.when模塊實(shí)戰(zhàn)實(shí)例
在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 test4.yaml
---
- hosts: all
remote_user: root
tasks:
- name: test when
service: name=httpd state=stopped
when: 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: play1
hosts: webservers
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'}
#檢測(cè)文件
ansible-playbook test5.yaml --syntax-check
#執(zhí)行
ansible-playbook test5.yaml
6.Templates 模塊實(shí)戰(zhàn)實(shí)例
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.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)編寫 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
7.tags 模塊模塊實(shí)戰(zhàn)實(shí)例
可以在一個(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í)行。
(1)創(chuàng)建文件
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"
(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)單來講,roles就是通過分別將變量、文件、任務(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 | 用來存放由 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)系。 |
(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 文件,千萬不能自定義文件名
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: webservers
remote_user: root
roles:
- httpd
- hosts: dbservers
remote_user: root
roles:
- 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} -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
(4)編寫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
(5)定義變量:可以定義在全局變量中,也可以定義在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
systemctl status httpd.service
systemctl status php-fpm.service
systemctl status mariadb.service
文章來源:http://www.zghlxwxcb.cn/news/detail-702543.html
lsof -i:9000
lsof -i:80
lsof -i:3306
文章來源地址http://www.zghlxwxcb.cn/news/detail-702543.html
到了這里,關(guān)于Ansible之playbooks劇本的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!