- ansible介紹
- ansible常用模塊使用
- playbook
- templates,模板
- 條件測試和循環(huán)迭代
- roles宁舰,角色
一拼卵、ansible介紹
ansible:自動化運(yùn)維工具,實(shí)現(xiàn)了批量系統(tǒng)配置蛮艰、批量程序部署腋腮、批量運(yùn)行命令
特性:
模塊化:調(diào)用特定的模塊,完成特定任務(wù)
基于Python語言實(shí)現(xiàn):包含Paramiko, PyYAML和Jinja2三個關(guān)鍵模塊
部署簡單:agentless壤蚜,不需在被配置主機(jī)安裝客戶端
支持自定義模塊
支持playbook
冪等性:任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同-
文件結(jié)構(gòu):
配置文件:/etc/ansible/ansible.cfg
主機(jī)清單:/etc/ansible/hosts- 主機(jī)清單配置文件格式:
[webservers] // 主機(jī)組名即寡,包含下面的主機(jī) alpha.example.org beta.example.org 192.168.1.100 192.168.1.110
主程序:
/usr/bin/ansible
/usr/bin/ansible-playbook
/usr/bin/ansible-doc
二、ansible常用模塊使用
(一)ansible使用語法:
// 調(diào)用模塊執(zhí)行操作
ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS -f FORKS -C -u USERNAME -c CONNECTION
// 列出所有可以調(diào)用的模塊
ansible-doc -l
// 列出指定模塊的使用方法
ansible-doc -s MOD_NAME
- 測試1:ping模塊袜刷,測試管理的主機(jī)的網(wǎng)絡(luò)連接狀態(tài)聪富,連接成功返回pong
ansible all -m ping
(二)command模塊:在遠(yuǎn)程主機(jī)運(yùn)行命令
- chdir=/PATH/TO/DIR:
執(zhí)行命令前切換工作目錄至指定的位置 - creates=/PATH/TO/SOMEFILE_OR_DIR:
如果此處給定的文件或目錄存在,則不執(zhí)行命令 - removes=/PATH/TO/SOMEFILE_OR_DIR:
如果此處給定的文件或目錄不存在著蟹,則不執(zhí)行命令墩蔓;即此處給定的文件或目錄存在時方執(zhí)行命令 - 測試2:查詢管理主機(jī)指定網(wǎng)卡狀態(tài)
ansible all -m command -a 'ip a show ens33'
- 測試3:chdir的作用為在執(zhí)行命令前切換至相應(yīng)目錄
ansible 192.168.136.230 -m command -a 'pwd chdir=/tmp'
ansible 192.168.136.230 -m command -a 'pwd'
- 省略-m MOD_NAME時,則代表command模塊
(三)shell模塊:在遠(yuǎn)程主機(jī)的shell進(jìn)程下運(yùn)行命令萧豆,支持shell特性奸披,如管道等
- chdir=:
執(zhí)行命令前切換工作目錄至指定的位置 - creates=/PATH/TO/SOMEFILE_OR_DIR:
如果此處給定的文件或目錄存在,則不執(zhí)行命令 - removes=/PATH/TO/SOMEFILE_OR_DIR:
如果此處給定的文件或目錄不存在涮雷,則不執(zhí)行命令阵面;即此處給定的文件或目錄存在時方執(zhí)行命令 - executable=/PATH/TO/SHELL:指定運(yùn)行命令使用的shell解釋器
- 測試4:管理遠(yuǎn)程主機(jī)——修改賬號密碼
ansible websrvs -m shell -a 'echo centos | passwd --stdin user1 '
(四)group模塊:管理組賬號
- name=:必須參數(shù),組賬號名
- state=present | absent:建立/刪除組賬號
- system=yes | no:是否為系統(tǒng)賬號
- gid=:組ID
- 測試5:管理遠(yuǎn)程主機(jī)——建立組
ansible websrvs -m group -a 'name=haproxy system=yes state=present'
(五)user模塊:管理用戶賬號
- name=:必須參數(shù)洪鸭,用戶賬號名
- system=yes | no:是否為系統(tǒng)賬號
- uid=:用戶ID
- shell=:指定shell類型
- group=:指定主組
- groups=:指定附加組
- comment=:指定說明
- home=:指定家目錄
- generate_ssh_key=:是否生成ssh密鑰
- 測試6:管理遠(yuǎn)程主機(jī)——建立用戶
ansible websrvs -m user -a 'name=john groups=haproxy state=present shell=/bin/tcsh generate_ssh_key=true'
(六)copy模塊: Copies files to remote locations
- 用法1:src= dest=:
將本地的文件復(fù)制到管理的主機(jī)組中 - 用法2:content= dest=:
在管理的主機(jī)組中中創(chuàng)建文件样刷,由content關(guān)鍵詞指定內(nèi)容 - owner=:指定所有者
- group=:指定所屬組
- mode=:指定權(quán)限
- 測試7:復(fù)制文件至遠(yuǎn)程主機(jī)指定目錄
ansible all -m copy -a 'src=test.txt dest=/tmp/ owner=nobody group=daemon mode=664'
- 測試8:將內(nèi)容裝入文件復(fù)制至遠(yuǎn)程主機(jī)指定目錄
ansible all -m copy -a "content='hello everyone\n' dest=/tmp/test2.txt owner=nobody group=daemon mode=664"
(七)fetch模塊:Fetches a file from remote nodes
從遠(yuǎn)程節(jié)點(diǎn)獲取文件
(八)file模塊: Sets attributes of files
用法:
創(chuàng)建鏈接文件:path= src= state=link
修改屬性:path= owner= mode= group=
創(chuàng)建目錄:path= state=directory注意:state屬性的可用值
file:僅在修改已經(jīng)存在文件的屬性時使用
directory:目錄
link:軟鏈接
hard:硬鏈接
touch:創(chuàng)建空白文件
absent:刪除-
測試9:在遠(yuǎn)程主機(jī)建立目錄
ansible all -m file -a "path=/tmp/hidir state=directory mode=770"
-
測試10:在遠(yuǎn)程主機(jī)建立空文件
ansible all -m file -a "path=/tmp/hifile state=touch mode=660"
-
測試11:在遠(yuǎn)程主機(jī)建立軟鏈接
ansible all -m file -a "path=/tmp/mytext.txt src=/tmp/test2.txt state=link"
-
測試12:在遠(yuǎn)程主機(jī)刪除軟鏈接
ansible all -m file -a "path=/tmp/mytext.txt state=absent"
(九)get_url模塊: Downloads files from HTTP, HTTPS, or FTP to node
- url=:必須參數(shù)
- dest=:必須參數(shù)
- sha256sum=:校驗(yàn)完整性
- owner, group, mode:所有者,所屬組览爵,權(quán)限
- 測試13:在遠(yuǎn)程主機(jī)上從網(wǎng)絡(luò)鏈接下載文件
ansible all -m get_url -a "url=http://172.16.0.1/centos/7/Packages/ImageMagick-6.7.8.9-15.el7_2.x86_64.rpm dest=/tmp/"
(十)cron 模塊:Manage cron.d and crontab entries.
- minute=:時間
- day=:天
- month=:月
- weekday=:工作日
- hour=:消失
- job=:執(zhí)行的程序
- name=:名稱置鼻,必須參數(shù)
- state=present|absent:創(chuàng)建或刪除
- 測試14:設(shè)置遠(yuǎn)程主機(jī)每5分鐘向主機(jī)172.18.0.1同步時間
ansible all -m cron -a "name='timesync' job='/usr/sbin/ntpdate 172.18.0.1 &> /dev/null' minute='*/5' "
(十一)hostname模塊:Manage hostname
- name=:主機(jī)名
(十二)包管理相關(guān)模塊
(1)yum模塊:Manages packages with the 'yum' package manager
- name=:程序包名稱,可以帶版本號
- state=
present, latest, installed:安裝
absent, removed:卸載 - 測試15:遠(yuǎn)程安裝軟件包
ansible websrvs -m yum -a "name=nginx state=latest"
- 查看遠(yuǎn)程主機(jī)指定軟件包的安裝狀態(tài)
ansible websrvs -m yum -a "list=nginx"
(2)pip模塊:Manages Python library dependencies
- name=
- state=
- version=
(3)npm模塊:Manage node.js packages with npm
- name=
- state=
- version=
(十三)service模塊:管理服務(wù)
- name=:服務(wù)名稱拾枣,必備參數(shù)
- state=started | stopped | restarted:服務(wù)啟動沃疮,關(guān)閉盒让,重啟
- enabled=:是否開機(jī)啟動
- runlevel=:運(yùn)行級別梅肤,適用于init腳本啟動
- 測試16:遠(yuǎn)程啟動指定服務(wù)司蔬,并設(shè)置為開機(jī)啟動服務(wù)
ansible websrvs -m service -a "name=nginx enabled=true state=started"
(十四)其他模塊
(1)git模塊:Deploy software (or files) from git checkouts
- repo=:git源
- dest=:存儲的本地路徑
- version=
(2)deploy_helper模塊:Manages some of the steps common in deploying projects
(3)haproxy模塊:Enable, disable, and set weights for HAProxy backend servers using socket commands.
- backend=:后端主機(jī)
- host=:必備參數(shù),后端主機(jī)名稱
- state=:必備參數(shù)姨蝴,后端主機(jī)狀態(tài)
- weight=:后端主機(jī)權(quán)重
三俊啼、playbook
- playbook:一種簡單的配置管理系統(tǒng)與多機(jī)器部署系統(tǒng)的基礎(chǔ),可以編排有序的執(zhí)行過程左医,甚至于做到在多組機(jī)器間,來回有序的執(zhí)行特別指定的步驟授帕,并且可以同步或異步的發(fā)起任務(wù)
(一)YAML介紹:
- playbook采用YAML格式
- YAML:Yet Another Markup Language,一個可讀性高浮梢,用來表達(dá)數(shù)據(jù)序列的格式
- YAML能表達(dá)的基本數(shù)據(jù)結(jié)構(gòu):標(biāo)量跛十、數(shù)組、關(guān)聯(lián)數(shù)組
(二)playbook的運(yùn)用:
(1)playbook的核心元素:
- hosts:主機(jī)
- tasks:任務(wù)列表
- variables:變量
- templates:包含了模板語法的文本文件
- handlers:由特定條件觸發(fā)的任務(wù)
(2)playbook的基礎(chǔ)組件:
hosts:運(yùn)行指定任務(wù)的目標(biāo)主機(jī)
remoute_user:在遠(yuǎn)程主機(jī)上執(zhí)行任務(wù)的用戶秕硝,權(quán)限提升時可能要用到sudo_user
-
tasks:任務(wù)列表
- 格式:
(1) action: module arguments
(2) module: arguments
注意:shell和command模塊后面直接跟命令芥映,而非key=value類的參數(shù)列表; - 某任務(wù)的狀態(tài)在運(yùn)行后為changed時远豺,可通過notify通知給相應(yīng)的handlers奈偏;
- 任務(wù)可以通過tags打標(biāo)簽,而后可在ansible-playbook命令上使用-t指定進(jìn)行調(diào)用躯护;
- 格式:
handlers:處理器惊来,在特定條件下觸發(fā)任務(wù)
接收到其它任務(wù)的通知時被觸發(fā)
notify: HANDLER TASK NAME
(三)變量:variables
(1)直接調(diào)用
- 注意:可使用setup模塊直接獲取目標(biāo)主機(jī)的facters
(2)用戶自定義變量:
方法一:ansible-playbook命令行中指定
-e VARS, --extra-vars=VARS方法二:在playbook中定義變量
- var1: value1
變量引用:{{ variable }},注意變量名前后均有空格方法三:通過roles傳遞變量
-
方法四:Host Inventory棺滞,主機(jī)清單
-
用戶自定義變量
- 向不同的主機(jī)傳遞不同的變量
IP/HOSTNAME varaiable=value var2=value2 - 向組中的主機(jī)傳遞相同的變量
[groupname:vars]
variable=value - 注意:優(yōu)先級低于playbook中的定義
- 向不同的主機(jī)傳遞不同的變量
invertory參數(shù)
用于定義ansible遠(yuǎn)程連接目標(biāo)主機(jī)時使用的參數(shù)裁蚁,而非傳遞給playbook的變量
IP/HOSTNAME [ ansible_ssh_host | ansible_ssh_port | ansible_ssh_user | ansible_ssh_pass | ansbile_sudo_pass],危險不建議使用
-
(3)測試playbook:
- ansible-playbook --check|-C
只檢測可能會發(fā)生的改變继准,但不真正執(zhí)行操作 - ansible-playbook --list-hosts
列出運(yùn)行任務(wù)的主機(jī) - ansible-playbook --list-tasks
列出要運(yùn)行的任務(wù)列表 - ansible-playbook --syntax-check
語法檢查
(四)實(shí)驗(yàn)1:playbook實(shí)現(xiàn)基本的遠(yuǎn)程配置
實(shí)驗(yàn)環(huán)境:
web服務(wù)器:192.168.136.230, 192.168.136.130
數(shù)據(jù)庫服務(wù)器:192.168.136.131實(shí)現(xiàn)目標(biāo):
web服務(wù)器:自動安裝并啟動nginx服務(wù)
數(shù)據(jù)庫服務(wù)器:自動安裝redis厘擂,統(tǒng)一配置文件內(nèi)容,最后啟動redis服務(wù)
(1)實(shí)現(xiàn)過程:
準(zhǔn)備步驟:在ansible主機(jī)上使用
ssh-keygen -t rsa
生成公鑰和私鑰锰瘸,使用ssh-copy-id ip_address
將公鑰復(fù)制到需要管理的每臺主機(jī)上步驟1:配置/etc/ansible/hosts文件刽严,將服務(wù)器歸類稱為不同的組,方便管理
[websrvs] // web服務(wù)器組避凝,命名為websrvs
192.168.136.230
192.168.136.130
[dbsrvs] // web服務(wù)器組舞萄,命名為dbsrvs
192.168.136.131
- 步驟2:配置playbook文件
- hosts: websrvs
remote_user: root
tasks:
- name: install nginx package // 安裝nginx服務(wù)
yum: name=nginx state=latest
- name: start nginx service // 啟動nginx服務(wù)
service: name=nginx enabled=true state=started
- hosts: dbsrvs
remote_user: root
tasks:
- name: install redis package // 安裝redis服務(wù)
yum: name=redis state=latest
- name: install conf file // 復(fù)制redis配置文件至遠(yuǎn)程主機(jī)
copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
// 提前準(zhǔn)備好redis配置文件
- name: start redis service // 啟動redis服務(wù)
service: name=redis state=started
- 步驟3:測試并運(yùn)行
ansible-playbook --list-hosts nginx.yaml // 列出playbook中的主機(jī)
ansible-playbook --list-tasks nginx.yaml // 列出playbook中的任務(wù)
ansible-playbook --syntax-check nginx.yaml // 檢查YAML文件的語法
ansible-playbook -C nginx.yaml // 預(yù)測執(zhí)行playbook可能發(fā)生的變化,但實(shí)際不執(zhí)行
ansible-playbook nginx.yaml // 執(zhí)行playbook
ansible websrvs -m setup // 查看執(zhí)行playbook時收集的信息
列出playbook中的主機(jī)
列出playbook中的任務(wù)
預(yù)測執(zhí)行playbook可能發(fā)生的變化
(2)缺陷分析:
- 問題1:當(dāng)配置文件修改后管削,執(zhí)行playbook會重復(fù)執(zhí)行所有任務(wù)倒脓,而大部分任務(wù)沒有修改
- 問題2:雖然配置得到了更新侄刽,但是服務(wù)已經(jīng)開啟逝薪,故服務(wù)不會重啟載入配置
- 解決:問題1可以通過定義標(biāo)簽盹靴,指定只執(zhí)行標(biāo)簽處的任務(wù);問題2可以通過定義重新啟動服務(wù)的任務(wù)陷谱,并聲明只在配置更改時執(zhí)行:
- 實(shí)現(xiàn)步驟1:修改playbook文件
vim nginx.yaml
- hosts: websrvs
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=latest
- name: start nginx service
service: name=nginx enabled=true state=started
- hosts: dbsrvs
remote_user: root
tasks:
- name: install redis package
yum: name=redis state=latest
- name: install conf file
copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
tags: instconf // 對install conf file任務(wù)打標(biāo)簽
notify: restart redis service // 當(dāng)配置文件變更時,才執(zhí)行名為restart redis service的handler
- name: start redis service
service: name=redis state=started
handlers: // 定義handler易核,由notify語句在某些情況下被觸發(fā)
- name: restart redis service
service: name=redis state=restarted
- 實(shí)現(xiàn)步驟2:修改/root/redis.conf文件狼电,執(zhí)行playbook并指定只執(zhí)行標(biāo)簽instconf處的任務(wù)
ansible-playbook -t instconf nginx.yaml
可以看到執(zhí)行結(jié)果中只執(zhí)行了tag處的任務(wù),并且觸發(fā)執(zhí)行名為restart redis service 的handler
- 實(shí)現(xiàn)步驟3:再次執(zhí)行上一條命令
可以看到只執(zhí)行了標(biāo)簽instconf的任務(wù)盆均,但由于配置沒有改變塞弊,故沒有觸發(fā)執(zhí)行名為restart redis service 的handler
(五)實(shí)驗(yàn)2:playbook中定義變量
- 編輯instalpkg.yml文件,實(shí)現(xiàn):當(dāng)不指定變量pkgname時泪姨,自動安裝tree游沿;當(dāng)指定pkgname的值時,安裝指定的軟件包
- hosts: websrvs
remote_user: root
vars:
- pkgname: tree
tasks:
- name: install package
yum: name={{ pkgname }} state=latest
- 可以看到被管理的主機(jī)成功安裝肮砾;變量的引用也可以應(yīng)用到name中诀黍,這樣可以看到當(dāng)前被安裝的軟件名稱,對instalpkg.yml文件做修改后如下:
- hosts: websrvs
remote_user: root
vars:
- pkgname: tree
tasks:
- name: install package {{ pkgname }} // 做修改處
yum: name={{ pkgname }} state=latest
- 此時可以看到默認(rèn)安裝tree
- 指定變量pkgname的值
ansible-playbook -e "pkgname=memcached" -C instalpkg.yml
此時可以看到安裝軟件為memcached
四仗处、templates眯勾,模板
(一)template介紹:
定義:基于模板方式生成一個文件復(fù)制到遠(yuǎn)程主機(jī)
實(shí)質(zhì):文本文件,嵌套有腳本(使用模板編程語言編寫)疆柔,類比php嵌入html文件的關(guān)系
(二)template配置:
template模塊的使用:類似copy
src, dest, owner, group, mode-
腳本語言:Jinja2咒精,語法如下
- 字符串:使用單引號或雙引號;
- 數(shù)字:整數(shù)旷档,浮點(diǎn)數(shù)模叙;
- 列表:[item1, item2, ...]
- 元組:(item1, item2, ...)
- 字典:{key1:value1, key2:value2, ...}
- 布爾型:true/false
- 算術(shù)運(yùn)算:+, -, *, /, //, %, **
- 比較操作:==, !=, >, >=, <, <=
- 邏輯運(yùn)算:and, or, not
(三)實(shí)驗(yàn)3:實(shí)現(xiàn)自動安裝redis,之后修改配置文件/etc/redis.conf的maxmemory值為主機(jī)總內(nèi)存大小的一半鞋屈,并且自動重啟服務(wù)使配置生效
- 步驟1:編輯/root/redis_install_and_conf.yml文件范咨,實(shí)現(xiàn)實(shí)驗(yàn)要求
vim /root/redis_install_and_conf.yml
- hosts: dbsrvs
remote_user: root
tasks:
// 安裝
- name: install redis
yum: name=redis state=latest
// 復(fù)制配置文件模板
- name: install redis conf
template: src=/root/redis.conf.j2 dest=/etc/redis.conf owner=redis group=root mode=644
notify: restart redis service
tags: install_conf
// 啟動服務(wù)
- name: start redis service
service: name=redis state=started
// 條件觸發(fā)任務(wù)
handlers:
- name: restart redis service
service: name=redis state=restarted
- 步驟2:準(zhǔn)備配置文件
cp /etc/redis.conf /root/redis.conf.j2
vim /root/redis.conf.j2
maxmemory {{ ansible_memtotal_mb /2 }}mb // 添加此行,自動根據(jù)安裝主機(jī)的內(nèi)存容量設(shè)置
- 步驟3:測試并執(zhí)行playbook
ansible-playbook -C /root/redis_install_and_conf.yml
ansible-playbook /root/redis_install_and_conf.yml
可以看到install redis conf任務(wù)成功執(zhí)行
查看被安裝的主機(jī)上的/etc/redis.conf文件厂庇,maxmemory值根據(jù)主機(jī)內(nèi)存情況動態(tài)設(shè)置
五渠啊、條件測試和循環(huán)迭代:
(一)條件測試:when
適用于根據(jù)被管理主機(jī)參數(shù)的不同采取不同的操作
when語句:在task中使用,jinja2的語法格式
tasks:
- name: install conf file to centos7
template: src=/etc/nginx.conf.c7.j2 dest=/etc/nginx.conf owner=root group=root
when: ansible_distribution_major_version == "7"
- name: install conf file to centos6
template: src=/etc/nginx.conf.c6.j2 dest=/etc/nginx.conf owner=root group=root
when: ansible_distribution_major_version == "6"
(二)循環(huán):迭代权旷,需要重復(fù)執(zhí)行的任務(wù)
對迭代項(xiàng)的引用替蛉,固定變量名為"item"
而后,要在task中使用with_items給定要迭代的元素列表
列表方法:字符串拄氯,字典
// 字符串列表方法
- name: install some packages
yum: name={{ item }} state=present
with_items:
- nginx
- memcached
- php-fpm
- name: add some groups
group: name={{ item }} state=present
with_items:
- group11
- group12
- group13
// 字典列表方法
- name: add some users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- { name: 'user11', group: 'group11' }
- { name: 'user12', group: 'group12' }
- { name: 'user13', group: 'group13' }
六躲查、roles,角色
(一)角色的目錄結(jié)構(gòu)
角色集合:/etc/ansible/roles/目錄下每個角色一個目錄
-
每個角色以特定的層級目錄結(jié)構(gòu)進(jìn)行組織:
- files/ :存放由copy或script模塊等調(diào)用的文件
- templates/:template模塊查找所需要模板文件的目錄
- tasks/:至少應(yīng)該包含一個名為main.yml的文件译柏;其它的文件需要在此文件中通過include進(jìn)行包含
- handlers/:至少應(yīng)該包含一個名為main.yml的文件镣煮;其它的文件需要在此文件中通過include進(jìn)行包含
- vars/:至少應(yīng)該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進(jìn)行包含
- meta/:至少應(yīng)該包含一個名為main.yml的文件鄙麦,定義當(dāng)前角色的特殊設(shè)定及其依賴關(guān)系典唇;其它的文件需要在此文件中通過include進(jìn)行包含
- default/:設(shè)定默認(rèn)變量時使用此目錄中的main.yml文件
(二)playbook中角色的調(diào)用
- 調(diào)用角色的語法:
- hosts: websrvs
remote_user: root
roles:
- mysql
- nginx
- 調(diào)用角色同時傳遞變量給角色
- hosts:
remote_user: root
roles:
- { role: nginx, username: nginx }
- 基于條件測試實(shí)現(xiàn)角色調(diào)用
- hosts:
remote_user: root
roles:
- { role: nginx, when: "ansible_distribution_major_version == '7' " }
(三)實(shí)驗(yàn)4:
- 步驟1:建立目錄結(jié)構(gòu)
mkdir /etc/ansible/roles/nginx/{tasks,handlers,vars,files,templates} -pv
cd /etc/ansible/roles
- 步驟2:編輯task目錄镊折,定義需要執(zhí)行的任務(wù)
vim nginx/tasks/main.yml
- name: install nginx package // 安裝nginx
yum: name=nginx state=latest
- name: install conf file // 復(fù)制配置模板文件
template: src=web.conf.j2 dest=/etc/nginx/conf.d/web.conf
notify: reload nginx service // 觸發(fā)服務(wù)重載
tags: instconf
- name: create doc root // 建立網(wǎng)頁文件根目錄
file: path={{ ngx_doc_root }} state=directory
tags: instconf
- name: start nginx service // 啟動nginx服務(wù)
service: name=nginx enabled=true state=started
- 步驟3:編輯模板配置文件
vim nginx/templates/web.conf.j2
server {
listen {{ ngx_server_port }};
server_name {{ ngx_server_name }};
location / {
root {{ ngx_doc_root }};
}
}
- 步驟4:編輯變量配置文件
vim nginx/vars/main.yml
ngx_server_port: 80
ngx_server_name: www.hellopeiyang.com
ngx_doc_root: /app/webdata
- 步驟5: 配置handlers配置文件
vim nginx/handlers/main.yml
- name: reload nginx service
service: name=nginx state=reloaded
- 步驟6: 編輯playbook
vim /root/mywebsrvs.yml
- hosts: websrvs
remote_user: root
roles:
- nginx
- 步驟7: 測試并執(zhí)行playbook
ansible-playbook -C /root/mywebsrvs.yml
ansible-playbook /root/mywebsrvs.yml
- 測試過程1:成功執(zhí)行playbook
- 執(zhí)行后可以看到配置文件中的信息按照定義的變量值配置
- 在運(yùn)行playbook時指定變量值,優(yōu)先級高于配置文件介衔,同時指定只執(zhí)行標(biāo)簽instconf處的任務(wù)
ansible-playbook -e "ngx_server_port=1008" -t instconf /root/mywebsrvs.yml
- 執(zhí)行后可以看到配置文件中相應(yīng)的變化
- 也可以在playbook中直接傳遞變量給角色
vim /root/mywebsrvs.yml
- hosts: websrvs
remote_user: root
roles:
- { role: nginx, ngx_server_port: 8090 } // 指定傳入的角色恨胚,變量名:變量值
ansible-playbook -t instconf /root/mywebsrvs.yml
- 同樣,執(zhí)行后變量定義處的配置信息也發(fā)生了相應(yīng)的變化