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

  

實戰環境:html

  公司計劃在年末作一次大型市場促銷活動,全面衝刺下交易額,爲明年的上市作準備。公司要求各業務組對年末大促作準備,運維部要求全部業務容量進行三倍的擴容,並搭建出多套環境能夠共開發和測試人員作測試,運維老大爲了在年末有所表現,要求運維部門同事儘快實現,當你接到這個任務時,有沒有更快的解決方式?python

  項目實戰系列,總架構圖 http://www.cnblogs.com/along21/p/8000812.htmlmysql

1、簡單介紹

一、定義

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

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

 

二、ansible 特色

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

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

③ 有大量常規運維操做模塊,可實現平常絕大部分操做。sql

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

⑤ 支持API及自定義模塊,可經過Python輕鬆擴展;數據庫

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

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

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

 

三、ansible 任務執行模式

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

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

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

 

四、Ansible命令執行過程

① 加載本身的配置文件 默認/etc/ansible/ansible.cfg

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

③ 加載本身對應的模塊文件,如command

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

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

⑥ 給文件+x執行

⑦ 執行並返回結果

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

 

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

一、安裝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

 

二、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來記錄

 

三、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    只是測試一下會改變什麼內容,不會真正去執行;相反,試圖預測一些可能發生的變化

四、ansible 使用前配置

(1)Ansible配置公私鑰

配置ansible 使用公鑰驗證

雖然ansible支持其餘主機認證方式,可是咱們最經常使用的的仍是基於祕鑰的認證:

① 首先生成祕鑰

ssh-keygen -t rsa -P ''

② 而後向主機分發祕鑰:

ssh-copy-id root@   #@後面跟主機名或者IP地址三、若是出現如下狀況:

# 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(點對點)模塊的使用

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

vim /etc/ansible/hosts

[web]

192.168.30.7

192.168.30.2

定義hosts 有3類:

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

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

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

 

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

# ansible all -m ping

 

三、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'

 

四、shell 模塊

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

(1)實例:

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

 

五、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 上:

 

六、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" 查看

 

七、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 目錄下

 

八、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 下

 

九、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"

 

十、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端口

 

十一、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" 刪除用戶

 

十二、group 模塊

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

(1)選項

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

 

(2)實例

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

 

1三、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 的模塊!

 

1四、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)理解

① 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,以後管理服務器會變得十分簡單。

 

二、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

③ 報告結果

 

三、劇本的書寫,和執行

(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

 

四、在劇本中加入模板 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

一、介紹

(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的文件,用於設定默認變量;

 

二、實現

(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" 查看端口,實驗成功

相關文章
相關標籤/搜索