一、ansible
1.1系吩、ansible
ansible基于Python開(kāi)發(fā),集合了眾多運(yùn)維工具(puppet妒蔚、chef穿挨、func、fabric)的優(yōu)點(diǎn)肴盏,實(shí)現(xiàn)了批量系統(tǒng)配置科盛、批量程序部署、批量運(yùn)行命令等功能菜皂。ansible是基于 paramiko 開(kāi)發(fā)的,并且基于模塊化工作贞绵,本身沒(méi)有批量部署的能力。真正具有批量部署的是ansible所運(yùn)行的模塊恍飘,ansible只是提供一種框架榨崩。ansible不需要在遠(yuǎn)程主機(jī)上安裝client/agents谴垫,因?yàn)樗鼈兪腔趕sh來(lái)和遠(yuǎn)程主機(jī)通訊的。ansible目前已經(jīng)已經(jīng)被紅帽官方收購(gòu)母蛛,是自動(dòng)化運(yùn)維工具中大家認(rèn)可度最高的翩剪,并且上手容易,學(xué)習(xí)簡(jiǎn)單彩郊。是每位運(yùn)維工程師必須掌握的技能之一肢专。
1.2、ansible特點(diǎn)
部署簡(jiǎn)單焦辅,只需在主控端部署Ansible環(huán)境,被控端無(wú)需做任何操作椿胯;
默認(rèn)使用SSH協(xié)議對(duì)設(shè)備進(jìn)行管理筷登;
有大量常規(guī)運(yùn)維操作模塊,可實(shí)現(xiàn)日常絕大部分操作哩盲;
配置簡(jiǎn)單前方、功能強(qiáng)大、擴(kuò)展性強(qiáng)廉油;
支持API及自定義模塊惠险,可通過(guò)Python輕松擴(kuò)展;
通過(guò)Playbooks來(lái)定制強(qiáng)大的配置抒线、狀態(tài)管理班巩;
輕量級(jí),無(wú)需在客戶(hù)端安裝agent嘶炭,更新時(shí)抱慌,只需在操作機(jī)上進(jìn)行一次更新即可;
提供一個(gè)功能強(qiáng)大眨猎、操作性強(qiáng)的Web管理界面和REST API接口——AWX平臺(tái)抑进。
1.3、ansible架構(gòu)圖
Ansible:Ansible核心程序睡陪。
HostInventory:記錄由Ansible管理的主機(jī)信息寺渗,包括端口、密碼兰迫、ip等信殊。
Playbooks:“劇本”YAML格式文件,多個(gè)任務(wù)定義在一個(gè)文件中汁果,定義主機(jī)需要調(diào)用哪些模塊來(lái)完成的功能鸡号。
CoreModules:核心模塊,主要操作是通過(guò)調(diào)用核心模塊來(lái)完成管理任務(wù)须鼎。
CustomModules:自定義模塊鲸伴,完成核心模塊無(wú)法完成的功能府蔗,支持多種語(yǔ)言。
ConnectionPlugins:連接插件汞窗,Ansible和Host通信使用
1.4姓赤、ansible任務(wù)執(zhí)行
# 1、ad-hoc模式(點(diǎn)對(duì)點(diǎn)模式)
使用單個(gè)模塊仲吏,支持批量執(zhí)行單條命令不铆。ad-hoc 命令是一種可以快速輸入的命令,而且不需要保存起來(lái)的命令裹唆。就相當(dāng)于bash中的一句話(huà)shell誓斥。
# playbook模式(劇本模式)
是Ansible主要管理方式,也是Ansible功能強(qiáng)大的關(guān)鍵所在许帐。playbook通過(guò)多個(gè)task集合完成一類(lèi)功能劳坑,如Web服務(wù)的安裝部署、數(shù)據(jù)庫(kù)服務(wù)器的批量備份等成畦【喾遥可以簡(jiǎn)單地把playbook理解為通過(guò)組合多條ad-hoc操作的配置文件。
簡(jiǎn)單理解就是Ansible在運(yùn)行時(shí)循帐, 首先讀取ansible.cfg中的配置框仔, 根據(jù)規(guī)則獲取Inventory中的管理主機(jī)列表, 并行的在這些主機(jī)中執(zhí)行配置的任務(wù)拄养, 最后等待執(zhí)行返回的結(jié)果离斩。
二、ansible搭建
2.1瘪匿、環(huán)境
ip | hostname | 備注 |
---|---|---|
192.168.13.211 | vm-master-01 | ansible控制端 |
192.168.13.12 | vm-master-02 | ansible被控制端 |
192.168.13.225 | vm-master-03 | ansible被控制端 |
2.2捐腿、安裝
# 官方文檔
https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-ansible-on-rhel-centos-or-fedora
yum install epel-release
yum install ansible
# ansible 幫助信息
ansible-doc -a # 顯示所有模塊文檔
ansible-doc -l;--list # 列出可用模塊
ansible-doc -s # 顯示指定模塊的playbook片段
eg:
ansible-doc -l
ansible-doc ping
ansible-doc -s ping
2.3、ansible配置文件
inventory = /etc/ansible/hosts #這個(gè)參數(shù)表示資源清單inventory文件的位置
library = /usr/share/ansible #指向存放Ansible模塊的目錄柿顶,支持多個(gè)目錄方式茄袖,只要用冒號(hào)(:)隔開(kāi)就可以
forks = 5 #并發(fā)連接數(shù),默認(rèn)為5
sudo_user = root #設(shè)置默認(rèn)執(zhí)行命令的用戶(hù)
remote_port = 22 #指定連接被管節(jié)點(diǎn)的管理端口嘁锯,默認(rèn)為22端口宪祥,建議修改,能夠更加安全
host_key_checking = False #設(shè)置是否檢查SSH主機(jī)的密鑰家乘,值為T(mén)rue/False蝗羊。關(guān)閉后第一次連接不會(huì)提示配置實(shí)例
timeout = 60 #設(shè)置SSH連接的超時(shí)時(shí)間,單位為秒
log_path = /var/log/ansible.log #指定一個(gè)存儲(chǔ)ansible日志的文件(默認(rèn)不記錄日志)
2.4仁锯、ansible常用命令
/usr/bin/ansible Ansibe AD-Hoc 臨時(shí)命令執(zhí)行工具耀找,常用于臨時(shí)命令的執(zhí)行
/usr/bin/ansible-doc Ansible 模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優(yōu)秀代碼或Roles模塊 的官網(wǎng)平臺(tái),基于網(wǎng)絡(luò)的
/usr/bin/ansible-playbook Ansible 定制自動(dòng)化的任務(wù)集編排工具
/usr/bin/ansible-pull Ansible遠(yuǎn)程執(zhí)行命令的工具,拉取配置而非推送配置(使用較少野芒,海量機(jī)器時(shí)使用蓄愁,對(duì)運(yùn)維的架構(gòu)能力要求較高)
/usr/bin/ansible-vault Ansible 文件加密工具
/usr/bin/ansible-console Ansible基于Linux Consoble界面可與用戶(hù)交互的命令執(zhí)行工具
2.5、ansible控制端環(huán)境配置
# ansible控制端上進(jìn)行操作
# 1狞悲、生成私鑰
ssh-keygen
# 2撮抓、向主機(jī)分發(fā)私鑰
ssh-copy-id root@vm-master-01
ssh-copy-id root@vm-master-02
ssh-copy-id root@vm-master-03
# 3、配置hosts
[root@vm-master-01 ansible]# cat /etc/ansible/hosts
[test]
vm-master-01 ansible_ssh_host=192.168.13.211 ansible_ssh_port=22
vm-master-02 ansible_ssh_host=192.168.13.12 ansible_ssh_port=22
vm-master-03 ansible_ssh_host=192.168.13.225 ansible_ssh_port=22
三摇锋、ansible基本使用
ansible通過(guò)ssh實(shí)現(xiàn)配置管理丹拯、應(yīng)用部署、任務(wù)執(zhí)行等功能荸恕,建議配置ansible端能基于密鑰認(rèn)證的方式聯(lián)系各個(gè)管理節(jié)點(diǎn):
ansible <host-pattern> [-m module_name] [-a args]
--version 顯示版本
-m module 指定模塊乖酬,默認(rèn)為command
-v 詳細(xì)過(guò)程 -vv -vvv更為詳細(xì)
--list-hosts 顯示主機(jī)列表,可簡(jiǎn)寫(xiě)為--list
-k,--ask-pass tishi 提示輸入ssh鏈接密碼融求,默認(rèn)key驗(yàn)證
-C,--check 檢查咬像,并不執(zhí)行
-T,-timeout=TIMEOUT 執(zhí)行命令的超時(shí)時(shí)間,默認(rèn)10s
-u,--user=REMOTE_USER 遠(yuǎn)程執(zhí)行的用戶(hù)
# ansible的host-pattern匹配主機(jī)的列表
# 1双肤、All: 表示所有Inventory中的所有主機(jī)
ansible all -m ping
#2、*: 通配符
ansible "*" -m ping
ansible 10.10.0.* -m ping
ansible "*srs" -m ping
# 3钮惠、或
ansible "web1:web2" -m ping
ansible "192.168.1.10:192.168.1.11" -m ping
# 4茅糜、邏輯與
ansible "web1:&web2" -m ping # 在web1并且在web2組中的主機(jī)
# 5、邏輯非
ansible 'web1:!web2' -m ping # 在web1組中但不在web2組中
# 6素挽、正則
ansible "~(wa|we).*\.baidu\.com" -m ping
ansible命令執(zhí)行過(guò)程:
3.1蔑赘、command模塊
# 遠(yuǎn)程執(zhí)行命令,command模塊是默認(rèn)情況下的模塊预明,這個(gè)模塊不支持shell變量和管道
ansible vm-master-01 -m command -a "ls /" <可自行>
ansible vm-master-01 -m command -a "ls / | grep data" <有管道缩赛、不可執(zhí)行>
3.2、shell模塊
# 支持shell變量和管道
ansible vm-master-01 -m shell -a "ls /"
ansible vm-master-01 -m shell -a "ls / | grep data"
3.3撰糠、yum模塊
ansible PROD -m yum -a 'name=vsftpd state=present'
常用參數(shù)介紹:
name= #所安裝的包的名稱(chēng)
state= #present--->安裝酥馍, latest--->安裝最新的, absent---> 卸載軟件。
update_cache #強(qiáng)制更新yum的緩存
conf_file #指定遠(yuǎn)程yum安裝時(shí)所依賴(lài)的配置文件(安裝本地已有的包)阅酪。
disable_pgp_check #是否禁止GPG checking旨袒,只用于presentor latest。
disablerepo #臨時(shí)禁止使用yum庫(kù)术辐。 只用于安裝或更新時(shí)砚尽。
enablerepo #臨時(shí)使用的yum庫(kù)。只用于安裝或更新時(shí)辉词。
3.4必孤、service模塊
ansible vm-master-02 -m service -a "name=vsftpd state=started enabled=yes"
常用參數(shù)介紹:
arguments #命令行提供額外的參數(shù)
enabled #設(shè)置開(kāi)機(jī)啟動(dòng)。
name= #服務(wù)名稱(chēng)
runlevel #開(kāi)機(jī)啟動(dòng)的級(jí)別瑞躺,一般不用指定敷搪。
sleep #在重啟服務(wù)的過(guò)程中兴想,是否等待。如在服務(wù)關(guān)閉以后等待2秒再啟動(dòng)购啄。(定義在劇本中襟企。)
state #有四種狀態(tài),分別為:started--->啟動(dòng)服務(wù)狮含, stopped--->停止服務(wù)顽悼, restarted--->重啟服務(wù), reloaded--->重載配置
3.5几迄、file模塊
# file模塊用于查看文件的屬性蔚龙,修改文件屬性,查詢(xún)文件是否被修改等
ansible vm-master-03 -m file -a 'path=/etc/passwd' -------------->查看文件屬性
ansible vm-master-02 -m file -a 'path=/tmp/fzh state=touch mode=755 owner=fzh' --------------->創(chuàng)建文件
ansible vm-master-02 -m file -a 'dest=/tmp/fzh state=absent' ------------------->刪除文件映胁。
ansible vm-master-02 -m file -a 'dest=/tmp/test.sh mode=777' ------------------->修改遠(yuǎn)程服務(wù)器上文件的屬性木羹。
ansible vm-master-02 -m file -a 'dest=/tmp/test mode=755 owner=fzh group=fzh state=directory' ------->在客戶(hù)端相應(yīng)位置下創(chuàng)建目錄:fzh。(make -p)
ansible vm-master-02 -m file -a 'dest=/tmp/fzh state=absent' --------------->刪除遠(yuǎn)程服務(wù)器上的文件解孙,這里是目錄坑填。
3.6、copy模塊
# 從控制節(jié)點(diǎn)上拷貝文件到“受控節(jié)點(diǎn)”上
ansible vm-master-02 -m copy -a 'src=/root/test.sh dest=/tmp/ mode=600 owner=fzh group=fzh'
(把本地/root/test文件cp到PROD主機(jī)下的/tmp目錄下弛姜。)
常用參數(shù)介紹:
src #被復(fù)制到遠(yuǎn)程主機(jī)的本地文件脐瑰。可以是絕對(duì)路徑廷臼,也可以是相對(duì)路徑苍在。如果路徑是一個(gè)目錄,則會(huì)遞歸復(fù)制荠商,用法類(lèi)似于"rsync"
content #用于替換"src"寂恬,可以直接指定文件的值
dest #必選項(xiàng),將源文件復(fù)制到的遠(yuǎn)程主機(jī)的絕對(duì)路徑
backup #當(dāng)文件內(nèi)容發(fā)生改變后莱没,在覆蓋之前把源文件備份初肉,備份文件包含時(shí)間信息
directory_mode #遞歸設(shè)定目錄的權(quán)限,默認(rèn)為系統(tǒng)默認(rèn)權(quán)限
force #當(dāng)目標(biāo)主機(jī)包含該文件饰躲,但內(nèi)容不同時(shí)朴译,設(shè)為"yes",表示強(qiáng)制覆蓋属铁;設(shè)為"no"眠寿,表示目標(biāo)主機(jī)的目標(biāo)位置不存在該文件才復(fù)制。默認(rèn)為"yes"
others #所有的 file 模塊中的選項(xiàng)可以在這里使用
3.7焦蘑、script模塊
# 遠(yuǎn)程節(jié)點(diǎn)執(zhí)行本地腳本盯拱,腳本位于控制節(jié)點(diǎn),相當(dāng)于scp+shell
ansible test -m script -a "/root/hostname.sh"
3.8、synchronize模塊
# 將控制節(jié)點(diǎn)的某個(gè)目錄推送到受控制節(jié)點(diǎn)目錄下
ansible test -m synchronize -a 'src=/root/test dest=/tmp/ compress=yes'
3.9狡逢、fetch模塊
# 將vm-master-02的/root/vm-master-02.txt文件cp到本機(jī)的/root目錄下
[root@vm-master-01 ~]# ansible vm-master-02 -m fetch -a "src=/root/vm-master-02.txt dest=/root/ flat=yes"
ansible還有很多模塊宁舰,在此不一一介紹,具體可以參考中文指南:
http://www.ansible.com.cn/docs/intro_adhoc.html#managing-packages
四奢浑、ansible-playbook
4.1蛮艰、ansible-playbook
playbook 是 ansible 用于配置,部署雀彼,和管理被控節(jié)點(diǎn)的劇本壤蚜。通過(guò) playbook 的詳細(xì)描述,執(zhí)行其中的一系列 tasks 徊哑,可以讓遠(yuǎn)端主機(jī)達(dá)到預(yù)期的狀態(tài)袜刷。執(zhí)行一些簡(jiǎn)單的任務(wù),使用ad-hoc命令可以方便的解決問(wèn)題莺丑,但是有時(shí)一個(gè)設(shè)施過(guò)于復(fù)雜著蟹,需要大量的操作時(shí)候,執(zhí)行的ad-hoc命令是不適合的梢莽,這時(shí)最好使用playbook萧豆。playbook由YMAL語(yǔ)言編寫(xiě)。YAML( /?j?m?l/ )參考了其他多種語(yǔ)言昏名,包括:XML涮雷、C語(yǔ)言、Python葡粒、Perl以及電子郵件格式RFC2822份殿。
4.2膜钓、ansible-playbook yaml文件格式
---
- hosts: vm-03
remote_user: root
tasks:
- name: exec shell
shell: hostname
- name: create dir
file:
path: /root/dir
state: directory
# 解析
host:使用 hosts 指示使用哪個(gè)主機(jī)或主機(jī)組來(lái)運(yùn)行下面的 tasks 嗽交,每個(gè) playbook 都必須指定 hosts,hosts也可以使用通配符格式颂斜。主機(jī)或主機(jī)組在 inventory 清單中指定夫壁,可以使用系統(tǒng)默認(rèn)的/etc/ansible/hosts,也可以自己編輯沃疮,在運(yùn)行的時(shí)候加上-i選項(xiàng)盒让,指定清單的位置即可。
remote_user:指定遠(yuǎn)端主機(jī)中的哪個(gè)用戶(hù)來(lái)登錄遠(yuǎn)端系統(tǒng)司蔬,在遠(yuǎn)端系統(tǒng)執(zhí)行 task 的用戶(hù)邑茄,可以任意指定,也可以使用 sudo俊啼,但是用戶(hù)必須要有執(zhí)行相應(yīng) task 的權(quán)限肺缕。
tasks:指定遠(yuǎn)端主機(jī)將要執(zhí)行的一系列動(dòng)作,相當(dāng)于任務(wù)列表。tasks 的核心為 ansible 的模塊同木,前面已經(jīng)提到模塊的用法浮梢。tasks 包含 name 和要執(zhí)行的模塊,name 是可選的彤路,只是為了便于用戶(hù)閱讀,不過(guò)還是建議加上去洲尊,模塊是必須的远豺,同時(shí)也要給予模塊相應(yīng)的參數(shù)。
name:每個(gè)task都有對(duì)應(yīng)的name颊郎,當(dāng)我們省略name時(shí)憋飞,默認(rèn)以當(dāng)前任務(wù)調(diào)用的模塊的名稱(chēng)作為任務(wù)的名稱(chēng),不過(guò)建議不要省略name姆吭,因?yàn)楫?dāng)任務(wù)存在name時(shí)榛做,可讀性比較高。
# 執(zhí)行上述任務(wù)
# 1内狸、–list-hosts: 顯示執(zhí)行任務(wù)的主機(jī)列表检眯,實(shí)際并不執(zhí)行
ansible-playbook -i /etc/ansible/hosts --list-hosts /etc/ansible/test.yaml
# 2、--syntax-check: 語(yǔ)法檢測(cè)昆淡,實(shí)際并不執(zhí)行锰瘸。執(zhí)行結(jié)果顯示playbook名稱(chēng)即表示沒(méi)有語(yǔ)法錯(cuò)誤。
ansible-playbook -i /etc/ansible/hosts /etc/ansible/test.yaml --syntax-check
# 3昂灵、--check: 任務(wù)預(yù)演避凝,實(shí)際并不執(zhí)行
ansible-playbook -i /etc/ansible/hosts /etc/ansible/test.yaml --check
# 執(zhí)行結(jié)果:
綠色代表執(zhí)行成功,系統(tǒng)保持原樣
黃色代表系統(tǒng)代表系統(tǒng)狀態(tài)發(fā)生改變
紅色代表執(zhí)行失敗眨补,顯示錯(cuò)誤輸出
執(zhí)行過(guò)程有三個(gè)步驟:
1管削、收集facts (收集對(duì)應(yīng)目標(biāo)主機(jī)的信息)
2、執(zhí)行tasks
3撑螺、報(bào)告結(jié)果
執(zhí)行結(jié)果如下圖:
4.3含思、handlers
4.3.1、handlers初識(shí)
handlers是和tasks平級(jí)的另一種任務(wù)甘晤。但handlers中的任務(wù)會(huì)被tasks中的任務(wù)調(diào)用含潘。只有當(dāng)tasks中的任務(wù)真正執(zhí)行(黃色,有改變)线婚,handlers中被調(diào)用的任務(wù)才會(huì)被執(zhí)行遏弱。當(dāng)服務(wù)的配置文件發(fā)生改變,需要重啟的時(shí)候塞弊,handlers就能解決此類(lèi)問(wèn)題漱逸。格式見(jiàn)下:
[root@vm-master-01 ansible]# cat handlers.yaml
---
- hosts: vm-03
remote_user: root
tasks:
- name: create dir1
file: path=/root/dir1
state=directory
notify: handler1
- name: create dir2
file: path=/root/dir2
state=directory
notify: handler2
handlers:
- name: handler1
file: path=/root/dir1/file1
state=touch
- name: handler2
file: path=/root/dir2/file2
state=touch
# 解釋?zhuān)?通過(guò)notify關(guān)鍵字關(guān)聯(lián)tasks和handlers缀踪,handlers被執(zhí)行的順序與在playbook中定義的順序是相同的,與被調(diào)用執(zhí)行的順序無(wú)關(guān)虹脯。當(dāng)所有task執(zhí)行完畢后驴娃,才會(huì)執(zhí)行handlers。如果想改變這種順序需要meta模塊循集。
4.3.2唇敞、handlers meta
[root@vm-master-01 ansible]# cat handlers.yaml
---
- hosts: vm-03
remote_user: root
tasks:
- name: create dir1
file: path=/root/dir1
state=directory
notify: handler1
- name: create dir2
file: path=/root/dir2
state=directory
notify: handler2
- meta: flush_handlers
- name: create dir3
file: path=/root/dir3
state=directory
notify: handler3
handlers:
- name: handler1
file: path=/root/dir1/file1
state=touch
- name: handler2
file: path=/root/dir2/file2
state=touch
- name: handler3
file: path=/root/dir2/file3
state=touch
ansible-playbook -i /etc/ansible/hosts /etc/ansible/handlers.yaml執(zhí)行結(jié)果見(jiàn)下:
#從上面結(jié)果可以看出:
meta是一種特殊的任務(wù),可以影響ansible內(nèi)部的工作順序咒彤,"meta: flush_handlers"表示立即執(zhí)行之前的task所對(duì)應(yīng)的handler疆柔。當(dāng)對(duì)應(yīng)的handler執(zhí)行完畢后,接著執(zhí)行meta下面后續(xù)的task镶柱,這些task執(zhí)行完畢后旷档,在執(zhí)行對(duì)應(yīng)的handlers。
4.3.3歇拆、一個(gè)task對(duì)應(yīng)多個(gè)handlers<listen>
[root@vm-master-01 ansible]# cat handlers2.yaml
---
- hosts: vm-03
remote_user: root
tasks:
- name: create dir1
file: path=/root/dir1
state=directory
notify: handler-group
handlers:
- name: handler1
listen: handler-group
file: path=/root/dir1/file1
state=touch
- name: handler2
listen: handler-group
file: path=/root/dir1/file2
state=touch
- name: handler3
listen: handler-group
file: path=/root/dir1/file3
state=touch
ansible-playbook -i /etc/ansible/hosts /etc/ansible/handlers2.yaml執(zhí)行結(jié)果如下:
可以將"listen"和“notify”后面的handler-group看成組鞋屈,命中組的handler就可以被調(diào)用執(zhí)行。
注意:如果不采用上面listen的方式故觅,當(dāng)定義多個(gè)具有相同name的handlers時(shí)厂庇,只會(huì)有一個(gè)handler會(huì)被執(zhí)行。
4.4输吏、tags
tags: 為任務(wù)列表中的指定任務(wù)打上標(biāo)簽权旷,然后可以選擇性的執(zhí)行某一部分或者某一類(lèi)的任務(wù)。
4.4.1贯溅、tags定義
[root@vm-master-01 ansible]# cat cat tags.yaml
cat: cat: No such file or directory
---
- hosts: vm-03
remote_user: root
tasks:
- name: create dir1
file: path=/root/dir1
state=directory
notify: handler1
tags: t1
- name: create dir2
file: path=/root/dir2
state=directory
notify: handler2
tags: t2
- name: create dir3
file: path=/root/dir3
state=directory
notify: handler3
tags: t3
handlers:
- name: handler1
file: path=/root/dir1/file1
state=touch
- name: handler2
file: path=/root/dir2/file2
state=touch
- name: handler3
file: path=/root/dir3/file3
state=touch
ansible-playbook -i /etc/ansible/hosts --tags=t3 /etc/ansible/tags.yaml執(zhí)行結(jié)果如下:
從結(jié)果可以看出:只有tags: t3的task和其handler被執(zhí)行了拄氯,也可以一次性指定多個(gè)標(biāo)簽
# t2、t3執(zhí)行
ansible-playbook -i /etc/ansible/hosts --tags t2,t3 /etc/ansible/tags.yaml
# --skip-tags指定不執(zhí)行的task<下面:t2不執(zhí)行它浅,t1译柏、t3執(zhí)行>
ansible-playbook -i /etc/ansible/hosts --skip-tags="t2" /etc/ansible/tags.yaml
# 定義標(biāo)簽的方式:
[root@vm-master-01 ansible]# cat tags2.yaml
---
- hosts: vm-03
remote_user: root
tasks:
- name: create dir1
file: path=/root/dir1
state=directory
notify: handler1
tags:
- t1
- name: create dir2
file: path=/root/dir2
state=directory
notify: handler2
tags: ['t2']
- name: create dir3
file: path=/root/dir3
state=directory
notify: handler3
tags:
- t3
- t4
- name: create dir4
file: path=/root/dir4
state=directory
tags: t5,t6
- name: create dir4
file: path=/root/dir4
state=directory
tags: ['t7', 't8']
handlers:
- name: handler1
file: path=/root/dir1/file1
state=touch
- name: handler2
file: path=/root/dir2/file2
state=touch
- name: handler3
file: path=/root/dir3/file3
state=touch
4.4.2、tags查看
ansible-playbook -i /etc/ansible/hosts --list-tags /etc/ansible/tags.yaml
4.4.3罚缕、相同標(biāo)簽
[root@vm-master-01 ansible]# cat tags3.yaml
---
- hosts: vm-03
remote_user: root
tasks:
- name: create dir1
file: path=/root/dir1
state=directory
tags:
- t1
- dir
- name: create dir2
file: path=/root/dir2
state=directory
tags: ['t2', 'dir']
上面兩個(gè)task都有標(biāo)簽:dir艇纺,我們可以以另一種方式表示:
[root@vm-master-01 ansible]# cat tags4.yaml
---
- hosts: vm-03
remote_user: root
tags: dir
tasks:
- name: create dir1
file: path=/root/dir1
state=directory
tags:
- t1
- name: create dir2
file: path=/root/dir2
state=directory
tags: ['t2']
當(dāng)我們執(zhí)行:ansible-playbook -i /etc/ansible/hosts --tags=dir /etc/ansible/tags4.yaml怎静,兩個(gè)tasks都會(huì)被執(zhí)行邮弹,結(jié)果見(jiàn)下:
4.4.4、內(nèi)置tags
4.4.4.1蚓聘、always
當(dāng)tags=always時(shí)腌乡,我們用ansible-playbook執(zhí)行任務(wù),即便我們沒(méi)有指定--tags=always夜牡,這個(gè)任務(wù)也會(huì)被執(zhí)行与纽,除非使用了'--skip-tags'侣签。
4.4.4.2、never
和always相反急迂,我們執(zhí)行所有任務(wù)的時(shí)候影所,加了never標(biāo)簽的任務(wù)不執(zhí)行。
4.4.4.3僚碎、tagged
# 下面命令表示只執(zhí)行有標(biāo)簽的任務(wù)猴娩,沒(méi)有任何標(biāo)簽的任務(wù)不會(huì)被執(zhí)行。這里加了never標(biāo)簽的不會(huì)執(zhí)行
ansible-playbook --tags tagged tags.yaml
# 下面命令表示跳過(guò)包含標(biāo)簽的任務(wù)勺阐,即使對(duì)應(yīng)的任務(wù)包含always標(biāo)簽卷中,也會(huì)被跳過(guò)
ansible-playbook --skip-tags tagged tags.yaml
4.4.4.4、untagged
# 下面命令表示只執(zhí)行沒(méi)有標(biāo)簽的任務(wù)渊抽,但是如果某些任務(wù)包含always標(biāo)簽蟆豫,那么這些任務(wù)也會(huì)被執(zhí)行
ansible-playbook --tags untagged tags.yaml
# 下面命令表示跳過(guò)沒(méi)有標(biāo)簽的任務(wù)。意思是只執(zhí)行有標(biāo)簽的任務(wù)懒闷。但是加了never標(biāo)簽的任務(wù)不會(huì)被執(zhí)行
ansible-playbook --skip-tags untagged tags.yaml
4.4.4.5十减、all
特殊標(biāo)簽all表示所有任務(wù)會(huì)被執(zhí)行,不用指定愤估,默認(rèn)情況下就是使用這個(gè)標(biāo)簽嫉称。
4.5、ignore_errors
# 假如ansible-playbook中的某個(gè)task出錯(cuò)灵疮,則按照順序執(zhí)行的后續(xù)任務(wù)都不會(huì)再執(zhí)行织阅,假如是handler報(bào)錯(cuò),則不會(huì)影響剩下的流程震捣,如果需要忽略此錯(cuò)誤荔棉,可以用ignore_errors
[root@vm-master-01 ansible]# cat ignore_errors.yaml
---
- hosts: vm-03
remote_user: root
tasks:
- name: create dir1
file: path=/root/dir1
state=directory
notify: handler1
- name: create dir2
command: hostnameeeeee
notify: handler2
ignore_errors: True
- name: create dir3
file: path=/root/dir3
state=directory
notify: handler3
handlers:
- name: handler1
file: path=/root/dir1/file1
state=touch
- name: handler2
file: path=/root/dir2/file2
state=touch
- name: handler3
file: path=/root/dir3/file3
state=touch
執(zhí)行命令: ansible-playbook -i /etc/ansible/hosts /etc/ansible/ignore_errors.yaml 結(jié)果如下:
在第二個(gè)任務(wù),人為制造一個(gè)報(bào)錯(cuò)蒿赢,由于目錄/root/dir2/不存在润樱,所以handler2也會(huì)出錯(cuò),但只在第二個(gè)任務(wù)處添加"ignore_errors: True"后羡棵,后續(xù)的步驟都沒(méi)背中斷壹若,即便handler2有報(bào)錯(cuò),也沒(méi)有影響后續(xù)的步驟皂冰。
4.6店展、limit
# 當(dāng)有多臺(tái)主機(jī)被命中時(shí),限制其中的某一臺(tái)執(zhí)行playbook秃流,但必須在命中的主機(jī)列表中:
[root@vm-master-01 ansible]# cat limit.yaml
---
- hosts: test
remote_user: root
tasks:
- name: limit test
command: hostname
執(zhí)行命令:ansible-playbook -i /etc/ansible/hosts /etc/ansible/limit.yaml --limit vm-master-02的結(jié)果如下:
雖然test命中了三臺(tái)主機(jī)赂蕴,但使用limit可以限制playbook在指定的主機(jī)上執(zhí)行。
4.7舶胀、playbook變量
# 1概说、變量名:
僅能由字母碧注、數(shù)字、下劃線(xiàn)組成糖赔,且只能以字母開(kāi)頭
# 2萍丐、變量來(lái)源:
1.1、 ansible setup facts 遠(yuǎn)程主機(jī)的所有變量都可直接調(diào)用
1.2放典、/etc/ansible/hosts定義
1.2.1莫湘、普通變量:主機(jī)組中主機(jī)單行定義揍诽,優(yōu)先級(jí)高于公共變量
1.2.2滨溉、公共(組)變量:針對(duì)主機(jī)組中所有主機(jī)定義的統(tǒng)一變量
1.3重贺、命令行指定的變量,優(yōu)先級(jí)最高
1.4声怔、playbook中定義
1.5态贤、role中定義
4.7.1、命令行變量
# 1醋火、var_command_line.yaml文件內(nèi)容
[root@vm-master-01 ansible]# cat var_command_line.yaml
---
- hosts: test
remote_user: root
tasks:
- name: exec shell echo {{ var }}
shell: echo {{ prefix }}_{{ var }}_{{ suffix }} > /tmp/var.txt
執(zhí)行命令:ansible-playbook -i /etc/ansible/hosts -e "prefix=pre1" -e "var=command-line-var" -e "suffix=suf1" /etc/ansible/var_command_line.yaml結(jié)果如下:
4.7.2悠汽、playbook變量
# 1、var_playbook.yaml文件內(nèi)容
[root@vm-master-01 ansible]# cat var_playbook.yaml
---
- hosts: test
remote_user: root
vars:
- prefix: pre2
- var: playbook-var
- suffix: suf2
tasks:
- name: exec shell echo {{ var }}
shell: echo {{ prefix }}_{{ var }}_{{ suffix }} > /tmp/var.txt
執(zhí)行命令:ansible-playbook -i /etc/ansible/hosts /etc/ansible/var_playbook.yaml結(jié)果如下:
4.7.3芥驳、普通變量
# 1柿冲、/etc/ansible/hosts文件內(nèi)容
[root@vm-master-01 ansible]# head -n 4 /etc/ansible/hosts
[test]
vm-master-01 ansible_ssh_host=192.168.13.211 ansible_ssh_port=22 prefix=vm01_pre3 var=common-var suffix=vm01_suf3
vm-master-03 ansible_ssh_host=192.168.13.225 ansible_ssh_port=22 prefix=vm03_pre3 var=common-var suffix=vm03_suf3
# 2、var_common.yaml文件內(nèi)容
[root@vm-master-01 ansible]# cat var_common.yaml
---
- hosts: test
remote_user: root
tasks:
- name: exec shell echo {{ var }}
shell: echo {{ prefix }}_{{ var }}_{{ suffix }} > /tmp/var.txt
執(zhí)行命令:ansible-playbook -i /etc/ansible/hosts /etc/ansible/var_common.yaml結(jié)果如下:
4.7.4兆旬、公共(組)變量
# 1假抄、hosts文件內(nèi)容
[root@vm-master-01 ansible]# head -n 7 hosts
[test]
vm-master-01 ansible_ssh_host=192.168.13.211 ansible_ssh_port=22
vm-master-03 ansible_ssh_host=192.168.13.225 ansible_ssh_port=22
[test:vars]
prefix=test_pre4
var=group-var
suffix=test_suf4
# 2、var_group.yaml文件內(nèi)容
[root@vm-master-01 ansible]# cat var_group.yaml
---
- hosts: test
remote_user: root
tasks:
- name: exec shell echo {{ var }}
shell: echo {{ prefix }}_{{ var }}_{{ suffix }} > /tmp/var.txt
執(zhí)行命令:ansible-playbook -i /etc/ansible/hosts /etc/ansible/var_group.yaml結(jié)果若下:
4.7.5丽猬、變量?jī)?yōu)先級(jí)比較
# 1宿饱、hosts文件內(nèi)容
[root@vm-master-01 ansible]# head -n 8 /etc/ansible/hosts
[test]
vm-master-01 ansible_ssh_host=192.168.13.211 ansible_ssh_port=22 prefix=vm01_pre3 var=common-var suffix=vm01_suf3
vm-master-03 ansible_ssh_host=192.168.13.225 ansible_ssh_port=22 prefix=vm03_pre3 var=common-var suffix=vm03_suf3
[test:vars]
prefix=test_pre4
var=group-var
suffix=test_suf4
# 2、var_priority.yaml文件內(nèi)容
[root@vm-master-01 ansible]# cat /etc/ansible/var_priority.yaml
---
- hosts: test
remote_user: root
vars:
- prefix: pre2
- var: playbook-var
- suffix: suf2
tasks:
- name: exec shell echo {{ var }}
shell: echo {{ prefix }}_{{ var }}_{{ suffix }} > /tmp/var.txt
命令行傳入變量執(zhí)行命令:ansible-playbook -i /etc/ansible/hosts -e "prefix=pre1" -e "var=command-line-var" -e "suffix=suf1" /etc/ansible/var_priority.yaml結(jié)果如下:
命令行不傳入變量執(zhí)行命令:ansible-playbook -i /etc/ansible/hosts /etc/ansible/var_priority.yaml 結(jié)果如下:
# 只修改/etc/ansible/var_priority.yaml將playbook變量刪掉:
[root@vm-master-01 ansible]# cat /etc/ansible/var_priority.yaml
---
- hosts: test
remote_user: root
tasks:
- name: exec shell echo {{ var }}
shell: echo {{ prefix }}_{{ var }}_{{ suffix }} > /tmp/var.txt
命令行不傳入變量數(shù)執(zhí)行命令:ansible-playbook -i /etc/ansible/hosts /etc/ansible/var_priority.yaml 結(jié)果如下:
補(bǔ)充:對(duì)于"ansible setup facts"中的變量脚祟,我們可以借助于:ansible vm-01 -m setup命令查看谬以,我做了實(shí)驗(yàn),但沒(méi)有截圖在這里由桌,他的優(yōu)先級(jí)要高于普通變量低于playbook變量
由以上例子可證明優(yōu)先級(jí)排序?yàn)椋好钚凶兞?gt;playbook變量>ansible setup facts中的變量>普通變量>公共(組)變量为黎,在執(zhí)行playbook時(shí)會(huì)使用優(yōu)先級(jí)高的變量。
4.7.6行您、將變量寫(xiě)入單獨(dú)的yaml文件中
[root@vm-master-01 ansible]# cat vars.yaml
prefix: file_pre5
var: var-file
suffix: file_suf5
[root@vm-master-01 ansible]# cat var_file.yaml
---
- hosts: test
remote_user: root
vars_files:
- vars.yaml
tasks:
- name: exec shell echo {{ var }}
shell: echo {{ prefix }}_{{ var }}_{{ suffix }} > /tmp/var.txt
# 此時(shí)的變量相當(dāng)于playbook的變量铭乾,優(yōu)先級(jí)也一樣,變量文件和var_file.yaml放在同級(jí)目錄邑雅。
4.8片橡、templates
4.8.1妈经、templates語(yǔ)法
文本文件淮野,嵌套有腳本(使用模版編程語(yǔ)言編寫(xiě))
jinja2語(yǔ)言捧书,使用字面量,有下面形式:
字符串:使用單引號(hào)或雙引號(hào)
數(shù)字:整數(shù)骤星,浮點(diǎn)數(shù)
列表:[item1,item2,...]
元組:{item1,item2,...}
字典:{key1:value1,key2:value2,...}
布爾型:true经瓷、false
算術(shù)運(yùn)算:+,-,*,/,//,%,**
比較操作:==,!=,>,>=,<,<=
邏輯運(yùn)算:and,or,not
流表達(dá)式:for if when
template文件必須以.j2結(jié)尾
4.8.2、一個(gè)例子
需要在vm-03上安裝nginx洞难,并將其開(kāi)啟的worker進(jìn)程數(shù)量在auto(cpu的核心數(shù))的基礎(chǔ)上+2
# 1舆吮、ansible setup模塊確定auto的變量名稱(chēng)
[root@vm-master-01 ansible]# ansible vm-03 -m setup | grep ansible_processor_vcpus
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
"ansible_processor_vcpus": 8, # vm-03有8個(gè)core
# 2、nginx.conf.j2配置<次文件放在templates目錄下队贱,templates目錄和nginx.yaml文件平級(jí)色冀,執(zhí)行playbook時(shí)會(huì)自動(dòng)尋找到對(duì)應(yīng)名稱(chēng)的模版文件>
[root@vm-master-01 ansible]# head -n 6 templates/nginx.conf.j2
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes {{ ansible_processor_vcpus + 2 }}; # ansible_processor_vcpus由"1"獲取
# 3、nginx.yaml
[root@vm-master-01 ansible]# cat nginx.yaml
---
- hosts: vm-03
remote_user: root
tasks:
- name: install nginx
yum: name=nginx
- name: copy templates nginx.conf.j2
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
- name: start nginx
service: name=nginx state=started enabled=true
執(zhí)行命令:ansible-playbook -i /etc/ansible/hosts /etc/ansible/nginx.yaml結(jié)果如下:
執(zhí)行命令:ansible vm-03 -m shell -a "grep worker_processes /etc/nginx/nginx.conf"查看vm-03上nginx的配置文件:
4.9柱嫌、when
1锋恬、條件測(cè)試:如果需要根據(jù)變量、facts或者此前任務(wù)的執(zhí)行結(jié)果來(lái)做為某個(gè)task執(zhí)行與否的前提時(shí)要用到條件測(cè)試编丘,通過(guò)when語(yǔ)句實(shí)現(xiàn)与学,在task中使用jinja2的語(yǔ)法格式
2、使用:在task后添加when子句即可使用條件測(cè)試嘉抓;when語(yǔ)句支持jinja2表達(dá)式語(yǔ)法
3索守、例子:
name: "if RedHat exec command"
command: hostname
when: ansible_os_family == "RedHat"
# 1、需求:我們修改上面nginx配置文件的需求抑片,假如vm-03中"ansible_os_family!=RedHat"卵佛,我們就不傳遞vm-01上修改過(guò)的nginx.conf文件,而使用vm-03上原有的配置文件
# 2敞斋、說(shuō)明:vm-03上ansible_os_family為"RedHat"级遭,可以通過(guò)setup模塊獲取,作為演示:我已經(jīng)卸載了vm-03上面已經(jīng)安裝過(guò)的nginx
# 2渺尘、nginx.yaml
[root@vm-master-01 ansible]# cat nginx.yaml
---
- hosts: vm-03
remote_user: root
tasks:
- name: install nginx
yum: name=nginx
- name: copy templates nginx.conf.j2
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
when: ansible_os_family != "RedHat"
- name: start nginx
service: name=nginx state=started enabled=true
執(zhí)行相關(guān)命令結(jié)果如下:
從上面例子可以看出:由于when條件不成立挫鸽,并沒(méi)有執(zhí)行template操作。
4.10鸥跟、with_items
with_items表迭代:當(dāng)有重復(fù)執(zhí)行的任務(wù)時(shí)丢郊,可以使用迭代機(jī)制
使用固定變量"item"作為迭代項(xiàng)的引用
使用with_items給定迭代的元素列表:
字符串
字典等
# 下面yaml文件將在vm-03主機(jī)的/tmp目錄下創(chuàng)建三個(gè)文件:f1、f2医咨、f3
[root@vm-master-01 ansible]# cat with_items.yaml
---
- hosts: vm-03
remote_user: root
tasks:
- name: create files
file: name=/tmp/{{ item }} state=touch
when: ansible_os_family == "RedHat"
with_items:
- f1
- f2
- f3
執(zhí)行命令:ansible-playbook -i /etc/ansible/hosts /etc/ansible/with_items.yaml得到的結(jié)果如下:
4.11枫匾、for流程控制
# 1、for.yaml文件內(nèi)容
[root@vm-master-01 ansible]# cat for.yaml
---
- hosts: vm-03
remote_user: root
vars:
people:
- name: zhangsan
age: 23
high: 1.68
- name: lisi
high: 1.70
- name: wangwu
age: 25
high: 1.71
tasks:
- name: copy file
template: src=for1.txt.j2 dest=/tmp/for1.txt
# 2拟淮、for1.txt.j2文件內(nèi)容:
[root@vm-master-01 ansible]# cat templates/for1.txt.j2
{% for p in people %}
info of people {
name: {{ p.name }}
{% if p.age is defined %}
age: {{ p.age }}
{% endif %}
hige: {{ p.high }}
}
{% endfor %}
執(zhí)行yaml文件并查看vm-03下的文件/tmp/for1.txt的內(nèi)容:
4.12干茉、register
假如有這樣一個(gè)需求,使用shell命令檢查nginx進(jìn)程是否存在很泊,當(dāng)不存在時(shí)就重啟角虫。我們可以通過(guò)register將使用ps命令抓取的進(jìn)程數(shù)賦值給info沾谓,然后通過(guò)info的相應(yīng)字段(從下面截圖中應(yīng)該可以看出相應(yīng)的字段為info.stdout)來(lái)判斷進(jìn)程數(shù)是否為0,為0則重啟戳鹅。
[root@vm-master-01 ansible]# cat sum_process_nginx.yml
---
- hosts: vm-master-03
gather_facts: no
tasks:
- name: get nginx process
shell: ps -ef | grep nginx | grep -v grep | wc -l
register: info
- name: display vars
debug:
var: info
- name: if sum(nginx process) < 1 then start it
service: name=nginx
state=started
when: info.stdout == "0"
- name: check if nginx started success or not
shell: systemctl status nginx
執(zhí)行命令:ansible-playbook sum_process_nginx.yml結(jié)果如下:
五均驶、ansible-playbook生產(chǎn)實(shí)踐
5.1、說(shuō)明
基于上面介紹枫虏,對(duì)于nginx的安裝妇穴,做一個(gè)生產(chǎn)級(jí)別的介紹
5.2、項(xiàng)目結(jié)構(gòu)
[root@vm-master-01 ansible]# pwd
/etc/ansible
[root@vm-master-01 ansible]# tree ./
./
├── ansible.cfg
├── hosts
├── nginx_role.yml
└── roles
├── mysql
├── nginx
│ ├── files
│ │ └── index.html
│ ├── handlers
│ │ ├── main.yml
│ │ └── restart.yml
│ ├── tasks
│ │ ├── copyfile.yml
│ │ ├── group.yml
│ │ ├── main.yml
│ │ ├── start.yml
│ │ ├── template.yml
│ │ ├── user.yml
│ │ └── yum.yml
│ ├── templates
│ │ └── nginx.conf.j2
│ └── vars
│ └── main.yml
├── redis
└── supervisor
├── files
├── handlers
├── tasks
├── templates
└── vars
15 directories, 15 files
下面我分別貼下沒(méi)個(gè)文件的內(nèi)容隶债。
5.2.1腾它、role
關(guān)于role的各個(gè)目錄做下簡(jiǎn)要的概述
files:存放由copy、script模塊等調(diào)用的文件
templates:template模塊查找所需要模塊文件的目錄
tasks:定義task死讹,至少包含一個(gè)名為main.yml的文件携狭,其他文件需要再次文件中通過(guò)include進(jìn)行包含
handlers:至少應(yīng)該包含一個(gè)名為main.yml的文件,其他文件需要在此文件中通過(guò)include進(jìn)行包含
vars:定義變量回俐,至少包含一個(gè)名為main.yml的文件逛腿,其他文件需要在此文件中通過(guò)include進(jìn)行包含
meta:定義當(dāng)前角色的特殊設(shè)定以及其依賴(lài)關(guān)系,至少應(yīng)該包含一個(gè)名為main.yml的文件仅颇,其它文件需要在此文件中通過(guò)include進(jìn)行包含
default:設(shè)定默認(rèn)變量時(shí)使用此目錄中的main.yml文件
[root@vm-master-01 ansible]# cat nginx_role.yml
- hosts: vm-03
remote_user: root
roles:
- { role: nginx, tags: ['app', 'ops'], when: ansible_os_family == 'RedHat' }
- { role: mysql, tags: 'app' }
5.2.2单默、files目錄
[root@vm-master-01 files]# ls
index.html
[root@vm-master-01 files]# cat index.html
nginx playbook
5.2.3、handlers目錄
[root@vm-master-01 handlers]# ls
main.yml restart.yml
[root@vm-master-01 handlers]# cat main.yml
- include: restart.yml
[root@vm-master-01 handlers]# cat restart.yml
- name: nginx restart
service: name=nginx state=restarted
5.2.4忘瓦、tasks目錄
[root@vm-master-01 tasks]# ls
copyfile.yml group.yml main.yml start.yml template.yml user.yml yum.yml
[root@vm-master-01 tasks]# cat copyfile.yml
- name: copy index.html
copy: src=index.html dest=/usr/share/nginx/html/
notify: nginx restart
[root@vm-master-01 tasks]# cat group.yml
- name: create group
group: name={{ username }} gid=88
[root@vm-master-01 tasks]# cat main.yml
- include: group.yml
- include: user.yml
- include: yum.yml
- include: template.yml
- include: start.yml
- include: copyfile.yml
[root@vm-master-01 tasks]# cat start.yml
- name: start service
service: name=nginx state=started enabled=yes
[root@vm-master-01 tasks]# cat template.yml
- name: copy file
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
[root@vm-master-01 tasks]# cat user.yml
- name: create user
user: name={{ username }} group={{ groupname }} system=yes shell=/sbin/nologin
[root@vm-master-01 tasks]# cat yum.yml
- name: install nginx
yum: name=nginx
5.2.5搁廓、templates目錄
[root@vm-master-01 templates]# ls
nginx.conf.j2
[root@vm-master-01 templates]# cat nginx.conf.j2
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user {{ username }};
worker_processes {{ ansible_processor_vcpus + 2 }};
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2;
# listen [::]:443 ssl http2;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
5.2.6、vars目錄
[root@vm-master-01 vars]# ls
main.yml
[root@vm-master-01 vars]# cat main.yml
groupname: nginx
username: nginx
5.3耕皮、執(zhí)行playbook
執(zhí)行命令:ansible-playbook -i /etc/ansible/hosts --tags=app nginx_role.yml結(jié)果如下:
5.4境蜕、瀏覽器訪(fǎng)問(wèn)
六、注意
1凌停、我上面執(zhí)行ansible或ansible-playbook時(shí)粱年,結(jié)果中多處有提示:[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
是因?yàn)槲襤osts中資源清單的組中有使用符號(hào)“-",這不符合相關(guān)語(yǔ)法規(guī)范罚拟,修改掉即可台诗。