1. 程式人生 > >Ansible playbook及 示例

Ansible playbook及 示例

role ins mys 其它 如果 httpd 描述 stat 通過

Ansible-playbook 介紹

Playbook 是由一個或多個 play組成的列表,主要功能是將task定義好的角色歸並為一組進行統一管理,也就是通過task調用Ansible的模板將多個play組織在一個Playbook中運行

Playbooks本身由以下各部分組成

(1) Tasks:任務,即調用模塊完成的某操作

(2) Variables:變量

(3) Templates:模板

(4) Handlers:處理器,當某條件滿足時,觸發執行的操作

(5) Roles:角色

Hosts和Uses介紹

Playbook的設計目的是為了讓某個或某些主機以某個用戶的身份去執行相應的任
務。其中用於指定要執行指定任務的主機用 hosts定義,可以是一個主機也可以是由冒

號分隔的多個主機組;用於指定被管理主機上執行任務的用戶用 remote user來定義。

- hosts: webserver               ##指定主機組,可以是一個或多個組。
  remote_user: root                ##指定遠程主機執行的用戶名

任務列表 和 action介紹

Play的主體是任務列表。任務列表中的任務按照次序逐個在hosts中指定的所有主機上執行,在順序執行這些任務時,如果發生錯誤會將所有已執行任務
回滾,因此,需要在更正 Playbook中的錯誤後重新執行這些任務
task的任務是按照指定的參數去執行模塊。每個task都使用name輸出 Playbook

的運行結果,一般輸出內容為描述該任務執行的步驟,如果沒有提供將輸出 action的
運行結果。
定義task的格式可以用 action: module options或 module: options,其中後者可以實
現向後兼容。如果 action的內容過多,可在行首使用空白字符進行換行。

示例

- hosts: abc
  remote_user: root
  tasks:
   - name: disable selinux
     command: ‘/sbin/setenforce 0‘    ##關閉selinux
   - name: make sure apache is running
     service: name=httpd state=started    ##開啟httpd服務

##play中只要執行命令的返回值不為0,就會報錯,tasks停止
加上下面這句話 可以強制執行
ignore_errors: True             ##忽略錯誤,強制返回成功

Handlers 介紹

Handlers用於當關註的資源發生變化時所采取的操作。在 notify中列出的操作便
稱為 handler,也就是在notify中需要調用 handler中定義的操作。而 notify這個動作在
每個play的最後被觸發,僅在所有的變化發生完成後一次性地執行指定操作。

示例

- hosts: abc
  remote_user: root
  tasks:
   - name: install httpd package
     yum: name=httpd state=latest    ##按照最新版本的httpd服務
   - name: install configuration file for httpd
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf   ##配置文件
     notify:
      -restart httpd    ##調用名字為 restart httpd 的handler
   - name: start httpd service
     service: enabled=true name=httpd state=started   ## 開啟httpd服務
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted

Templates介紹

Jinja是基於 Python的模板引擎。 Template類是 Jinja的另一個重要組件,可以看
作是一個編譯過的模板文件,用來產生目標文本,傳遞 Python的變量給模板去替換模
板中的標記。

示例

從被管理端復制一份httpd.conf到管理端
並做如下修改

vi templates/httpd.conf      

Listen {{http_port}}
ServerName {{server_name}}
MaxClients {{access_num}}

vi /etc/ansible/hosts
[aaa]
192.168.x.x http_port=192.168.x.x:80 access_num=100 server_name="www.aaa.com:80"
## 在hosts文件為主機配置變量

vi httpd.yml

- hosts: aaa
  remote_user: root
  vars:
    - package: httpd
    - service: httpd
  tasks:
    - name: install httpd package
      yum: name={{package}} state=latest   ##安裝最新版本的httpd
    - name: install configure file
      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf  ##使用模板並根據變量進行配置
      notify:
        - restart httpd   ##調用handler
    - name: start httpd server
      service: name={{service}} enabled=true state=started     ##開啟服務
  handlers:
    - name: restart httpd
      service: name={{service}} state=restarted

Tags 介紹

如果多次執行修改 Playbook 會涉及到一些沒有變化的代碼,可以使用tags讓 用戶選擇跳過沒有變化的代碼。只運行Playbook中發生變化的部分代碼。可以在Playbook中為某個或某些任務定義“標簽”,在執行此Playbook時通過 ansible-playbook命令 使用 --tags 選項能實現僅運行指定的tasks。

示例

vi hosts.yml

- hosts: aaa
  remote_user: root
  tasks:
    - name: Copy hosts file
      copy: src=/etc/hosts dest=/etc/hosts
      tags:
      - only
    - name: touch file
      file: path=/opt/hosts state=touch

執行命令:ansible-playbook hosts.yml --tags="only"
會只執行標簽為 only的任務

事實上,不光可以為單個或多個task指定同一個tags。playbook還提供了一個特殊的tags為always。作用就是當使用always當tags的task時,無論執行哪一個tags時,定義有always的tags都會執行。

如果在上面的yaml文件中添加
- name: touch file
      file: path=/opt/hosts state=touch
      tags:
      - always

執行命令:ansible-playbook hosts.yml --tags="only"
會將兩個task都執行

Roles 介紹

Ansible為了層次化、結構化地組織 Playbook,使用了角色( roles),可以根據層
次結構自動裝載變量文件、 tasks以及 handlers等。只需要在 Playbook中使用 include
指令即可使用 roles。簡單來講, roles就是通過分別將變量、文件、任務、模塊及處理
器設置於單獨的目錄中,便捷地使用他們。

示例

本示例為:安裝搭建LAMP架構

roles內各目錄含義解釋

files:用來存放由copy模塊或script模塊調用的文件。

templates:用來存放jinjia2模板,template模塊會自動在此目錄中尋找jinjia2模板文件。

tasks:此目錄應當包含一個main.yml文件,用於定義此角色的任務列表,此文件可以使用include包含其它的位於此目錄的task文件。

handlers:此目錄應當包含一個main.yml文件,用於定義此角色中觸發條件時執行的動作。

vars:此目錄應當包含一個main.yml文件,用於定義此角色用到的變量。

defaults:此目錄應當包含一個main.yml文件,用於為當前角色設定默認變量。

meta:此目錄應當包含一個main.yml文件,用於定義此角色的特殊設定及其依賴關系。

在每個角色命令的目錄中分別創建files、handlers、tasks、templates、meta、defaults和vars目錄,用不到的目錄可以創建為空目錄,但不可以不創建。

mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p

在每個角色的handlers、tasks、meta、defaults、vars目錄下創建main.yml文件,千萬不能自定義。

touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml

------編寫httpd模塊------

vi /etc/ansible/roles/httpd/tasks/main.yml
- name: ensure apache is at the latest version 
  yum: pkg={{ pkg }} state=latest

定義變量:可以定義在全局變量中,也可以定義在roles角色變量中,一般定義在角色變量中

vi /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd

-------編寫mysql模塊-------

vi /etc/ansible/roles/mysql/tasks/main.yml
- name: ensure mysql is at the latest version 
  yum: pkg={{ pkg }} state=latest

vi /etc/ansible/roles/mysql/vars/main.yml
pkg: mariadb*

-------編寫php模塊-----

vi /etc/ansible/roles/php/tasks/main.yml
- name: ensure php is at the latest version
  yum: pkg={{ pkg }} state=latest

vi /etc/ansible/roles/php/vars/main.yml
pkg: php*

-----編寫roles示例-----
vi /etc/ansible/lamp.yml

- hosts: aaa
  remote_user: root
  roles:
   - httpd
   - mysql
   - php

Ansible playbook及 示例