Ansible自动化运维基础-------ploybook
前提提要:此文是https://blog.csdn.net/kali_yao/article/details/119983133進(jìn)階板
目錄
一.ploybook的介紹及用法介紹
1. Ploubook的概述:
2.YAML是什么??
3.Playbook語法格式要求如下:
二.用法案例
1.編寫第一個Playbook(劇本)
2.用戶管理,創(chuàng)建系統(tǒng)賬戶、賬戶屬性、設(shè)置密碼
3.使用playbook管理邏輯卷
4.使用playbook管理軟件
5.firewalld模塊配置防火墻策略
6.template模塊
7.Ansible變量應(yīng)用案例
8.定義變量的方法
三.Ansible高級語法應(yīng)用
1.error錯誤處理
2.handlers
3.when條件判斷
4.block任務(wù)塊
5.always語句定義無論block任務(wù)是否成功,都要執(zhí)行的任務(wù)
6.loop循環(huán)
四.Ansible Roles角色
1.roles的簡介
2.roles目錄介紹
3.創(chuàng)建一個簡單的roles
4.寫一個稍微難一點的rodes(自動部署Web集群)
Ansible ad-hoc可以通過命令行形式遠(yuǎn)程管理其他主機,適合執(zhí)行一些臨時性簡單任務(wù)。另外還有一種遠(yuǎn)程管理的方式叫Playbook,Ansible Playbook中文名稱叫劇本,它將經(jīng)常需要執(zhí)行的任務(wù)寫入一個文件,這個文件就叫劇本。
一.ploybook的介紹及用法介紹
1. Ploubook的概述:
劇本中可以包含多個任務(wù)
劇本寫后,我們隨時根據(jù)劇本,執(zhí)行相關(guān)的任務(wù)命令
Playbook劇本要求按照YAML格式編寫
適合執(zhí)行周期性經(jīng)常執(zhí)行的復(fù)雜任務(wù)
2.YAML是什么??
YAML是一個可讀性高、用來表達(dá)數(shù)據(jù)序列的格式語言
YAML:YAML Ain't a Markup Language
YAML以數(shù)據(jù)為中心,重點描述數(shù)據(jù)的關(guān)系和結(jié)構(gòu)
YAML的格式要求如下:
"#"代表注釋,一般第一行為三個橫杠(---)
鍵值(key/value)對使用":"表示,數(shù)組使用"-"表示,"-"后面有空格
key和value之間使用":"分隔,":"后面必須有空格
一般縮進(jìn)由兩個或以上空格組成
相同層級的縮進(jìn)必須對齊,縮進(jìn)代表層級關(guān)系
全文不可以使用tab鍵
區(qū)分大小寫
擴(kuò)展名為yml或者yaml
跨行數(shù)據(jù)需要使用>或者|,其中|會保留換行符
YAML 官方網(wǎng)站:http://www.yaml.org
3.Playbook語法格式要求如下:
playbook采用YAML格式編寫
playbook文件中由一個或多個play組成每個play中可以包含: hosts(主機)、tasks(任務(wù))、vars(變量)等元素組成
使用ansible-playbook命令運行playbook劇本??????
二.用法案例
1.編寫第一個Playbook(劇本)
hosts、tasks、name是關(guān)鍵詞(不可修改),ping是模塊,調(diào)用不同模塊完成不同任務(wù)。
vim ~/ansible/test.yml --- - hosts: all????????????????????????????????#hosts定義要遠(yuǎn)程誰?tasks:????????????????????????????????????#tasks定義遠(yuǎn)程后要執(zhí)行的任務(wù)有哪些?- name: This is my first playbook #name后面的具體內(nèi)容可以任意ping:ansible-playbook ~/ansible/test.yml??? #運行
?ansible-playbook ~/ansible/test.yml???? --check #只檢測不運行
2.用戶管理,創(chuàng)建系統(tǒng)賬戶、賬戶屬性、設(shè)置密碼
vim ~/ansible/test_john.yml --- - hosts: webservertasks:- name: Add the user 'johnd' user:name: johnduid: 1040group: daemonshell: /bin/bashgroups: bin,admpassword: "{{ '123' | password_hash('sha512') }}"3.使用playbook管理邏輯卷
vim ~/ansible/lvm.yml --- - hosts: node2?????????????????????#遠(yuǎn)程node2主機tasks:- name: Create a new primary partition with a size of 1GiB #任務(wù)的描述信息parted: #調(diào)用parted模塊進(jìn)行分區(qū) device: /dev/vdb #對/dev/vdb磁盤進(jìn)行分區(qū)(磁盤名稱不要照抄)label: gpt #分區(qū)表類型為gpt,或msdosnumber: 1 #分區(qū)編號(創(chuàng)建第幾個分區(qū))state: present #present是創(chuàng)建分區(qū),absent是刪除分區(qū)part_start: 1MiB #分區(qū)的開始位置(默認(rèn)從最開始位置分區(qū))part_end: 1GiB #分區(qū)的結(jié)束位置(不寫就分到磁盤最后位置)- name: Create a volume group on top of /dev/vdb1 #第二個任務(wù)的描述信息lvg: #調(diào)用lvg模塊,創(chuàng)建VG卷組vg: my_vg #要創(chuàng)建的卷組名稱pvs: /dev/vdb1 #使用哪個分區(qū)創(chuàng)建PV- name: Create a logical volume of 512m #第三個任務(wù)的描述信息lvol: #調(diào)用lvol模塊創(chuàng)建LVvg: my_vg #使用哪個VG創(chuàng)建LVlv: my_lv #需要創(chuàng)建的LV名稱size: 512m #要創(chuàng)建的LV大小,可以不指定單位,默認(rèn)單位m- filesystem: #格式化分區(qū)fstype: ext4 #格式化類型dev: /dev/sdb1 #哪塊磁盤force: true #強制執(zhí)行4.使用playbook管理軟件
--- - hosts: webserver #需要遠(yuǎn)程的主機是誰tasks: #定義劇本需要執(zhí)行的任務(wù)- name: Install a list of packages #第一個任務(wù)的描述信息 yum: #調(diào)用yum模塊安裝軟件name: #安裝軟件的名字,它的值有多個,使用數(shù)組-- httpd #安裝httpd軟件- mariadb #安裝mariadb軟件- mariadb-server #安裝mariadb-server- name: install the 'RPM Development Tools' package group #第二個任務(wù)的描述信息yum: #調(diào)用yum模塊安裝軟件組包name: "@RPM Development Tools" #安裝哪個組包,@是關(guān)鍵詞- name: update software #第三個任務(wù)的描述信息yum: #調(diào)用yum模塊升級軟件name: '*' #需要升級哪些軟件state: latest #latest代表升級軟件5.firewalld模塊配置防火墻策略
--- - hosts: test #hosts定義需要遠(yuǎn)程的主機tasks: #tasks定義需要執(zhí)行哪些任務(wù)- name: install firewalld. #name為第一個任務(wù)定義描述信息yum: #第一個任務(wù)調(diào)用yum模塊安裝軟件name: firewalld #需要安裝的軟件名稱為firewalldstate: present #state等于present代表安裝軟件- name: run firewalld. #定義第二個任務(wù)的描述信息service: #第二個任務(wù)調(diào)用service模塊啟動服務(wù)name: firewalld #啟動的服務(wù)名稱為firewalldstate: started #state等于started代表啟動服務(wù)enabled: yes #enabled等于yes是設(shè)置服務(wù)為開機自啟動- name: set firewalld rule. #第三個任務(wù)的描述信息firewalld: #第三個任務(wù)調(diào)用firewalld模塊設(shè)置防火墻規(guī)則port: 80/tcp #在防火墻規(guī)則中添加一個放行tcp,80端口的規(guī)則permanent: yes #permanent 是設(shè)置永久規(guī)則immediate: yes #immediate 是讓規(guī)則立刻生效state: enabled #state等于enabled是添加防火墻規(guī)則6.template模塊
copy模塊可以將一個文件拷貝給遠(yuǎn)程主機,但是如果希望每個拷貝的文件內(nèi)容都不一樣呢?如何給所有web主機拷貝index.html內(nèi)容是各自的IP地址?
Ansible可以利用Jinja2模板引擎讀取變量,之前在playbook中調(diào)用變量,也是Jinja2的功能,Jinja2模塊的表達(dá)式包含在分隔符"{{ }}"內(nèi)。
vim ~/ansible/index.html #創(chuàng)建一個文件并寫入內(nèi)容 Welcome to {{ansible_hostname}} on {{ ansible_eth0.ipv4.address }}. vim ~/ansible/template.yml --- - hosts: webservertasks:- name: use template copy index.html to webserver.template: #拷貝文件src: ~/ansible/index.html #原文件dest: /tmp/index.html #目標(biāo)7.Ansible變量應(yīng)用案例
1)setup模塊
ansible_facts用于采集被管理設(shè)備的系統(tǒng)信息,所有收集的信息都被保存在變量中,每次執(zhí)行playbook默認(rèn)第一個任務(wù)就是Gathering Facts,使用setup模塊可以查看收集到的facts信息。也就是所有環(huán)境變量
ansible test -m setup2)debug模塊
debug模塊可以顯示變量的值,可以輔助排錯,通過msg可以顯示變量的值,變量需要使用{{}}擴(kuò)起來。
--- - hosts: testtasks:- debug:msg: "主機名是:{{ ansible_hostname }}"- debug:msg: "總內(nèi)存大小:{{ ansible_memtotal_mb }}"8.定義變量的方法
Ansible支持十幾種定義變量的方式,這里我們僅介紹其中一部分變量。
下面是根據(jù)優(yōu)先級排序的定義方式:
????????Inventory變量 指定主機清單的變量
????????Host Facts變量?? 主機事實變量
????????Playbook變量 劇本里的變量
????????變量文件 優(yōu)先集先從變量文件開始
1))Inventory變量(在主機清單配置文件中定義變量)清單不是yml格式。
vim ~/ansible/inventory [test] node1 iname="nb" [proxy] node2 [webserver] node[3:4] [webserver:vars](不可改變的變量) iname="dachui" --- - hosts: node1,webserver #定義需要遠(yuǎn)程管理的主機是誰 tasks: #劇目要完成哪些任務(wù)- name: create a user with var. #劇目中的第一個任務(wù)描述信息user: #調(diào)用user模塊創(chuàng)建用戶name: "{{ iname }}" #需要創(chuàng)建的用戶名是iname這個變量#在ansible劇本中當(dāng)調(diào)用變量時,開始位置就調(diào)用變量,就需要在{{}}外面加雙引號
#如果是在后面或者中間位置調(diào)用變量{{}}外面可以不加雙引號,也可以加雙引號
2)Host Facts變量(可以直接調(diào)用ansible收集的系統(tǒng)信息)
--- - hosts: testtasks:- name: create user.user:name: "{{ansible_hostname}}"#定義劇本,遠(yuǎn)程所有被管理主機,調(diào)用user模塊,創(chuàng)建用戶
#需要創(chuàng)建的用戶名ansible_hostname是一個ansible_facts變量
3)Playbook變量(使用vars關(guān)鍵詞可以在playbook內(nèi)定義變量)
--- - hosts: testvars: #vars是關(guān)鍵詞,用來定義變量用的iname: heal #具體變量名是iname,值是healipass: '123456' #再定義一個變量名是ipass,值是123456 #注意密碼必須是字符串,需要引號 tasks: #tasks定義需要執(zhí)行的任務(wù)- name: Use variables create user. #給任務(wù)寫個描述信息 user: #調(diào)用user模塊創(chuàng)建用戶name: "{{ iname }}" #用戶名的是前面定義的變量password: "{{ ipass | password_hash('sha512') }}"4)單獨定義個變量文件
vim ~/ansible/variables.yml --- iname: cloud ipass: '123456'在playbook中用vars_files調(diào)用該文件
--- - hosts: testvars_files: variables.yml #當(dāng)變量比較多時,專門定義一個文件用來存變量tasks:- name: create user.user:name: "{{ iname }}"password: "{{ ipass | password_hash('sha512') }}"三.Ansible高級語法應(yīng)用
1.error錯誤處理
默認(rèn)ansible在遇到error會立刻停止playbook,使用ignore_errors可以忽略錯誤,繼續(xù)后續(xù)的任務(wù)。
--- - hosts: testtasks:- name: start a service that does not exist.service:name: hehestate: startedignore_errors: true #針對某一個任務(wù)忽略錯誤(ignore_errors是關(guān)鍵詞) - name: touch a file. # ignored=1(忽略1個)file:path: /tmp/service.txtstate: touch --- - hosts: testignore_errors: true #針對playbook全局忽略錯誤 tasks:- name: start a service that does not exist.service:name: hehestate: started- name: touch a file.file:path: /tmp/service.txtstate: touch2.handlers
在劇本中tasks用來定義任務(wù)(一定會執(zhí)行),handlers也可以定義任務(wù)(不一定執(zhí)行),handlers任務(wù)要想執(zhí)行必須要被別人觸發(fā)才能執(zhí)行
--- - hosts: testtasks:(一定安順序執(zhí)行)- 任務(wù)1notify:任務(wù)5(僅當(dāng)?shù)谝粋€執(zhí)行且為黃色再執(zhí)行【綠色不行】)- 任務(wù)2handlers:(不一定執(zhí)行)(僅當(dāng)前面執(zhí)行且為黃色再執(zhí)行【綠色不行】)- 任務(wù)5(當(dāng)任務(wù)相同只執(zhí)行一次而且是在tasks執(zhí)行完后再執(zhí)行)- 任務(wù)63.when條件判斷
when可以定義判斷條件,條件為真時才執(zhí)行某個任務(wù)。 常見條件操作符有:==、!=、>、>=、<、<=。多個條件可以使用and(并且)或or(或者)分割,when表達(dá)式中調(diào)用變量不要使用{{ }}。
--- - hosts: testtasks:- name: check memory size.service:name: NetworkManagerstate: stoppedwhen: ansible_memfree_mb < 700#被管理端主機剩余內(nèi)存不足700M則關(guān)閉NetworkManager服務(wù)(也可以關(guān)閉別的不需要的服務(wù))skipped=1(跳過一個)
4.block任務(wù)塊
如果我們需要當(dāng)條件滿足時執(zhí)行N個任務(wù),我們可以給N個任務(wù)后面都加when判斷(但是很麻煩),此時可以使用block定義一個任務(wù)塊,當(dāng)條件滿足時執(zhí)行整個任務(wù)塊.
任務(wù)塊就是把一組任務(wù)合并為一個任務(wù)組,使用block語句可以將多個任務(wù)合并為一個任務(wù)組。
--- - hosts: testtasks:- name: define a group of tasks.block: #block是關(guān)鍵詞,定義任務(wù)組- name: install httpd #任務(wù)組中的第一個任務(wù)yum: #調(diào)用yum模塊安裝httpd軟件包name: httpdstate: present- name: start httpd #任務(wù)組中的第二個任務(wù)service: #調(diào)用service模塊啟動httpd服務(wù)name: httpdstate: startedwhen: ansible_distribution == "RedHat" #僅當(dāng)條件滿足再執(zhí)行任務(wù)組注意:when和block是對齊的,他們在一個級別,當(dāng)條件滿足時要執(zhí)行的是任務(wù)組(不是某一個任務(wù))
5.always語句定義無論block任務(wù)是否成功,都要執(zhí)行的任務(wù)
--- - hosts: testtasks:- block:- name: touch a file test1.txtfile:name: /tmp/test1.txt #如果修改為/tmp/xyz/test1.txt就無法創(chuàng)建成功 state: touchrescue:(block成功則rescue失敗)(反之即可)- name: touch a file test2.txtfile:name: /tmp/test2.txtstate: touchalways:(總是執(zhí)行)- name: touch a file test3.txtfile:name: /tmp/test3.txtstate: touch主:Ansible從上到下執(zhí)行
6.loop循環(huán)
相同模塊需要反復(fù)被執(zhí)行怎么處理?使用loop循環(huán)可以避免重復(fù)
--- - hosts: testtasks:- name: mkdir multi directory.file:path=/tmp/{{item}} #注意,item是關(guān)鍵字,調(diào)用loop循環(huán)的值 state=directory (目前版本還是可以這么寫的)loop: #loop是關(guān)鍵詞,定義循環(huán)的值,下面是具體的值- School- Legend- Life四.Ansible Roles角色
1.roles的簡介
為了實現(xiàn)不同的功能,我們會編寫大量的playbook文件。而且,每個playbook還可能會調(diào)用其他文件(如變量文件),對于海量的、無規(guī)律的文件,管理起來非常痛苦!
Ansible從1.2版本開始支持Role,Role是管理ansible文件的一種規(guī)范(目錄結(jié)構(gòu)),Role(角色)會按照標(biāo)準(zhǔn)的規(guī)范,自動到特定的目錄和文件中讀取數(shù)據(jù)。
如果我們創(chuàng)建了一個名稱為user.example的Role(角色),則其標(biāo)準(zhǔn)的目錄結(jié)構(gòu)如下
2.roles目錄介紹
defualts/main.yml?????? :定義變量的缺省值,優(yōu)先級較低
vars/main.yml????????????? :定義變量,優(yōu)先級高
files目錄????????????????????? :存儲靜態(tài)文件的目錄,如tar包、音樂、視頻等
templates目錄??????????? :存放動態(tài)數(shù)據(jù)文件的地方(文件中包含了變量的模板文件)
meta/main.yml??? ???????? :寫作者、版本等描述信息
README.md????????????????:整個角色(role)的描述信息
handlers/main.yml????????:定義handlers
tasks/main.yml?????????????? :定義任務(wù)的地方
3.創(chuàng)建一個簡單的roles
公共Roles倉庫(https://galaxy.ansible.com)管理
1)創(chuàng)建目錄
mkdir ~/ansible/roles
2)創(chuàng)建角色
使用ansible-galaxy install可以直接下載Role,也可以編寫requirements.yml文件下載Role。
如:直接 ansible-galaxy init? ~/ansible/roles/issue
劇本
#格式一:可以直接從Ansible Galaxy官網(wǎng)下載 - src: acandid.httpd #格式二:可以從某個git服務(wù)器下載 - src: http://gitlab.com/xxx/xxx.gitscm: gitversion: 56e00a54name: nginx-acme #格式三:可以指定位置下載tar包,支持http、https、file - src: http://example.com/myrole.tarname: myrole[root@control ansible]# ansible-galaxy install \ -r ~/ansible/roles/requirements.yml \ -p roles # -r后面跟文件名,該文件中包含了需要下載哪些role以及他們的鏈接位置 # -p 指定將下載的role保存到哪個目錄?4.寫一個稍微難一點的rodes(自動部署Web集群)
1)創(chuàng)建role角色
?ansible-galaxy? init? ~/ansible/roles/http
2)修改roles配置文件,準(zhǔn)備2臺http網(wǎng)站的素材
vim roles/http/tasks/main.yml --- - name: install httpdyum:name: httpdstate: present - name: create index.htmlcopy:content: "{{ansible_hostname}}"(不拷貝文件拷貝內(nèi)容)(等同于劇本先讀取變量成直)dest: /var/www/html/index.html - name: set firewalldfirewalld:service: httpstate: enabledpermanent: yesimmediate: yes - name: start httpdservice:name: httpdstate: startedenabled: yes#文件中包含多個任務(wù),每個任務(wù)可以設(shè)置一個name名字(也可以沒有name)
#第一個任務(wù)調(diào)用yum模塊安裝httpd軟件包
#第二個任務(wù)調(diào)用copy模塊創(chuàng)建一個新的網(wǎng)頁文件(index.html)
????????#調(diào)用copy模塊時可以在沒有源文件的情況下,直接使用content指定文件的內(nèi)容
????????#將該內(nèi)容直接拷貝到被管理主機的某個文件中(/var/www/html/index.html)
#第三個任務(wù)調(diào)用firewalld模塊,設(shè)置防火墻規(guī)則,允許訪問http服務(wù)
#第四個任務(wù)調(diào)用service模塊將httpd服務(wù)啟動,并設(shè)置開機自啟。
3)編寫Playbook調(diào)用role,并執(zhí)行Playbook。
vim web.yml --- - hosts: webserverroles:- http [root@control ansible]# ansible-playbook web.yml4)部署nginx代理服務(wù)器
? ????????????? (1)? 創(chuàng)建roles角色
ansible-galaxy init ~/ansible/roles/proxy???????????????? (2) 準(zhǔn)備代理服務(wù)器需要的素材并安裝
vim ~/ansible/roles/proxy/files/nginx_install.sh #!/bin/bash dnf -y install net-tools psmisc gcc make pcre-devel openssl-devel wget https://sourceforge.net/projects/pcre/files/pcre/8.35/pcre-8.35.tar.gz/download?use_mirror=udomain????????????????? (3)新建一個Nginx代理服務(wù)器的配置文件模板
vim ~/ansible/roles/proxy/files/nginx.conf worker_processes 2; #error_log logs/error.log; events {worker_connections 65535; }http {include mime.types;default_type application/octet-stream;sendfile on;tcp_nopush on;keepalive_timeout 65;#gzip on; upstream webs {server 192.168.4.13;server 192.168.4.14; }server {listen 80;server_name localhost;location / {proxy_pass http://webs;root html;index index.html index.htm;}error_page 404 /404.html;error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}} }? ????????????????(4)修改role配置文件
vim roles/proxy/tasks/main.yml --- - name: install nginx through shell script.script: nginx_install.shargs:creates: /usr/local/nginx/sbin/nginx- name: copy nginx.conf to destination host.copy:src: nginx.confdest: /usr/local/nginx/conf/nginx.conf- name: run nginx service.shell: /usr/local/nginx/sbin/nginxargs:creates: /usr/local/nginx/logs/nginx.pid #nginx.pid存在,說明nginx已經(jīng)啟動。如果該文件存在,則不再啟動nginx。 - name: set firewalldfirewalld:service: httpstate: enabledpermanent: yesimmediate: yes#執(zhí)行源碼編譯安裝腳本,如果已經(jīng)安裝nginx,則不再執(zhí)行安裝腳本.
#args是關(guān)鍵詞,設(shè)置script模塊的參數(shù),通過creates參數(shù)做判斷,creates也是關(guān)鍵詞 #creates后面跟文件名,如果creates判斷文件存在的話就不再執(zhí)行script模塊對應(yīng)的命令。
???????????????? (5)編寫Playbook調(diào)用role,并執(zhí)行Playbook
[root@control ansible]# vim proxy.yml --- - hosts: proxyroles:- proxy [root@control ansible]# ansible-playbook proxy.yml總結(jié)
以上是生活随笔為你收集整理的Ansible自动化运维基础-------ploybook的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ansible自动化运维基础------
- 下一篇: ansible加密敏感数据