playbook簡介php
playbook是ansible用於配置、部署和管理被控節點的劇本,經過playbook的詳細描述,執行其中的一系列tasks,可讓遠程主機達到預期的狀態,playbook就像Ansible控制器給被控節點列出的一系列to-do-list,而被控節點必需要完成。css
也能夠這樣理解,pplaybook是由一個或多個"play"組成的列表。play的主要功能在於將事先歸併爲一組的主機裝扮成事先經過ansible中的task定義好的角色。從根本上來說所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中便可以讓它們聯同起來按事先編排的機制同唱一臺大戲。
其主要有如下四部分構成:html
Target section: 定義將要執行 playbook 的遠程主機組 Variable section: 定義 playbook 運行時須要使用的變量 Task section: 定義將要在遠程主機上執行的任務列表 Handler section: 定義 task 執行完成之後須要調用的任務
playbook使用場景
java
執行一些簡單的任務,使用ad-hoc命令能夠方便的解決問題,可是有時一個設施太過於複製,須要大量的操做時,執行ad-hoc命令就不太合適,這時最好使用playbook,就像執行shell命令與寫shell腳本同樣,也能夠理解爲批處理任務,不過playbook有本身的語法格式,具體能夠看下面介紹。node
使用playbook你能夠方便的重用這些代碼,能夠移值到不一樣的機器上面,像函數同樣,最大化的利用代碼。在使用ansible的過程當中,所處理的大部分操做都是須要編寫playbook的。python
YAML語法
mysql
playbook由YMAL語言編寫,YMAL參考了其餘多種語言,包括:XML、C語言、python、perl以及電子郵件格式RFC2822,Clark Evans在2001年5月在首次發表了這種語言,另外Ingy dot Net與Oren Ben-Kiki也是這種語言的共同設計者。linux
YAML介紹:YAML 語言(發音 /jml/ )的設計目標,就是方便人類讀寫。它實質上是一種通用的數據串行化格式。YAML Ain't Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思實際上是:「Yet Another Markup Language"(還是一種標記語言)。其特性:nginx
YAML的可讀性好 YAML和腳本語言的交互性好 YAML使用實現語言的數據類型 YAML有一個一致的信息模型 YAML易於實現 YAML能夠基於流來處理 YAML表達能力強擴展性好
經常使用數據結構web
它的基本語法規則以下。
大小寫敏感
使用縮進表示層級關係
縮進時不容許使用Tab鍵,只容許使用空格。
縮進的空格數目不重要,只要相同層級的元素左側對齊便可
yaml文件第一行必需要「---」做爲文檔的開始
#
表示註釋,從這個字符一直到行尾,都會被解析器忽略。
YAML 支持的數據結構有三種。
對象:鍵值對的集合,又稱爲映射(mapping)/ 哈希(hashes) / 字典(dictionary)
數組:一組按次序排列的值,又稱爲序列(sequence) / 列表(list)
純量(scalars):單個的、不可再分的值
YAML語法
YAML的語法和其餘高階語言相似而且能夠簡單表達清單、散列表、標量等數據結構。其結構Structure經過空格來展現序列Sequence裏的項用
"-"
來表明
Map裏的鍵值對用
":"
分隔。YAML文件擴展名一般爲.yaml或者.yml。下面是一個示例。
name: John Smith age: 41 gender: Male spouse: name: Jane Smith age: 37 gender: Female children: - name: Jimmy Smith age: 17 gender: Male - name: Jenny Smith age 13 gender: Female
YAML 2 個重要的結構組成部分list和directory
列表和字典
################################# list 列表的全部元素均使用「-」打頭例如 # A list of tasty fruits - Apple - Orange - Strawberry - Mango ##############################dictionary 字典經過key與valuef進行標識例如 --- # An employee record name: Example Developer job: Developer skill: Elite 也能夠將key:value放置於{}中進行表示例如 --- # An employee record {name: Example Developer, job: Developer, skill: Elite} 多個映射關係組成一個字典一個列表能夠包含多個字典。
################################## 變量命名 變量名僅能由字母、數字和下劃線組成且只能以字母開頭。 ################################## facts facts是由正在通訊的遠程目標主機發回的信息這些信息被保存在ansible變量中。要獲取指定的遠程主機所支持的全部facts可以使用以下命令進行 # ansible hostname -m setup 這個命令能夠得到被監控端主機的各類信息將這些信息獲得後保存到變量中。 ################################ 自定義變量 在 yaml 中可使用vars關鍵字來定義變量 vars: var_name: value ############################# 變量的引用 {{ var_name }} ########################### 特殊的變量迭代 當有須要重複性執行的任務時可使用迭代機制。其使用格式爲將須要迭代的內容定義爲item變量引用並經過with_items語句來指明迭代的元素列表便可。 #######################################示例 例如在被控端添加 2 個用戶 方式1通常作法 - name: add user testuser1 user: name=testuser1 state=present groups=wheel - name: add user testuser2 user: name=testuser2 state=present groups=wheel 方式2使用變量方式 - name: add several users vars: user1: testuser1 user2: testuser2 user: name={{ user1 }} state=present groups=wheel user: name={{ user2 }} state=present groups=wheel 方式3使用迭代方式 - name: add several users user: name={{ item }} state=present groups=wheel with_items: - testuser1 - testuser2 事實上with_items中可使用元素還可爲hashes例如 - name: add several users user: name={{ item.name }} state=present groups={{ item.groups }} with_items: - { name: 'testuser1', groups: 'wheel' } - { name: 'testuser2', groups: 'root' }
對於需反覆執行的、較爲複雜的任務,咱們能夠經過定義 Playbook 來搞定。Playbook 是 Ansible 真正強大的地方,它容許使用變量、條件、循環、以及模板,也能經過角色 及包含指令來重用既有內容。
playbook基礎組件
hosts:playbook中的每個play的目的都是爲了讓某個或某些以某個指定用戶的身份執行任務。 hosts用於指定要執行指定任務的主機,其能夠是一個或多個由冒號分隔主機組。 user:remote_user則用於指定遠程主機上的執行任務的用戶。 任務列表:play的主體部分是task list. task list中的各任務按次序逐個在hosts中指定的全部主機 上執行,即在全部主機上完成第一個任務後再開始第二個。 action:任務執行過程 handlers:用於當前關注的資源發生變化時採起必定指定的操做
Usage: ansible-playbook playbook.yml
相對於ansible,增長了下列選項:
參數 | 說明 |
---|---|
--flush-cache | 清除fact緩存 |
--force-handlers | 若是任務失敗,也要運行handlers |
--list-tags | 列出全部可用的標籤 |
--list-tasks | 列出將要執行的全部任務 |
--skip-tags=SKIP_TAGS | 跳過運行標記此標籤的任務 |
--start-at-task=START_AT_TASK | 在此任務處開始運行 |
--step | 一步一步:在運行以前確認每一個任務 |
-t TAGS, --tags=TAGS | 只運行標記此標籤的任務 |
示例:
ansible-playbook -i hosts ssh-addkey.yml # 指定主機清單文件 ansible-playbook -i hosts ssh-addkey.yml --list-tags # 列出tags ansible-playbook -i hosts ssh-addkey.yml -T install # 執行install標籤的任務
playbook語法介紹
核心元素: hosts:運行指定任務的目標主機; remote_user:在遠程主機以哪一個用戶身份執行; tasks:任務,由模塊定義的操做的列表; Templates:模板,即便用了模板語法的文本文件; Variables:變量 handlers:由特定條件觸發的Tasks; Roles:角色; playbook的基礎組件: hosts: 運行指定任務的目標主機 remote_user:在遠程主機以哪一個用戶身份執行; sudo_user:非管理員須要擁有sudo權限; tasks:任務列表 模塊,模塊參數,格式有以下兩種: (1) action: module arguments (2) module: arguments 示例1: - hosts: all remote_user: root tasks: - name: install a group group: name=mygrp system=true - name: install a user user: name=user1 group=mygrp system=true 示例2: - hosts: websrvs remote_user: root tasks: - name: install httpd package yum: name=httpd - name: start httpd service service: name=httpd state=started
主要由三個部分組成。
hosts部分:使用hosts指示使用哪一個主機或主機組來運行下面的tasks,每一個playbook都必須指定hosts,hosts也可使用通配符格式。主機或主機組在inventory清單中指定,可使用系統默認的/etc/ansible/hosts,也能夠本身編輯,在運行的時候加上-i選項,指定清單的位置便可。在運行清單文件的時候,--list-hosts選項會顯示那些主機將會參與執行task的過程當中。
remote_user:指定遠端主機中的哪一個用戶來登陸遠端系統,在遠端系統執行task的用戶,能夠任意指定,也可使用sudo,可是用戶必需要有執行相應task的權限。
tasks:指定遠端主機將要執行的一系列動做。tasks的核心爲ansible的模塊,前面已經提到模塊的用法。tasks包含name和要執行的模塊,name是可選的,只是爲了便於用戶閱讀,不過仍是建議加上去,模塊是必須的,同時也要給予模塊相應的參數。
playbooks組成:
Target section: 定義將要執行 playbook 的遠程主機組 Variable section: 定義 playbook 運行時須要使用的變量 Task section: 定義將要在遠程主機上執行的任務列表 Handler section: 定義 task 執行完成之後須要調用的任務
而其對應的目錄層有五個
通常所需的目錄層有:(視狀況可變化)
vars 變量層 tasks 任務層 handlers 觸發條件 files 文件 template 模板
playbook中的每個play的目的都是爲了讓某個或某些主機以某個指定的用戶身份執行任務。
hosts:用於指定要執行指定任務的主機其能夠是一個或多個由冒號分隔主機組。
remote_user :用於指定遠程主機上的執行任務的用戶。不過remote_user也可用於各task中。也能夠經過指定其經過sudo的方式在遠程主機上執行任務其可用於play全局或某任務。此外甚至能夠在sudo時使用sudo_user指定sudo時切換的用戶。
user:於remote_user相同
sudo:若是設置爲yes,執行該任務組的用戶在執行任務的時候,獲取root權限
sudo_user:若是設置user爲breeze,sudo爲yes,sudo_user爲bernie時,則breeze用戶在執行任務時會得到bernie用戶的權限
connection:經過什麼方式鏈接到遠程主機,默認爲ssh
gather_facts:除非明確說明不須要在遠程主機上執行setup模塊,不然默認自動執行。若是確實不須要setup模塊傳遞過來的變量,則能夠將該選項設置爲False
play的主體部分是任務列表。
任務列表中的各任務按次序逐個在hosts中指定的全部主機上執行即在全部主機上完成第一個任務後再開始第二個。在自上而下運行某playbook時若是中途發生錯誤,全部已執行任務都將回滾所以在更正playbook後從新執行一次便可。
task的目的是使用指定的參數執行模塊,而在模塊參數中可使用變量。模塊執行是冪等的,這意味着屢次執行是安全的,由於其結果均一致。每一個task都應該有其name用於 playbook的執行結果輸出,建議其內容儘量清晰地描述任務執行步驟。若是未提供name則action的結果將用於輸出。
定義task的可使用"action: module options"或"module: options"的格式,推薦使用後者以實現向後兼容。若是action一行的內容過多也可以使用在行首使用幾個空白字符進行換行。
用於當關注的資源發生變化時採起必定的操做。
"notify"這個action可用於在每一個play的最後被觸發,這樣能夠避免屢次有改變發生時每次都執行指定的操做,取而代之僅在全部的變化發生完成後一次性地執行指定操做。
在notify中列出的操做稱爲handler也即notify中調用handler中定義的操做。
注意:在notify中定義內容必定要和tasks中定義的 - name 內容同樣,這樣才能達到觸發的效果,不然會不生效。
tags用於讓用戶選擇運行或略過playbook中的部分代碼。ansible具備冪等性,所以會自動跳過沒有變化的部分,即使如此,有些代碼爲測試其確實沒有發生變化的時間依然會很是地長。此時若是確信其沒有變化就能夠經過tags跳過這些代碼片段。
使用ansible-playbook運行playbook文件,獲得以下輸出信息,輸出內容爲JSON格式。而且由不一樣顏色組成,便於識別。通常而言
綠色表明執行成功,系統保持原樣
×××表明系統表明系統狀態發生改變
紅色表明執行失敗,顯示錯誤輸出。
實例:
--- - hosts: all sudo: yes tasks: - name: 安裝Apache yum: name={{ item }} state=present with_items: - httpd - httpd-devel - name: 複製配置文件 copy: src: "{{ item.src }}" dest: "{{ item.dest }}" owner: root group: root mode: 0644 with_items: - { src: "/tmp/httpd.conf", dest: "/etc/httpd/conf/httpd.conf" } - { src: "/tmp/httpd-vhosts.conf", dest: "/etc/httpd/conf/httpd-vhosts.conf" } - name: 檢查Apache運行狀態,並設置開機啓動 service: name=httpd state=started enabled=yes
如今咱們已經對playbook有了一個大概的瞭解,接一下,讓咱們詳細解剖一下上面的playbook都作了是什麼以及怎麼工做的。
1 第一行,「---」,這個是YAML語法中註釋的用法,就像shell腳本中的「#」號同樣
2 第二行,「- hosts: all」,告訴ansible具體要在哪些主機上運行個人劇本(playbook),在本例中是all,即全部主機
3 第三行,「sudo: yes」,告訴ansible經過sudo來運行相應命令,這樣全部命令將會以root身份執行
4 第四行,「tasks:」,指定一系列將要運行的任務
每個任務(play)以「- name: 安裝Apache」開頭。 「- name:」字段並非一個模塊,不會執行任務實質性的操做,它只是給「task」 一個易於識別和名稱。 即使把name字段對應的行徹底刪除,也不會有任何問題。 本例中咱們使用yum模塊來安裝Apache,替代了「yum -y install httpd httpd-devel」 在每個play當中,均可以例用 with_items 來定義變量,並經過「{{ 變量名 }}」的形式來直接使用使用yum模塊的state=present選項來確保軟件被安裝,或者使用state=absent來確保軟件被刪除 第二個任務(play)一樣是「- name」字符開頭 咱們使用copy模塊來將「src」定義的源文件(必須是ansible所在服務器上的本地文件 )複製到「dest」定義的目的地址(此地址爲遠程主機的上地址)去,在傳遞文件的同時,還定義了文件的屬主,屬組和權限 這個play中,咱們用數組的形式給變量賦值,使用{var1: value, var2: value} 的格式來賦值,變量的個數能夠任意多,不一樣變量間以逗號分隔,使用{{item.var1 }}的形式來調用變量,本例中爲:{{ item.src }}
第三個任務(play)使用了一樣的結構,調用了service模塊,以保證服務的正常開啓。
執行playbook文件
運行playbook,使用ansible-playbook命令 (1) 檢測語法 ansible-playbook --syntax-check /path/to/playbook.yaml (2) 測試運行 ansible-playbook -C /path/to/playbook.yaml --list-hosts # 列出主機 --list-tasks # 列出任務 --list-tags # 列出標籤 (3) 運行 ansible-playbook /path/to/playbook.yaml -t TAGS, --tags=TAGS --skip-tags=SKIP_TAGS --start-at-task=START_AT
在執行playbook前,能夠作些檢查 檢查palybook語法 ansible-playbook -i hosts httpd.yml --syntax-check 列出要執行的主機 ansible-playbook -i hosts httpd.yml --list-hosts 列出要執行的任務 ansible-playbook -i hosts httpd.yml --list-tasks
檢查語法:ansible-playbook --syntax-check playbook.yml 查看host列表:ansible-playbook --list-hosts playbook.yml 查看task列表:ansible-playbook --list-tasks playbook.yml 檢查模式(不會運行): ansible-playbook --check playbook.yml diff模式(查看文件變化): ansible-playbook --check --diff playbook.yml 從指定的task開始運行:ansible-playbook --start-at-task="install packages" playbook.yml 逐個task運行,運行前須要你確認:ansible-playbook --step playbook.yml 指定tags:ansible-playbook --tags=foo,bar playbook.yml 跳過tags:ansible-playbook --skip-tags=baz,quux playbook.yml
[root@John ~]# cat web.yml - hosts: webservers ##主機組,在/etc/ansible/hosts中定義 remote_user: root ##遠程執行任務的用戶 tasks: ##任務 - name: install httpd ##任務描述 command: yum -y install httpd ##調用ansible的command模塊安裝httpd - name: provide httpd.conf ##任務描述 copy: src="/root/httpd.conf" dest="/etc/httpd/conf/httpd.conf" ##調用ansible的copy模塊,httpd安裝完成後將事先準備好的httpd.conf文件複製到目標主機的/etc/httpd/conf/目錄下 tags: conf ##給此任務打標記,可單獨執行標記的任務,使用ansible-playbook -C 命令執行 notify: ##文件內容變動通知 - server restart ##通知到指定的任務 - name: server start ##任務描述 service: name=httpd state=started enabled=true ##調用ansible的service模塊的屬性定義安裝完成httpd之後httpd服務的管理 handlers: ##定義接受關注的資源變化後執行的動做 - name: server restart ##任務描述 service: name=httpd state=restarted ##當關注的資源發生變化後調用service模塊,採起相應的動做 ##執行過程以下: [root@mail ~]# ansible-playbook web.yml PLAY [webservers] ************************************************************* GATHERING FACTS *************************************************************** ok: [node2] ok: [node1] TASK: [install httpd] ********************************************************* changed: [node2] changed: [node1] TASK: [provide httpd.conf] **************************************************** changed: [node2] changed: [node1] TASK: [server start] ********************************************************** changed: [node2] changed: [node1] NOTIFIED: [server restart] **************************************************** changed: [node2] changed: [node1] PLAY RECAP ******************************************************************** node1 : ok=5 changed=4 unreachable=0 failed=0 node2 : ok=5 changed=4 unreachable=0 failed=0
任務列表和action
play的主體部分是task list。task list中的各任務按次序逐個在hosts中指定的全部主機上執行即在全部主機上完成第一個任務後再開始第二個。 在運行自下而下某playbook時若是中途發生錯誤全部已執行任務都將回滾所以在更正playbook後從新執行一次便可。 task的目的是使用指定的參數執行模塊而在模塊參數中可使用變量。模塊執行是冪等的這意味着屢次執行是安全的由於其結果均一致。 每一個task都應該有其name用於playbook的執行結果輸出建議其內容儘量清晰地描述任務執行步驟。若是未提供name則action的結果將用於輸出。 定義task的可使用「action: module options」或「module: options」的格式推薦使用後者以實現向後兼容。 若是action一行的內容過多也中使用在行首使用幾個空白字符進行換行。 tasks: - name: make sure apache is running service: name=httpd state=running 在衆多模塊中只有command和shell模塊僅須要給定一個列表而無需使用「key=value」格式例如 tasks: - name: disable selinux command: /sbin/setenforce 0 若是命令或腳本的退出碼不爲零可使用以下方式替代 tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true 或者使用ignore_errors來忽略錯誤信息 tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: True
handlers的用法
用於當關注的資源發生變化時採起必定的操做。 「notify」這個action可用於在每一個play的最後被觸發這樣能夠避免屢次有改變發生時每次都執行指定的操做取而代之僅在全部的變化發生完成後一次性地執行指定操做。在notify中列出的操做稱爲handler也即notify中調用handler中定義的操做。 handlers:由特定條件觸發的Tasks; 調用及定義方式: tasks: - name: TASK_NAME module: arguments notify: HANDLER_NAME handlers: - name: HANDLER_NAME module: arguments 示例: - hosts: websrvs remote_user: root tasks: - name: install httpd package yum: name=httpd state=latest - name: install conf file copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: restart httpd service - name: start httpd service service: name=httpd state=started handlers: - name: restart httpd service service: name=httpd state=restarted
tags用於讓用戶選擇運行或路過playbook中的部分代碼。ansible具備冪等性所以會自動跳過沒有變化的部分即使如此有些代碼爲測試其確實沒有發生變化的時間依然會很是地長。此時若是確信其沒有變化就能夠經過tags跳過此些代碼片段。 示例基於playbooks實現web服務的部署 一、提供好Inventory文件 # /etc/ansible/hosts基於祕鑰認證 [webhosts] 172.16.10.22 172.16.10.33 二、編輯 palybooks 劇本 # vim /root/web.yaml - name: web service remote_user: root hosts: webhosts vars: packages: httpd tasks: - name: install httpd yum: name={{ packages }} state=present tags: install - name: configuration httpd copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf tags: conf notify: - restart httpd - name: service httpd start service: name=httpd enabled=no state=started tags: start - name: add centos and hadoop user user: name={{ item }} state=absent tags: adduser with_items: - centos - hadoop handlers: - name: restart httpd service: name=httpd state=restarted 三、準備好配置文件 將web的配置放到指定目錄 src=/root/httpd.conf 四、開始部署 ansible-playbooks /root/web.yml
#建立role的步驟 (1) 建立以roles命名的目錄; (2) 在roles目錄中分別建立以各角色名稱命名的目錄,如webservers等; (3) 在每一個角色命名的目錄中分別建立files、handlers、meta、tasks、templates和vars目錄;用不 到的目錄能夠建立爲空目錄,也能夠不建立; (4) 在playbook文件中,調用各角色; #role內各目錄中可用的文件 tasks目錄:至少應該包含一個名爲main.yml的文件,其定義了此角色的任務列表;此文件可使用in clude包含其它的位於此目錄中的task文件; files目錄:存放由copy或script等模塊調用的文件; templates目錄:template模塊會自動在此目錄中尋找Jinja2模板文件; handlers目錄:此目錄中應當包含一個main.yml文件,用於定義此角色用到的各handler;在handler 中使用include包含的其它的handler文件也應該位於此目錄中; vars目錄:應當包含一個main.yml文件,用於定義此角色用到的變量; meta目錄:應當包含一個main.yml文件,用於定義此角色的特殊設定及其依賴關係; default目錄:爲當前角色設定默認變量時使用此目錄;應當包含一個main.yml文件;
若是區分環境使用角色,可使用下列文檔結構
role下有不少結構,ansible會自動按照文件結構進行加載解析。具體目錄結構以下:
. ├── defaults ├── files ├── handlers ├── meta ├── tasks ├── templates └── vars
若是roles/x/tasks/main.yml
存在,則自動將裏面的tasks添加到play中。
若是roles/x/handlers/main.yml
存在,則自動將裏面的handlers添加到play中。
若是roles/x/vars/main.yml
存在, 則自動將其中的variables添加到play中。
若是roles/x/meta/main.yml
存在,則添加role的依賴關係roles中。
任何copy
任務、script
任務均可以引用roles/x/files
中的文件,不管是使用絕對或相對路徑均可以。
任何template
任務均可以引用roles/x/templates
中的文件,不管絕對或相對路徑。
任何include
任務均可以引用roles/x/tasks/
中的文件,不管相對或絕對路徑
控制端: 172.16.10.9 server.magedu.com 被控制端: 172.16.10.22 node2.example.com 172.16.10.33 node3.example.com 172.16.0.50 director1.example.com 172.16.0.51 director2.example.com 計劃: 172.16.10.22 node2.example.com 172.16.10.33 node3.example.com # 安裝 web php程序,並提供配置文件 172.16.0.50 director1.example.com 172.16.0.51 director2.example.com # 安裝 mysql mysql-server,並提供配置文件 要求:基於主機名通訊(被控制端均可以解析到其餘的主機名)
一、配置好 Inventory 文件 # /etc/ansible/hosts [webhosts] node2.example.com node3.example.com [mysql] director1.example.com director2.example.com 二、建立對應的目錄樹 # 執行 tree /root/lamp/roles 查看目錄樹 /root/lamp/roles |-- common | |-- default | |-- files | | `-- hosts | |-- handlers | |-- meta | |-- tasks | | `-- main.yml | |-- templates | `-- vars |-- db | |-- default | |-- files | | `-- my.cnf | |-- handlers | | `-- main.yml | |-- meta | |-- tasks | | `-- main.yml | |-- templates | `-- vars |-- db.yml |-- php | |-- default | |-- files | | `-- php.ini | |-- handlers | |-- meta | |-- tasks | | `-- main.yml | |-- templates | `-- vars |-- site.yml |-- web | |-- default | |-- files | | `-- httpd.conf | |-- handlers | | `-- main.yml | |-- meta | |-- tasks | | `-- main.yml | |-- templates | `-- vars `-- web.yml 三、各個文件的內容 # 當前所在目錄 /root/lamp/roles # cat db.yml - name: mysqld servise remote_user: root hosts: mysql roles: - common - db # cat web.yml - name: wed servise remote_user: root hosts: webhosts roles: - common - php - web # cat common/files/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.10.22 node2.example.com 172.16.10.33 node3.example.com 172.16.0.50 director1.example.com 172.16.0.51 director2.example.com # cat common/tasks/main.yml - name: Configure hostname resolve copy: src=hosts dest=/etc/hosts # cat php/tasks/main.yml - name: install php yum: name=php state=present - name: configuration php copy: src=php.ini dest=/etc/php.ini # cat web/tasks/main.yml - name: install httpd yum: name=httpd state=present - name: configuration httpd copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf notify: - restart httpd - name: service httpd start service: name=httpd enabled=no state=started # cat web/handlers/main.yml - name: restart httpd service: name=httpd state=restarted # cat db/tasks/main.yml - name: install mysql yum: name=mysql state=present - name: install mysql-server yum: name=mysql-server state=present - name: configuration mysqld copy: src=my.cnf dest=/etc/my.cnf notify: - restart mysqld - name: service mysqld start service: name=mysqld enabled=no state=started # cat db/handlers/main.yml - name: restart mysqld service: name=mysqld state=restarted 四、開始批量部署 ansible-playbooks web.yml ansible-playbooks db.yml
ansible的roles配置nginx
一、準備目錄 # mkdir -pv playbook/roles/nginx/{default,files,handlers,meta,tasks,templates,vars} 二、準備nginx的配置文件 # cd roles/nginx/templates # ansible all -m setup |grep ansible_processor_cores "ansible_processor_cores": 1, \\獲取ansible的要調用的相關函數 "ansible_processor_cores": 1, \\獲取ansible的要調用的相關函數 # vim nginx.conf worker_processes {{ ansible_processor_cores }}; \\調用獲取到的函數 三、準備Nginx的default.conf文件及rpm包 # ll nginx/files/ -rw-r--r-- 1 root root 2685 Jan 18 15:51 default.conf -rw-r--r-- 1 root root 319456 Jan 18 15:52 nginx-1.4.7-1.el6.ngx.x86_64.rpm 四、在tasks目錄中配置任務列表 # cd nginx/tasks/ # vim main.yml - name: copy nginx.rpm copy: src=nginx-1.4.7-1.el6.ngx.x86_64.rpm dest=/tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm - name: install nginx shell: yum -y install /tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm - name: provides nginx.conf template: src=nginx.conf dest=/etc/nginx/nginx.conf tags: nginxconf notify: - server restart - name: provides default.conf copy: src=default.conf dest=/etc/nginx/conf.d/default.conf tags: nginxconf - name: server start service: name=nginx enabled=true state=started 五、在handlers目錄中配置定義handler信息 # cd nginx/handlers/ # vim main.yml - name: server restart service: name=nginx state=restarted 六、在roles同一級目錄中建立site.yml文件 - hosts: webservers remote_user: root roles: - nginx 七、應用配置 # ansible-playbook site.yml PLAY [webservers] ************************************************************* GATHERING FACTS *************************************************************** ok: [node2] ok: [node1] TASK: [nginx | copy nginx.rpm] ************************************************ ok: [node1] ok: [node2] TASK: [nginx | install nginx] ************************************************* changed: [node1] changed: [node2] TASK: [nginx | provides nginx.conf] ******************************************* changed: [node2] changed: [node1] TASK: [nginx | provides default.conf] ***************************************** changed: [node2] changed: [node1] TASK: [nginx | server start] ************************************************** changed: [node2] changed: [node1] NOTIFIED: [nginx | server restart] ******************************************** changed: [node1] changed: [node2] PLAY RECAP ******************************************************************** node1 : ok=7 changed=5 unreachable=0 failed=0 node2 : ok=7 changed=5 unreachable=0 failed=0 八、查看webservers主機上是否已經啓動nginx # ansible webservers -m shell -a 'netstat -tnlp' node2 | success | rc=0 >> Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5497/nginx tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1174/sshd tcp 0 0 :::22 :::* LISTEN 1174/sshd node1 | success | rc=0 >> Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5513/nginx tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1174/sshd tcp 0 0 :::22 :::* LISTEN 1174/sshd 九、查看playbook目錄整體結構: # tree playbook/ playbook/ ├── roles │ └── nginx │ ├── default │ ├── files │ │ ├── default.conf │ │ └── nginx-1.4.7-1.el6.ngx.x86_64.rpm │ ├── handlers │ │ └── main.yml │ ├── meta │ ├── tasks │ │ └── main.yml │ ├── templates │ │ └── nginx.conf │ └── vars └── site.yml
Playbooks 採用YMAL 語法結構,基本的YMAL 語法請參考
http://docs.ansible.com/YAMLSyntax.html
python利用pyyaml模塊進行解析yaml語言
http://pyyaml.org/wiki/PyYAMLDocumentation
yaml格式在線檢查
http://yaml-online-parser.appspot.com/