ansible高級應用

上一篇博客介紹了ansible的基礎應用Modules,博客地址 http://www.www58058.com/14860 。這次介紹下Ansible的另一個核心模塊Playbooks。

 

Ansible的核心模塊:

    Ansible core:            核心;

    core Modules:          包括 Ansible 自帶的核心模塊及自定義模塊;

    connect Plugins:       完成模塊功能的補充,包括連接插件、郵件插件等;

    Playbooks:       網上很多翻譯為劇本,個人覺得理解為編排更為合理;定義 Ansible 多任務配置文件,由 Ansible 自動執行;

    host Inventory:         定義 Ansible 管理主機的清單、主機池、主機列表;

 

        Playbook是由一個或多個“play”組成的列表。play的主要功能在于將事先歸并為一組的主機裝扮成事先通過ansible中的task定義好的角色。
從根本上來講,所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中,即可以讓它們聯同起來按事先編排的機制同唱一臺大戲。

        ansinbl使用 Python paramiko 開發,分布式,無需客戶端,輕量級,配置語法使用 YMAL 及 Jinja2模板語言,更強的遠程命令執行操作。

 

YAML介紹:

        YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種語言,另外Ingy d?t Net與Oren Ben-Kiki也是這語言的共同設計者。

YAML Ain't Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)。其特性:

 YAML的可讀性好
 YAML和腳本語言的交互性好
 YAML使用實現語言的數據類型
 YAML有一個一致的信息模型
 YAML易于實現
 YAML可以基于流來處理
 YAML表達能力強,擴展性好

更多的內容及規范參見http://www.yaml.org。

 

1、YAML語法:

        YAML的語法和其他高階語言類似,并且可以簡單表達清單、散列表、標量等數據結構。其結構(Structure)通過空格來展示,序列(Sequence)里的項用"-"來代表,Map里的鍵值對用":"分隔。

Playbook組成結構:
 Inventory
 Modules
 Ad Hoc Commands
 Playbooks
  Tasks:任務,即調用模塊完成的操作
  Variables:變量
  Templates:模板
  Handlers:處理器,由某個條件觸發執行的操作
  Roles:角色
基本結構:
 – host:webservices
  remote_user:
  – tasks:
   – task1
    module_name

YAML文件擴展名通常為.yml,如test.yml。

2、使用yaml模板文件安裝httpd、提供其配置文件、配置開機啟動并啟動服務:

[root@master ansible]# vim apache.yml
– hosts: webserver
  remote_user: root
  tasks:
  – name: install httpd package
    yum: name=httpd state=latest
  – name: install configuration file for httpd
    copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
  – name: start httpd service
    service: enabled=true name=httpd state=started

    apache-yml.jpg

    apache-yml-client.jpg

 

3、YAML語言變量:

 變量命名:變量名僅能由字母、數字和下劃線組成,且只能以字母開頭。

 facts變量:

    facts是由正在通信的遠程目標主機發回的信息,這些信息被保存在ansible變量中。要獲取指定的遠程主機所支持的所有facts,可使用如下命令進行:

            ansible hostname -m setup

             register

把任務的輸出定義為變量,然后用于其他任務,示例如下:

  tasks:
     – shell: /usr/bin/foo
       register: foo_result
       ignore_errors: True

通過命令行傳遞變量:

    在運行playbook的時候也可以傳遞一些變量供playbook使用,示例如下:

     ansible-playbook test.yml –extra-vars "hosts=webserver user=node1"

通過roles傳遞變量:

    當給一個主機應用角色的時候可以傳遞變量,然后在角色內使用這些變量,示例如下:

     – hosts: webservers
       roles:
     – common
     – { role: foo_app_instance, dir: '/web/htdocs/a.com',  port: 8080 }

Inventory:

    ansible的主要功用在于批量主機操作,為了便捷地使用其中的部分主機,可以在inventory file中將其分組命名。默認的inventory file為/etc/ansible/hosts。

    inventory file可以有多個,且也可以通過Dynamic Inventory來動態生成。

     inventory文件格式:

        inventory文件遵循INI文件風格,中括號中的字符為組名??梢詫⑼粋€主機同時歸并到多個不同的組中;此外,當如若目標主機使用了非默認的SSH端口,還可以在主機名稱之后使用冒號加端口號來標明。

 test.ansible.com

 [webservers]
 www1.mageedu.com:2222
 www2.mageedu.com

 [dbservers]
 db1.mageedu.com
 db2.mageedu.com
 db3.mageedu.com

如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機,例如:

[webservers]
www[01:50].example.com

[databases]
db-[a:f].example.com

主機變量:可以在inventory中定義主機時為其添加主機變量以便于在playbook中使用。例如:

[webservers]
www1.mageedu.com http_port=80 maxRequestsPerChild=808
www2.mageeducom http_port=8080 maxRequestsPerChild=909

組變量:組變量是指賦予給指定組內所有主機上的在playboo中可用的變量。例如:

[webservers]
www1.mageedu.com
www2.mageedu.com

[webservers:vars]
ntp_server=ntp.mageedu.com
nfs_server=nfs.mageedu.com

 

4、使用變量、模板文件安裝配置apache:

    apache-template.jpg

    var-apache.jpg

 5、條件測試:

    如果需要根據變量、facts或此前任務的執行結果來做為某task執行與否的前提時要用到條件測試。

    when語句

在task后添加when子句即可使用條件測試;when語句支持Jinja2表達式語法。例如:

tasks:
  – name: "shutdown Debian flavored systems"
    command: /sbin/shutdown -h now
    when: ansible_os_family == "Debian"

when語句中還可以使用Jinja2的大多“filter”,例如要忽略此前某語句的錯誤并基于其結果(failed或者sucess)運行后面指定的語句,可使用類似如下形式:

tasks:
  – command: /bin/false
    register: result
    ignore_errors: True
  – command: /bin/something
    when: result|failed
  – command: /bin/something_else
    when: result|success
  – command: /bin/still/something_else
    when: result|skipped

此外,when語句中還可以使用facts或playbook中定義的變量。

6、迭代:

        當有需要重復性執行的任務時,可以使用迭代機制。其使用格式為將需要迭代的內容定義為item變量引用,并通過with_items語句來指明迭代的元素列表即可。例如:

調用:item
定義循環列表:whit_item
 – apache
 – php
 – mysql-server
注意:whit_items中的列表值也可以是字典,但引用是要使用item_KEY
 – {name: apache,conf: confffiles/httpd.conf}
 – {name: php,conf:conffiles/php.ini}
 – {name: mysql-servce,conf/conffiles/my.cnf}
 
– name: add several users
  user: name={{ item }} state=present groups=wheel
  with_items:
     – testuser1
     – testuser2

上面語句的功能等同于下面的語句:

– name: add user testuser1
  user: name=testuser1 state=present groups=wheel
– name: add user testuser2
  user: name=testuser2 state=present groups=wheel

事實上,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' }

ansible的循環機制還有更多的高級功能,具體請參見官方文檔(http://docs.ansible.com/playbooks_loops.html)。

 

7、tags:

        tags用于讓用戶選擇運行或路過playbook中的部分代碼。ansible具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼為測試其確實沒有發生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷。

在playbook可以為某個或默寫任務定義一個“標簽”,在執行此playbook時,通過為ansible-playbook命令,使用–tags選項能實現僅運行指定的tasks而非所有:
 [root@master ansible]# vim targ.yml
– hosts: webserver
  remote_user: root
  vars:
  – package: httpd
  – service: httpd
  tasks:
  – name: install httpd package
    yum: name={{ package }} state=latest
  – name: install configuration file for httpd
    template: src=/etc/ansible/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    tags:
    – conf
    notify:
        – restart httpd
  – name: start httpd service
    service: enabled=true name={{ service }} state=started
  handlers:
  – name: restart httpd
    service: name=httpd state=restarted
~                                       
ansible-playbook targ.yml –tags="conf"

特殊tags:always 無論無可都運行

8、roles:

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

 

 創建role的步驟:

 (1) 創建以roles命名的目錄;
 (2) 在roles目錄中分別創建以各角色名稱命名的目錄,如webservers等;
 (3) 在每個角色命名的目錄中分別創建files、handlers、meta、tasks、templates和vars目錄;用不到的目錄可以創建為空目錄,也可以不創建;
 (4) 在playbook文件中,調用各角色;

8.2 role內各目錄中可用的文件

 tasks目錄:至少應該包含一個名為main.yml的文件,其定義了此角色的任務列表;此文件可以使用include包含其它的位于此目錄中的task文件;
 files目錄:存放由copy或script等模塊調用的文件;
 templates目錄:template模塊會自動在此目錄中尋找Jinja2模板文件;
 handlers目錄:此目錄中應當包含一個main.yml文件,用于定義此角色用到的各handler;在handler中使用include包含的其它的handler文件也應該位于此目錄中;
 vars目錄:應當包含一個main.yml文件,用于定義此角色用到的變量;
 meta目錄:應當包含一個main.yml文件,用于定義此角色的特殊設定及其依賴關系;ansible 1.3及其以后的版本才支持;
 default目錄:為當前角色設定默認變量時使用此目錄;應當包含一個main.yml文件;

 

9、使用roles角色分離task、files、handlers文件

    a、創建roles目錄:

                            mkdir -pv /etc/ansible/ansible_playbooks/roles/websrvs{tasks,files,templates,meta,handlers,vars}

    b、提供配置文件:(也可以使用模板文件)

                           cp /etc/httpd/conf/httpd.conf  /etc/ansible/ansible_playbooks/roles/websrvs/files

            8080.jpg

    c、編輯task任務文件格式為main.yml

            roles-task.jpg

    d、編輯handlers通知文件格式為main.yml

           handler.jpg

   e、編輯站點site.yml文件調用roles角色的websrvs

           roles-site.png

    f、基于roles角色運行site.yml

          roles-site1.png

  g、測試客戶端:

        start-httpd-roles.png

 

 

                                                                                                                                                    感謝馬哥,每天進步一點點! 

原創文章,作者:n18-jude,如若轉載,請注明出處:http://www.www58058.com/14869

(0)
n18-juden18-jude
上一篇 2016-04-18
下一篇 2016-04-19

相關推薦

  • (總結)MySQL自帶的性能壓力測試工具mysqlslap詳解

    PS:今天一同事問我有木有比較靠譜的mysql壓力測試工具可用。其實mysql自帶就有一個叫mysqlslap的壓力測試工具,還是模擬的不錯的。下面舉例說說。mysqlslap是從5.1.4版開始的一個MySQL官方提供的壓力測試工具。通過模擬多個并發客戶端訪問MySQL來執行壓力測試,同時詳細的提供了“高負荷攻擊MySQL”的數據性能報告。并且能很好的對比…

    Linux干貨 2015-02-10
  • 1019作業

    1019作業 柴震 軟連接 硬連接 軟連接和硬鏈接的區別 屬性與定義: 硬鏈接:新建的文件是已經存在的文件的一個別名,所以創建時鏈接數遞增;而且當原文件刪除時,新建的鏈接文件仍然可以使用,因其直接對應于數據塊。 軟鏈接:也稱為符號鏈接。新建的鏈接文件以“路徑”的形式來表示另一個文件,其大小為指向的路徑字符串的長度,不增加或減少目標文件in…

    Linux干貨 2016-10-19
  • LAMP 通過使用腳本的方式安裝并部署Discuz

    該腳本有很多輔助的部分,主要是為了讓腳本在中途運行失敗可以多次運行,所產生的結果是預期的,與第一運行并成功的結果是一樣的。初次攝入bash腳本有很多不足,敬請指正。 所需要的軟件 apr-1.5.2.tar.bz2 apr-util-1.5.4.tar.bz2 Discuz_X3.2_SC_UTF8.zip freetype-2.5.4.tar.gz htt…

    Linux干貨 2016-04-05
  • 教你使用rpm、yum、編譯等方式安裝軟件

    一、什么是包管理器?     很多人都不知道包管理器的概念,首先我們要了解軟件是如何運行的,我們這里介紹C程序如何實現從代碼到執行程序的過程。         程序源代碼–> 預處理–> 編譯&#8211…

    Linux干貨 2016-03-09
  • N21-北京-泥人-馬哥教育網絡班21期+第一周課程練習

    馬哥教育網絡班21期  第一周課程練習 一、計算機的組成 1、計算機主要由以下幾部分組成:運算器 控制器 存儲器(編址存儲單元)、 輸入、輸出設備   2、運算器負責運算:只能做二進制的數學、邏輯運算, 控制器:控制由哪得到數據,放到哪去,協調運算器、存儲器、輸入、輸出等設備 運算器、控制器整合到一起就是常說的中央處理器,也就是CPU。 …

    Linux干貨 2016-07-12
  • 正則表達式簡述

    正則表達式簡述 什么是正則表達式: 正則表達式,又稱正規表示法、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。 正則表達式分類: 標準正…

    Linux干貨 2016-04-05

評論列表(1條)

  • 517766237
    517766237 2016-04-21 11:18

    寫的很詳細,學習

欧美性久久久久