項目實戰10.1—企業級自動化運維工具應用實戰-ansible

一、簡單介紹

1、定義

  ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。

  ansible是基於 paramiko(框架) 開發的,並且基於模塊化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。ansible不需要在遠程主機上安裝client/agents,因爲它們是基於ssh來和遠程主機通訊的。ansible目前已經已經被紅帽官方收購,是自動化運維工具中大家認可度最高的,並且上手容易,學習簡單。是每位運維工程師必須掌握的技能之一。

 

2、ansible 特點

① 部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作,沒有agent;

② 默認使用SSH協議對設備進行管理;

③ 有大量常規運維操作模塊,可實現日常絕大部分操作。

④ 配置簡單、功能強大、擴展性強;

⑤ 支持API及自定義模塊,可通過Python輕鬆擴展;

⑥ 通過Playbooks(劇本)來定製強大的配置、狀態管理;

⑦ 輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;

⑧ 提供一個功能強大、操作性強的Web管理界面和REST API接口——AWX平臺。

 

3、ansible 任務執行模式

Ansible系統由控制主機對被管節點的操作方式可分爲兩類,即ad-hoc和playbook:

  ·ad-hoc(點對點)模式使用單個模塊,支持批量執行單條命令。 ad-hoc 命令是一種可以快速輸入的命令,而且不需要保存起來的命令。就相當於bash中的一句話shell。

  ·playbook(劇本)模式:是Ansible主要管理方式,也是Ansible功能強大的關鍵所在。playbook通過多個task集合完成一類功能,如Web服務的安裝部署、數據庫服務器的批量備份等。可以簡單地把playbook理解爲通過組合多條ad-hoc操作作的配置文件。

 

4、Ansible命令執行過程

① 加載自己的配置文件 默認/etc/ansible/ansible.cfg

② 查找對應的主機配置文件,找到要執行的主機或者組

③ 加載自己對應的模塊文件,如command

④ 通過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器端

⑤ 對應執行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件

⑥ 給文件+x執行

⑦ 執行並返回結果

⑧ 刪除臨時py文件,sleep 0退出

 

實戰一:安裝ansible 及指令講解

1、安裝ansible

ansible安裝常用兩種方式,yum安裝和pip程序安裝

這裏提供二種安裝方式,任選一種即可

(1)使用yum 安裝

yum install epel-release -y

yum install ansible –y

(2)使用pip (python 的包管理模塊)安裝

pip install ansible   如果沒pip,需先安裝pip.yum可直接安裝:

yum install python-pip

pip install ansible

 

2、Ansible配置文件

① sudo_user:

這是設置默認執行命令的用戶,也可以在playbook中重新設置這個參數。配置實例如下:

  sudo_user = root

② remote_port:

這是指定連接被管節點的管理端口,默認是22。除非設置了特殊的SSH端口,不然這個參數一般是 不需要修改的。配置實例如下:

  remote_port = 22

③ host_key_checking:

這是設置是否檢查SSH主機的密鑰。可以設置爲True或False,關閉後第一次連接沒有提示配置實例

  host_key_checking = False

④ timeout:

這是設置SSH連接的超時間隔,單位是秒。配置實例如下:

  timeout = 60

⑤ log_path:Ansible系統默認是不記錄日誌的,如果想把Ansible系統的輸出記錄到日誌文件中,需要設置log_path 來指定一個存儲Ansible日誌的文件。配置實例如下:

  log_path = /var/log/ansible.log

  另外需要注意,執行Ansible的用戶需要有寫入日誌的權限,模塊將會調用被管節點的syslog來記錄

 

3、ansible 命令

(1)Ansible命令集

/usr/bin/ansible #Ansibe AD-Hoc   #臨時命令執行工具,常用於臨時命令的執行

/usr/bin/ansible-doc #Ansible   #模塊功能查看工具

/usr/bin/ansible-galaxy   #下載/上傳優秀代碼或Roles模塊的官網平臺,基於網絡的,也可以去github 上找自己想要的模板

/usr/bin/ansible-playbook   #Ansible定製自動化的任務集編排工具,執行playbook劇本

/usr/bin/ansible-pull   #Ansible遠程執行命令的工具,拉取配置而非推送配置(使用較少,海量機器時使用,對運維的架構能力要求較高)

/usr/bin/ansible-vault   #Ansible文件加密工具

/usr/bin/ansible-console   #Ansible基於Linux Consoble界面可與用戶交互的命令執行工具

 

(2)命令格式:

ansible <host-pattern> [-f forks] [-m module_name] [-a args]

我們可以通過 ansible -h查看幫助

Usage: ansible <host-pattern> [options] Options:

  ① -a MODULE_ARGS, --args=MODULE_ARGS    模塊的參數,如果執行默認COMMAND的模塊,即是命令參數,如:"date","pwd"等等 module arguments 模塊參數

  ② -C, --check don't make any changes; instead, try to predict some of the changes that may occur    只是測試一下會改變什麼內容,不會真正去執行;相反,試圖預測一些可能發生的變化

4、ansible 使用前配置

(1)Ansible配置公私鑰

配置ansible 使用公鑰驗證

雖然ansible支持其他主機認證方式,但是我們最常用的的還是基於祕鑰的認證:

① 首先生成祕鑰

ssh-keygen -t rsa -P ''

② 然後向主機分發祕鑰:

ssh-copy-id root@   #@後面跟主機名或者IP地址3、如果出現以下情況:

# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.6.72

-bash: ssh-copy-id: command not found

請嘗試: yum -y install openssh-clientsansible

 

實戰二:ad-hoc(點對點)模塊的使用

1、設置hosts 遠程被控制主機

vim /etc/ansible/hosts

[web]

192.168.30.7

192.168.30.2

定義hosts 有3類:

① Ex 1:未分組的主機,在任何組頭之前指定

② Ex 2:有組的主機,一組屬於"webservers"組的主機

③ Ex 3:和數據庫有關的,"dbservers"組中的數據庫服務器集合

 

2、ping 模塊,主機連通性測試

# ansible all -m ping

 

3、Command 模塊

(1)介紹

命令模塊接受命令名稱,後面是空格分隔的列表參數。給定的命令將在所有選定的節點上執行。

不會通過shell進行處理,比如$HOME和操作如"小於"<",">", "|", ";","&"' 工作(需要使用(shell)模塊實現這些功能)。

 

(2)選項

chdir      # 在執行命令之前,先切換到該目錄
creates  # 一個文件名,當這個文件存在,則該命令不執行,可以用來做判斷
removes       # 一個文件名,這個文件不存在,則該命令不執行,與creates相反的判斷
executable   # 切換shell來執行命令,需要使用命令的絕對路徑(不常用,常用下面shell 模塊)
free_form    # 要執行的Linux指令,一般使用Ansible的-a參數代替(不常用,常用下面shell 模塊)

(3)實例

ansible web -m command -a 'chdir=/app ls'

ansible web -m command -a 'creates=/app/f1 touch /app/f2'

ansible web -m command -a 'removes=/app/f1 touch /app/f2'

 

4、shell 模塊

shell模塊在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,例如管道等

(1)實例:

ansible web -m shell -a 'cat /etc/passwd |grep root'

 

5、copy 模塊

copy:複製文件到遠程主機,可以改權限等

(1)用法:

① 複製文件

-a "src= dest= "

② 給定內容生成文件

-a "content= dest= "

 

(2)相關選項如下:

① src:源,被複制到遠程主機的本地文件,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸複製。在這種情況下,如果路徑使用“/”來結尾,則只複製目錄裏的內容,如果沒有使用“/”來結尾,則包含目錄在內的整個內容全部複製,類似於rsync。
② dest:目標,必選項。要將源文件複製到的遠程主機的絕對路徑,如果源文件是一個目錄,那麼該路徑也必須是個目錄
③ backup:被管理的遠程主機已經有文件了,在覆蓋之前,將源文件備份,備份文件包含時間信息。有兩個選項:yes|no
④ content:用於替代“src”,可以直接設定指定文件的值
⑤ directory_mode:遞歸設定目錄的權限,默認爲系統默認權限
⑥ force:如果目標主機包含該文件,但內容不同,如果設置爲yes,則強制覆蓋,如果爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes
⑦ others:所有的file模塊裏的選項都可以在這裏使用

 

(3)實例

① ansible web -m copy -a "src=/root/f3 dest=/app"

分析:把控制端/root/f3 文件,copy 到了被控制端的/app 下

 

② ansible web -m copy -a "content='hello' dest=/app/f3 mode=222 backup=yes"

分析:在控制端/app/f3 寫hello 內容,且設置權限爲222,並做備份

注意:因爲修改了/app/f3 的內容,使其去原來不同,纔會備份

192.168.30.2 上本已有了f3 文件,且內容是hello ,沒有發生修改,所以是"綠色",且沒有備份

192.168.30.7 修改了f3 文件,發生修改,所以是"×××",且發生了備份

192.168.30.7 上:

192.168.30.2 上:

 

6、file 模塊

設置文件屬性

創建目錄:-a "path= state=directory"

創建鏈接文件:-a "path= src= state=link"

刪除文件:-a "path= state=absent"

 

(1)選項

① force:需要在兩種情況下強制創建軟鏈接,一種是源文件不存在,但之後會建立的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然後創建新的軟鏈,有兩個選項:yes|no
② group:定義文件/目錄的屬組 mode:定義文件/目錄的權限
③ owner:定義文件/目錄的屬主 path:必選項,定義文件/目錄的路徑
④ recurse:遞歸設置文件的屬性,只對目錄有效 src:被鏈接的源文件路徑,只應用於state=link的情況
⑤ dest:被鏈接到的路徑,只應用於state=link的情況
⑥ state=:
  directory:如果目錄不存在,就創建目錄
  file:即使文件不存在,也不會被創建
  link:創建軟鏈接
  hard:創建硬鏈接
  touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,則更新其最後修改時間
  absent:刪除目錄、文件或者取消鏈接文件

(2)實例:

① ansible web -m file -a "path=/app/f4 state=directory" 在被控制端,創建f4 目錄

ansible web -m command -a "chdir=/app ls" 查看/app 目錄

 

② 創建軟連接

ansible web -m file -a "path=/app/f12 src=/app/f1 state=link"

ansible web -m file -a "src=/app/f1 dest=/app/f11 state=link" 創建軟連接f11,連接f1

ansible web -m shell -a "ls -l /app" 查看

 

7、fetch 模塊

(1)介紹

從遠程某主機獲取文件到本地

dest:用來存放文件的目錄,例如存放目錄爲backup,源文件名稱爲/etc/profile

  在主機pythonserver中,那麼保存爲/backup/pythonserver/etc/profile

Src:在遠程拉取的文件,並且必須是一個file,不能是目錄

注意:從遠程獲取到本地的文件,會保存到以遠程主機的IP 爲名的目錄中,且保存目錄結構

 

(3)實例

ansible web -m fetch -a "src=/app/f1 dest=/app/"

分析:拉取遠程的/app/f1 文件,保存到本地的/app 目錄下

 

8、cron 模塊

管理cron計劃任務;-a "": 設置管理節點生成定時任務

(1)選項:

① action: 
cron backup=   #如果設置,創建一個crontab備份 【yes|no】
cron_file=    #如果指定, 使用這個文件cron.d,而不是單個用戶
② crontab
  day=     #日應該運行的工作( 1-31, *, */2, )
  hour=   # 小時 ( 0-23, *, */2, )
  minute=    #分鐘( 0-59, *, */2, )
  month=     #月( 1-12, *, /2, )
  weekday   # 周 ( 0-6 for Sunday-Saturday,, )
  job=       #指明運行的命令是什麼
  name=   #定時任務描述
  reboot    # 任務在重啓時運行,不建議使用,建議使用special_time
  special_time   #特殊的時間範圍,參數:reboot(重啓時),annually(每年),monthly(每月),weekly(每週),daily(每天),hourly(每小時)
  state   #指定狀態,present表示添加定時任務,也是默認設置,absent表示刪除定時任務
  user    #以哪個用戶的身份執行

(2)實例

在遠程主機上,定義每5分鐘,清空一次防火牆

① ansible web -m cron -a "name='Clear the iptable' minute=*/5 job='/sbin/iptables -F'"

ansible web -m shell -a "crontab -l" 查看

② ansible web -m cron -a 'name="Clear the iptable" minute=*/2 job="/sbin/ntpdate 172.17.0.1 &> /dev/null"' 每2分,更新一次時間,輸出結果導入/dec/null 中

注意:若定義的名字沒有修改,會把前一次定義的計劃任務覆蓋

 

③ ansible web -m cron -a "name='Clear the iptable' minute=*/5 job='/sbin/iptables -F' state=absent" 刪除計劃任務

 

④ ansible web -m cron -a 'name="list df every hour" special_time=hourly job="/bin/df -lh >> /app/disk_total &> /dev/null"' 每小時,把df -lh 的結果追加到/app/disk_total 下

 

9、yum 模塊

(1)選項

conf_file    #設定遠程yum安裝時所依賴的配置文件。如配置文件沒有在默認的位置。
disable_gpg_check   #是否禁止GPG checking,只用於`present‘ or `latest’。
disablerepo   #臨時禁止使用yum庫。 只用於安裝或更新時。
enablerepo   #臨時使用的yum庫。只用於安裝或更新時。name=    #所安裝的包的名稱state=     #present安裝, latest安裝最新的, absent 卸載軟件。update_cache    #強制更新yum的緩存。

 

(2)實例

①i安裝dstat 包,忽略gpg_check

ansible web -m yum -a "name=dstat state=present disable_gpg_check=yes"

卸載dstat 包

ansible web -m yum -a "name=dstat state=absent"

 

② 把控制端的安裝包發到被控制端,再安裝

ansible web -m copy -a "src=/root/zabbix-release-3.4-2.el7.noarch.rpm dest=/app"

ansible web -m yum -a "name=/app/zabbix-release-3.4-2.el7.noarch.rpm state=present disable_gpg_check=yes"

 

10、service 模塊

服務程序管理

(1)選項

arguments   #命令行提供額外的參數
enabled   #設置開機啓動。name=     #服務名稱runlevel    #開機啓動的級別,一般不用指定。
sleep    #在重啓服務的過程中,是否等待。如在服務關閉以後等待2秒再啓動。state     #started啓動服務, stopped停止服務, restarted重啓服務, reloaded重載配置

 

(2)實例

① 在遠程被控制端安裝nginx

ansible web -m yum -a "name=nginx state=present disable_gpg_check=yes"

② 把控制端的nginx 配置文件發送,到被控制的2臺機器

cp /etc/nginx/nginx.conf /app

vim /app/nginx.conf 把端口修改爲8888,爲了一會驗證實驗結果

ansible web -m copy -a "src=/app/nginx.conf dest=/etc/nginx"

③ 開啓遠程被控制端的nginx 服務

ansible web -m service -a "name=nginx state=started"

④ 查詢遠程的8888 端口

ansible web -m shell -a "ss -nutlp |grep 8888"

⑤ 關閉遠程的nginx 服務

ansible web -m service -a "name=nginx state=stopped"

⑥ 查詢,失敗,沒有8888端口

 

11、user 模塊

用戶模塊,管理用戶帳號

(1)選項

comment        # 用戶的描述信息
createhome    # 是否創建家目錄
force      # 在使用state=absent是, 行爲與userdel -force一致.
group     # 指定基本組
groups   # 指定附加組,如果指定爲(groups=)表示刪除所有組
home     # 指定用戶家目錄
move_home    # 如果設置爲home=時, 試圖將用戶主目錄移動到指定的目錄
name     # 指定用戶名
non_unique     # 該選項允許改變非唯一的用戶ID值
password       # 指定用戶密碼,若指定的是明文密碼,是不能用的,需用md5加密過後的密碼
remove   # 在使用state=absent時, 行爲是與userdel -remove一致
shell      # 指定默認shell
state      # 設置帳號狀態,不指定爲創建,指定值爲absent表示刪除
system  # 當創建一個用戶,設置這個用戶是系統用戶。這個設置不能更改現有用戶
uid     # 指定用戶的uid
update_password    # 更新用戶密碼

 

(2)實例

創建用戶along01,uid=1111,家目錄在/app/along01 下

ansible web -m user -a 'name=along01 comment="along01 is along" uid=1111 group=along shell=/bin/bash home=/app/along01'

ansible web -m shell -a "cat /etc/passwd |grep along01" 查看

ansible web -m user -a "name=along01 state=absent" 刪除用戶

 

12、group 模塊

用戶組模塊,添加或刪除組

(1)選項

gid         # 設置組的GID號
name=  # 管理組的名稱
state     # 指定組狀態,默認爲創建,設置值爲absent爲刪除
system  # 設置值爲yes,表示爲創建系統組

 

(2)實例

ansible web -m group -a 'name=tom state=present'

 

13、script 模塊

在指定節點運行服務端的腳本

(1)示例

[root@Ansible ~]#vim test.sh

#/bin/bash

touch /tmp/test.sh.log  #創建/tmp/test.sh.log

echo "hello" >> /tmp/test.sh.log   #將echo命令結果輸出到/tmp/test.sh.log

 

(2)實例:

① 在控制端隨便寫個腳本

vim /app/test.sh

#!/bin/bash

date >> /app/disk_total.log

df -lh >> /app/disk_total.log

② ansible web -m script -a '/app/test.sh' 在遠程被控制的機器執行腳本

ansible web -m command -a "chdir=/app ls" 查看文件生成

ansible web -m shell -a "cat /app/disk_total.log" 查看文件內容正確

以上都是ad-hoc 的模塊!

 

14、setup 模塊

查機器的所有facts信息

(1)介紹

① facts 組件是Ansible 用於採集被管機器設備信息的一個功能,我們可以使用setup 模塊查機器的所有facts信息,可以使用filter來查看指定信息。整個facts信息被包裝在一個JSON格式的數據結構中,ansible_facts是最上層的值。

② facts就是變量,內建變量 每個主機的各種信息,cpu顆數、內存大小等。會存在facts中的某個變量中。調用後返回很多對應主機的信息,在後面的操作中可以根據不同的信息來做不同的操作。如redhat系列用yum安裝,而debian系列用apt來安裝軟件。

③ setup模塊,主要用於獲取主機信息,在playbooks裏經常會用到的一個參數gather_facts就與該模塊相關。

④ setup模塊下經常使用的一個參數是filter 參數,查詢的是全部信息,很多,filter 相當於匹配篩選。

 

(2)實例:

① ansible 192.168.30.7 -m setup 查詢全部信息

② ansible web -m setup -a "filter='*mem*'" 查看內存的信息

③ ansible all -m setup --tree /tmp/facts 將所有主機的信息輸入到/tmp/facts目錄下,每臺主機的信息輸入到主機名文件中(/etc/ansible/hosts裏的主機名)

 

實驗三:Ansible playbook 的使用

1、介紹

(1)理解

① playbook是ansible用於配置,部署,和管理被控節點的劇本。

② 通過playbook的詳細描述,執行其中的一系列tasks,可以讓遠端主機達到預期的狀態。playbook就像Ansible控制器給被控節點列出的的一系列to-do-list,而被控節點必須要完成。

③ 也可以這麼理解,playbook 字面意思,即劇本,現實中由演員按照劇本表演,在Ansible中,這次由計算機進行表演,由計算機安裝,部署應用,提供對外服務,以及組織計算機處理各種各樣的事情

 

(2)Ansible playbook 使用場景

① 執行一些簡單的任務,使用ad-hoc命令可以方便的解決問題,但是有時一個設施過於複雜,需要大量的操作時候,執行的ad-hoc命令是不適合的,這時最好使用playbook。

② 就像執行shell命令與寫shell腳本一樣,也可以理解爲批處理任務,不過playbook有自己的語法格式。

③ 使用playbook你可以方便的重用這些代碼,可以移植到不同的機器上面,像函數一樣,最大化的利用代碼。在你使用Ansible的過程中,你也會發現,你所處理的大部分操作都是編寫playbook。可以把常見的應用都編寫成playbook,之後管理服務器會變得十分簡單。

 

2、Ansible playbook 格式

(1)介紹

① playbook由YMAL語言編寫。YAML( /ˈjæməl/ )參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822,Clark Evans在2001年5月在首次發表了這種語言,另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者。

② YMAL格式是類似於JSON的文件格式,便於人理解和閱讀,同時便於書寫。首先學習瞭解一下YMAL的格式,對我們後面書寫playbook很有幫助。以下爲playbook常用到的YMAL格式。

 

(2)語法介紹

① 文件的第一行應該以 "---" (三個連字符)開始,表明YMAL文件的開始。

② 在同一行中,#之後的內容表示註釋,類似於shell,python和ruby。

③ YMAL中的列表元素以"-"開頭然後緊跟着一個空格,後面爲元素內容。就像這樣

- apple - banana - orange 等價於JSON的這種格式

[ "apple", "banana", "orange" ]

④ 同一個列表中的元素應該保持相同的縮進。否則會被當做錯誤處理。

⑤ play中hosts,variables,roles,tasks等對象的表示方法都是鍵值中間以":"分隔表示,":"後面還要增加一個空格

 

(3)Playbooks 配置文件的基礎組件

① hosts:運行指定任務的目標主機;使用hosts指示使用哪個主機或主機組來運行下面的tasks,每個playbook都必須指定hosts,hosts也可以使用通配符格式。主機或主機組在inventory清單中指定,可以使用系統默認的/etc/ansible/hosts,也可以自己編輯,在運行的時候加上-i選項,指定清單的位置即可。在運行清單文件的時候,-list-hosts選項會顯示那些主機將會參與執行task的過程中。

 remoute_user: 在遠程主機上執行任務的用戶;指定遠端主機中的哪個用戶來登錄遠端系統,在遠端系統執行task的用戶,可以任意指定,也可以使用sudo,但是用戶必須要有執行相應task的權限。

③ sudo_user:

 tasks:任務列表;指定遠端主機將要執行的一系列動作。tasks的核心爲ansible的模塊,前面已經提到模塊的用法。

  tasks:包含name和要執行的模塊name是可選的,只是爲了便於用戶閱讀,不過還是建議加上去,模塊是必須的,同時也要給予模塊相應的參數

⑤ templates:包含了模板語法的文本文件;

⑥ variables 變量

⑦ handlers:由特定條件觸發的任務

 

(4)注意:shell和command模塊後面直接跟命令,而非key=value類的參數列表;

① 某任務的狀態在運行後爲changed時,可通過"notify"通知給相應的handlers

② 任務可以通過"tags"打標籤,而後可在ansible-playbook命令上使用-t 標籤名,指定進行調用;

 

(5)variables 變量的定義:

① facts:可直接調用;

注意:可使用setup模塊直接獲取目標主機的facters;

② 用戶自定義變量:

(a) ansible-playbook命令的命令行中的

  -e VARS, --extra-vars=VARS

(b) 在playbook中定義變量的方法:

vars:

   - var1: value1

   var2: value2

 

(6)執行playbook劇本

使用ansible-playbook運行playbook文件,得到如下輸出信息,輸出內容爲JSON格式。並且由不同顏色組成,便於識別。一般而言

l 綠色代表執行成功,系統保持原樣

l ×××代表系統代表系統狀態發生改變

l 紅色代表執行失敗,顯示錯誤輸出。

執行有三個步驟:

① 收集facts

② 執行tasks

③ 報告結果

 

3、劇本的書寫,和執行

(1)寫一個簡單劇本

vim /etc/ansible/web.yml

---
- hosts: web
  remote_user: root
  tasks:
        - name: yum install nginx
          yum: name=nginx state=latest
        - name: copy nginx.conf
          copy: src=/app/nginx.cong dest=/etc/nginx/nginx.conf backup=yes
          tags: reloadnginx
        - name: start service
          service: name=nginx state=started
          tags: startnginx

 

分析:安裝nginx;把配置文件copy 到遠程被控制的主機上;開啓服務

 

(2)在劇本中加入handlers 觸發任務

前提背景:如playbook 中有一系列tasks,但有時只需改動少個task 就要觸發另一個操作;若再把劇本執行一遍,浪費資源和時間;此時可以設置handlers 觸發任務

vim /etc/ansible/web.yml

---
- hosts: web
  remote_user: root
  tasks:        - name: yum install samba
          yum: name=samba state=latest        - name: copy nginx.conf
          copy: src=/app/nginx.cong dest=/etc/nginx/nginx.conf backup=yes          notify: reload
          tags: reloadnginx        - name: start service
          service: name=smb state=started
          tags: startsmb  handlers:        - name: reload
          service: name=nignx state=restarted

分析:notify 和handler 一起使用,當notify 標記的task 發生變化,

 

(3)在劇本中加入variables 變量

a) 變量可以不定義在playbook 中,直接在命令行給出

① vim /etc/ansible/web.yml

---
- hosts: web
  remote_user: root
  tasks:        - name: yum install nginx
          yum: name=nginx state=latest        - name: copy nginx.conf
          copy: src=/app/nginx.conf dest=/etc/nginx/nginx.conf backup=yes
          notify: reload
          tags: reloadnginx        - name: start service
          service: name={{ servername }} state=started
          tags: start{{ servername }}
  handlers:        - name: reload
          service: name=nginx state=restarted

② ansible-playbook web.yml -e servername=httpd -t starthttpd

分析:-e servername=httpd 指定變量的值爲httpd

-t starthttpd 執行這個標籤的操作

 

b) 也可以直接定義在playbook 中

小提示:可以使用vim 中的s 替換: % s/nginx/\{\{\ servername\ \}\}/g ,可以全局把nginx替換爲{{ servername }}

① vim /etc/ansible/web.yml

---
- hosts: web
  remote_user: root  vars:        - rpmname: httpd
  tasks:        - name: yum install {{ servername }}
          yum: name={{ servername }} state=latest        - name: copy {{ servername }}.conf          copy: src=/app/{{ servername }}.conf dest=/etc/httpd/conf/{{ servername }}.conf backup=yes
          notify: reload
          tags: reload{{ servername }}        - name: start service
          service: name={{ servername }} state=started
          tags: start{{ servername }}
  handlers:        - name: reload

直接執行劇本playbook

 

4、在劇本中加入模板 templates

(1)介紹

模板:templates

文本文件,嵌套有腳本(使用模板編程語言編寫)

Jinja2:Jinja2是python的一種模板語言,以Django的模板語言爲原本

支持:

  字符串:使用單引號或雙引號;

  數字:整數,浮點數;

  列表:[item1, item2, ...]

  元組:(item1, item2, ...)

  字典:{key1:value1, key2:value2, ...}

  布爾型:true/false

  算術運算:+, -, *, /, //, %, **

  比較操作:==, !=, >, >=, <, <=

  邏輯運算:and, or, not

 

(2)先創建一個模板文件,以.j2 結尾

cp /etc/nginx/nginx.conf /app/nginx.conf.j2

vim /app/nginx.conf.j2

worker_processes {{ ansible_processor_vcpus }}; #該變量是setup 模塊查看CPU核數的變量

listen {{ nginxport }}; #自定義在playbook 中的變量

 

(3)在劇本中加入模板

---
- hosts: web
  remote_user: root
  vars:        - servername: nginx
          nginxport: 8888
  tasks:        - name: yum install {{ servername }}
          yum: name={{ servername }} state=latest        - name: copy {{ servername }}.conf          templates: src=/app/{{ servername }}.conf dest=/etc/nginx/{{ servername }}.conf backup=yes
          notify: reload
          tags: reload{{ servername }}        - name: start service
          service: name={{ servername }} state=started
          tags: start{{ servername }}
  handlers:        - name: reload
          service: name={{ servername }} state=restarted

 

(4)執行劇本

  

實驗四:角色定製 roles

1、介紹

(2)定義

  對於以上所有的方式有個弊端就是無法實現複用假設在同時部署Web、db、ha 時或不同服務器組合不同的應用就需要寫多個yml文件。很難實現靈活的調用。

  roles 用於層次性、結構化地組織playbook。roles 能夠根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量(vars)、文件(file)、任務(tasks)、模塊(modules)及處理器(handlers)放置於單獨的目錄中,並可以便捷地include它們的一種機制。角色一般用於基於主機構建服務的場景中,但也可以是用於構建守護進程等場景中。

 

(2)角色集合示例:

roles/

mysql/

httpd/

nginx/

files/:存儲由copy或script等模塊調用的文件;

tasks/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各task;其它的文件需要main.yml進行"包含"調用;

handlers/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各handler;其它的文件需要由main.yml進行"包含"調用;

vars/:此目錄中至少應該有一個名爲main.yml的文件,用於定義各variable;其它的文件需要由main.yml進行"包含"調用;

templates/:存儲由template模塊調用的模板文本;

meta/:此目錄中至少應該有一個名爲main.yml的文件,定義當前角色的特殊設定及其依賴關係;其它的文件需要由main.yml進行"包含"調用;

default/:此目錄中至少應該有一個名爲main.yml的文件,用於設定默認變量;

 

2、實現

(1)先創建目錄結構

cd /etc/ansible/roles

mkdir -pv ./{nginx,mysql,tomcat}/{files,templates,vars,tasks,handlers,meta,default}

 

以nginx 爲例,cd /etc/ansible/roles/nginx

(2)編輯tasks

vim tasks/main.yml

- name: copy
  copy: src=nginx-1.10.2-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm- name: install
  yum: name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm state=latest- name: conf
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf backup=yes
  notify: reload
  tags: nginxconf- name: start service
  service: name=nginx state=started

(3)因爲要copy,所以把源放到files 目錄下

cp /root/nginx-1.10.2-1.el7.ngx.x86_64.rpm files

 

(4)因爲有complete 模板,需把模板放到templates 目錄

cp /app/nginx.conf.j2 templates

 

(5)因爲有notify ,所以需在handlers 目錄下定義觸發任務

vim handlers/main.yml

- name: reload

service: name=nginx state=reloade

 

(6)因爲模板裏用了變量,所以在vars 定義變量

vim vars/main.yml

nginxport: 1234

最後的目錄結構

 

(7)在/etc/ansible 下定義劇本playbook

vim /etc/ansible/role.yml

- hosts: web
  remote_user: root
  roles:        - { role: nginx,nginxport=1234 }

 

(8)執行劇本 role.yml

ansible-playbook role.yml

ansible web -m shell -a "ss -nutl |grep 1234" 查看端口,實驗成功


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章