實戰環境: 公司計劃在年底做一次大型市場促銷活動,全面衝刺下交易額,為明年的上市做準備。公司要求各業務組對年底大促做準備,運維部要求所有業務容量進行三倍的擴容,並搭建出多套環境可以共開發和測試人員做測試,運維老大為了在年底有所表現,要求運維部門同事儘快實現,當你接到這個任務時,有沒有更快的解決方式? ...
實戰環境:
公司計劃在年底做一次大型市場促銷活動,全面衝刺下交易額,為明年的上市做準備。公司要求各業務組對年底大促做準備,運維部要求所有業務容量進行三倍的擴容,並搭建出多套環境可以共開發和測試人員做測試,運維老大為了在年底有所表現,要求運維部門同事儘快實現,當你接到這個任務時,有沒有更快的解決方式?
項目實戰系列,總架構圖 http://www.cnblogs.com/along21/p/8000812.html
一、簡單介紹
1、定義
ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、chef、func、fabric)的優點,實現了批量系統配置、批量程式部署、批量運行命令等功能。
ansible是基於 paramiko(框架) 開發的,並且基於模塊化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。ansible不需要在遠程主機上安裝client/agents,因為它們是基於ssh來和遠程主機通訊的。ansible目前已經已經被紅帽官方收購,是自動化運維工具中大家認可度最高的,並且上手容易,學習簡單。是每位運維工程師必須掌握的技能之一。
2、ansible 特點
① 部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作,沒有agent;
⑥ 通過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
④ 通過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程伺服器端
⑤ 對應執行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件
實戰一:安裝ansible 及指令講解
1、安裝ansible
pip install ansible 如果沒pip,需先安裝pip.yum可直接安裝:
2、Ansible配置文件
① sudo_user:
這是設置預設執行命令的用戶,也可以在playbook中重新設置這個參數。配置實例如下:
sudo_user = root
② remote_port:
這是指定連接被管節點的管理埠,預設是22。除非設置了特殊的SSH埠,不然這個參數一般是 不需要修改的。配置實例如下:
③ host_key_checking:
這是設置是否檢查SSH主機的密鑰。可以設置為True或False,關閉後第一次連接沒有提示配置實例
host_key_checking = False
④ timeout:
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]
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支持其他主機認證方式,但是我們最常用的的還是基於秘鑰的認證:
① 首先生成秘鑰
② 然後向主機分發秘鑰:
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 遠程被控制主機
② Ex 2:有組的主機,一組屬於"webservers"組的主機
③ Ex 3:和資料庫有關的,"dbservers"組中的資料庫伺服器集合
2、ping 模塊,主機連通性測試
3、Command 模塊
命令模塊接受命令名稱,後面是空格分隔的列表參數。給定的命令將在所有選定的節點上執行。
它不會通過shell進行處理,比如$HOME和操作如"小於"<",">", "|", ";","&"' 工作(需要使用(shell)模塊實現這些功能)。
chdir # 在執行命令之前,先切換到該目錄
creates # 一個文件名,當這個文件存在,則該命令不執行,可以用來做判斷
removes # 一個文件名,這個文件不存在,則該命令不執行,與creates相反的判斷
executable # 切換shell來執行命令,需要使用命令的絕對路徑(不常用,常用下麵shell 模塊)
free_form # 要執行的Linux指令,一般使用Ansible的-a參數代替(不常用,常用下麵shell 模塊)
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的各種功能,例如管道等
ansible web -m shell -a 'cat /etc/passwd |grep root'
5、copy 模塊
① src:源,被覆制到遠程主機的本地文件,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸複製。在這種情況下,如果路徑使用“/”來結尾,則只複製目錄里的內容,如果沒有使用“/”來結尾,則包含目錄在內的整個內容全部複製,類似於rsync。 ② dest:目標,必選項。要將源文件複製到的遠程主機的絕對路徑,如果源文件是一個目錄,那麼該路徑也必須是個目錄 ③ backup:被管理的遠程主機已經有文件了,在覆蓋之前,將源文件備份,備份文件包含時間信息。有兩個選項:yes|no ④ content:用於替代“src”,可以直接設定指定文件的值 ⑤ directory_mode:遞歸設定目錄的許可權,預設為系統預設許可權 ⑥ force:如果目標主機包含該文件,但內容不同,如果設置為yes,則強制覆蓋,如果為no,則只有當目標主機的目標位置不存在該文件時,才複製。預設為yes ⑦ others:所有的file模塊里的選項都可以在這裡使用
① 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 文件,發生修改,所以是"黃色",且發生了備份
6、file 模塊
創建目錄:-a "path= state=directory"
創建鏈接文件:-a "path= src= state=link"
① force:需要在兩種情況下強制創建軟鏈接,一種是源文件不存在,但之後會建立的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然後創建新的軟鏈,有兩個選項:yes|no ② group:定義文件/目錄的屬組 mode:定義文件/目錄的許可權 ③ owner:定義文件/目錄的屬主 path:必選項,定義文件/目錄的路徑 ④ recurse:遞歸設置文件的屬性,只對目錄有效 src:被鏈接的源文件路徑,只應用於state=link的情況 ⑤ dest:被鏈接到的路徑,只應用於state=link的情況 ⑥ state=: directory:如果目錄不存在,就創建目錄 file:即使文件不存在,也不會被創建 link:創建軟鏈接 hard:創建硬鏈接 touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,則更新其最後修改時間 absent:刪除目錄、文件或者取消鏈接文件
① 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 模塊
dest:用來存放文件的目錄,例如存放目錄為backup,源文件名稱為/etc/profile
在主機pythonserver中,那麼保存為/backup/pythonserver/etc/profile
Src:在遠程拉取的文件,並且必須是一個file,不能是目錄
註意:從遠程獲取到本地的文件,會保存到以遠程主機的IP 為名的目錄中,且保存目錄結構
ansible web -m fetch -a "src=/app/f1 dest=/app/"
分析:拉取遠程的/app/f1 文件,保存到本地的/app 目錄下
8、cron 模塊
管理cron計劃任務;-a "": 設置管理節點生成定時任務
① 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 #以哪個用戶的身份執行
① 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 模塊
conf_file #設定遠程yum安裝時所依賴的配置文件。如配置文件沒有在預設的位置。 disable_gpg_check #是否禁止GPG checking,只用於`present‘ or `latest’。 disablerepo #臨時禁止使用yum庫。 只用於安裝或更新時。 enablerepo #臨時使用的yum庫。只用於安裝或更新時。 name= #所安裝的包的名稱 state= #present安裝, latest安裝最新的, absent 卸載軟體。 update_cache #強制更新yum的緩存。
ansible web -m yum -a "name=dstat state=present disable_gpg_check=yes"
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 模塊
arguments #命令行提供額外的參數 enabled #設置開機啟動。 name= #服務名稱 runlevel #開機啟動的級別,一般不用指定。 sleep #在重啟服務的過程中,是否等待。如在服務關閉以後等待2秒再啟動。 state #started啟動服務, stopped停止服務, restarted重啟服務, reloaded重載配置
ansible web -m yum -a "name=nginx state=present disable_gpg_check=yes"
vim /app/nginx.conf 把埠修改為8888,為了一會驗證實驗結果
ansible web -m copy -a "src=/app/nginx.conf dest=/etc/nginx"
ansible web -m service -a "name=nginx state=started"
ansible web -m shell -a "ss -nutlp |grep 8888"
ansible web -m service -a "name=nginx state=stopped"
11、user 模塊
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 # 更新用戶密碼
創建用戶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 模塊
gid # 設置組的GID號 name= # 管理組的名稱 state # 指定組狀態,預設為創建,設置值為absent為刪除 system # 設置值為yes,表示為創建系統組
ansible web -m group -a 'name=tom state=present'
13、script 模塊
(1)示例
touch /tmp/test.sh.log #創建/tmp/test.sh.log
echo "hello" >> /tmp/test.sh.log #將echo命令結果輸出到/tmp/test.sh.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" 查看文件內容正確
14、setup 模塊
① facts 組件是Ansible 用於採集被管機器設備信息的一個功能,我們可以使用setup 模塊查機器的所有facts信息,可以使用filter來查看指定信息。整個facts信息被包裝在一個JSON格式的數據結構中,ansible_facts是最上層的值。
② facts就是變數,內建變數 。每個主機的各種信息,cpu顆數、記憶體大小等。會存在facts中的某個變數中。調用後返回很多對應主機的信息,在後面的操作中可以根據不同的信息來做不同的操作。如redhat系列用yum安裝,而debian系列用apt來安裝軟體。
③ setup模塊,主要用於獲取主機信息,在playbooks里經常會用到的一個參數gather_facts就與該模塊相關。
④ setup模塊下經常使用的一個參數是filter 參數,查詢的是全部信息,很多,filter 相當於匹配篩選。
① 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中,這次由電腦進行表演,由電腦安裝,部署應用,提供對外服務,以及組織電腦處理各種各樣的事情
① 執行一些簡單的任務,使用ad-hoc命令可以方便的解決問題,但是有時一個設施過於複雜,需要大量的操作時候,執行的ad-hoc命令是不適合的,這時最好使用playbook。
② 就像執行shell命令與寫shell腳本一樣,也可以理解為批處理任務,不過playbook有自己的語法格式。
③ 使用playbook你可以方便的重用這些代碼,可以移植到不同的機器上面,像函數一樣,最大化的利用代碼。在你使用Ansible的過程中,你也會發現,你所處理的大部分操作都是編寫playbook。可以把常見的應用都編寫成playbook,之後管理伺服器會變得十分簡單。
2、Ansible playbook 格式
① 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格式。
① 文件的第一行應該以 "---" (三個連字元)開始,表明YMAL文件的開始。
② 在同一行中,#之後的內容表示註釋,類似於shell,python和ruby。
③ YMAL中的列表元素以"-"開頭然後緊跟著一個空格,後面為元素內容。就像這樣
- apple - banana - orange 等價於JSON的這種格式
[ "apple", "banana", "orange" ]
④ 同一個列表中的元素應該保持相同的縮進。否則會被當做錯誤處理。
⑤ play中hosts,variables,roles,tasks等對象的表示方法都是鍵值中間以":"分隔表示,":"後面還要增加一個空格。
① hosts:運行指定任務的目標主機;使用hosts指示使用哪個主機或主機組來運行下麵的tasks,每個playbook都必須指定hosts,hosts也可以使用通配符格式。主機或主機組在inventory清單中指定,可以使用系統預設的/etc/ansible/hosts,也可以自己編輯,在運行的時候加上-i選項,指定清單的位置即可。在運行清單文件的時候,-list-hosts選項會顯示那些主機將會參與執行task的過程中。
② remoute_user: 在遠程主機上執行任務的用戶;指定遠端主機中的哪個用戶來登錄遠端系統,在遠端系統執行task的用戶,可以任意指定,也可以使用sudo,但是用戶必須要有執行相應task的許可權。
④ tasks:任務列表;指定遠端主機將要執行的一系列動作。tasks的核心為ansible的模塊,前面已經提到模塊的用法。
tasks:包含name和要執行的模塊,name是可選的,只是為了便於用戶閱讀,不過還是建議加上去,模塊是必須的,同時也要給予模塊相應的參數。
(4)註意:shell和command模塊後面直接跟命令,而非key=value類的參數列表;
① 某任務的狀態在運行後為changed時,可通過"notify"通知給相應的handlers;
② 任務可以通過"tags"打標簽,而後可在ansible-playbook命令上使用-t 標簽名,指定進行調用;
註意:可使用setup模塊直接獲取目標主機的facters;
-e VARS, --extra-vars=VARS
- var1: value1
var2: value2
使用ansible-playbook運行playbook文件,得到如下輸出信息,輸出內容為JSON格式。並且由不同顏色組成,便於識別。一般而言
3、劇本的書寫,和執行
---
- 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 到遠程被控制的主機上;開啟服務
前提背景:如playbook 中有一系列tasks,但有時只需改動少個task 就要觸發另一個操作;若再把劇本執行一遍,浪費資源和時間;此時可以設置handlers 觸發任務
--- - 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 發生變化,
a) 變數可以不定義在playbook 中,直接在命令行給出
--- - 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
小提示:可以使用vim 中的s 替換: % s/nginx/\{\{\ servername\ \}\}/g ,可以全局把nginx替換為{{ servername }}
--- - 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
4、在劇本中加入模板 templates
Jinja2:Jinja2是python的一種模板語言,以Django的模板語言為原本
字元串:使用單引號或雙引號;
數字:整數,浮點數;
列表:[item1, item2, ...]
元組:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布爾型:true/false
算術運算:+, -, *, /, //, %, **
比較操作:==, !=, >, >=, <, <=
邏輯運算:and, or, not
cp /etc/nginx/nginx.conf /app/nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }}; #該變數是setup 模塊查看CPU核數的變數
listen {{ nginxport }}; #自定義在playbook 中的變數
--- - 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
實驗四:角色定製 roles
1、介紹
(2)定義
對於以上所有的方式有個弊端就是無法實現復用假設在同時部署Web、db、ha 時或不同伺服器組合不同的應用就需要寫多個yml文件。很難實現靈活的調用。
roles 用於層次性、結構化地組織playbook。roles 能夠根據層次型結構自動裝載變數文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變數(vars)、文件(file)、任務(tasks)、模塊(modules)及處理器(handlers)放置於單獨的目錄中,並可以便捷地include它們的一種機制。角色一般用於基於主機構建服務的場景中,但也可以是用於構建守護進程等場景中。
(2)角色集合示例:
roles/
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、實現
mkdir -pv ./{nginx,mysql,tomcat}/{files,templates,vars,tasks,handlers,meta,default}
以nginx 為例,cd /etc/ansible/roles/nginx
- 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
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 目錄下定義觸發任務
service: name=nginx state=reloade
(7)在/etc/ansible 下定義劇本playbook
- hosts: web
remote_user: root
roles:
- { role: nginx,nginxport=1234 }
ansible web -m shell -a "ss -nutl |grep 1234" 查看埠,實驗成功