ansible基礎(chǔ)

一、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架構(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ò)程:


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é)果如下圖:
ansible-playbook執(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)下:


meta flush_handlers
#從上面結(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
可以將"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é)果如下:


tags
從結(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)下:
tags

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é)果如下:


ignore_errors
在第二個(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é)果如下:


limit
雖然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é)果如下:


playbook變量

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é)果如下:


命令行傳入變量-命令行變量?jī)?yōu)先級(jí)最高

命令行不傳入變量執(zhí)行命令:ansible-playbook -i /etc/ansible/hosts /etc/ansible/var_priority.yaml 結(jié)果如下:


命令行不傳入變量-playbook變量?jī)?yōu)先級(jí)最高
# 只修改/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é)果如下:


命令行不傳入變量同時(shí)playbook不定義變量-普通變量?jī)?yōu)先級(jí)高于公共(組)變量
補(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é)果如下:


帶有templates的yaml執(zhí)行過(guò)程

nginx worker開(kāi)啟的數(shù)量為:8+2

執(zhí)行命令:ansible vm-03 -m shell -a "grep worker_processes /etc/nginx/nginx.conf"查看vm-03上nginx的配置文件:


vm-03中nginx配置文件中worker_processes的值

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使用
從上面例子可以看出:由于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é)果如下:


with_items

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)容:


for

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é)果如下:


register

五均驶、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é)果如下:


playbook執(zhí)行過(guò)程

5.4境蜕、瀏覽器訪(fǎng)問(wèn)

瀏覽器查看playbook執(zhí)行結(jié)果

六、注意

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ī)范罚拟,修改掉即可台诗。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市赐俗,隨后出現(xiàn)的幾起案子拉队,更是在濱河造成了極大的恐慌,老刑警劉巖阻逮,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粱快,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)事哭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)漫雷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人慷蠕,你說(shuō)我怎么就攤上這事珊拼∈成耄” “怎么了流炕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)仅胞。 經(jīng)常有香客問(wèn)我每辟,道長(zhǎng),這世上最難降的妖魔是什么干旧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任渠欺,我火速辦了婚禮,結(jié)果婚禮上椎眯,老公的妹妹穿的比我還像新娘挠将。我一直安慰自己,他們只是感情好编整,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布舔稀。 她就那樣靜靜地躺著,像睡著了一般掌测。 火紅的嫁衣襯著肌膚如雪内贮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天汞斧,我揣著相機(jī)與錄音夜郁,去河邊找鬼。 笑死粘勒,一個(gè)胖子當(dāng)著我的面吹牛竞端,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庙睡,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼婶熬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了埃撵?” 一聲冷哼從身側(cè)響起赵颅,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎暂刘,沒(méi)想到半個(gè)月后饺谬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年募寨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了族展。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拔鹰,死狀恐怖仪缸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情列肢,我是刑警寧澤恰画,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站瓷马,受9級(jí)特大地震影響拴还,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜欧聘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一片林、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怀骤,春花似錦费封、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至凉敲,卻和暖如春衣盾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爷抓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工势决, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蓝撇。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓果复,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親渤昌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虽抄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容