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 12:57
下一篇 2016-04-19 09:30

相關推薦

  • linux文件管理類命令

    stat、alias、xargs命令使用;(非)字母,(非)數字的表示方法。

    2017-12-11
  • 第三周作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 [root@UncleZ ~]# who | cut -d' ' -f1 | uniq -c 2、取出最后登錄到當前系統的用戶的相關信息。 [roo…

    Linux干貨 2016-12-17
  • 【招聘】北京/互聯網/運維工程師/7-15K/雙休,五險一金

    崗位職責:   1、負責服務器的規劃、調試優化、日常監控、故障處理、數據備份、日志分析等工作;   2、參與運維流程制定,確保任何突發情況都能高效響應;  3、負責服務器部署,對服務器構架和網絡進行優化和改進;  4、負責運維相關數據的收集、分析和總結;  5、負責技術運維相關的文檔、手冊…

    Linux干貨 2016-04-16
  • 推薦-LAMP的編譯安裝

    首先解釋一下LAMP,L:Linux;A:apache;M:MariaDB;P:php。Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一組常用來搭建動態網站或者服務器的開源軟件。 本文就是介紹編譯安裝apache2.4,MariaDB5.5,以及php(基于模塊化和fpm的這兩種方式來配合php提供服務)。 因為php是…

    Linux干貨 2016-04-11
  • Redis高可用架構(1)—Keepalive+VIP

    最近整理一下Redis高可用架構的文檔,也準備分享出來,雖然這些架構也不是很復雜。Redis的高可用方案目前主要嘗試過5種方式,其中2種方式已經在線上使用。 1)Redis Master-Slave + Keepalive + VIP。這是很經典的db架構,也可以用與mysql的主從切換?;驹硎牵篕eepalive通過腳本檢測master的存活,然后通過…

    Linux干貨 2016-04-13
  • 第五周作業

    查看鏈接:http://note.youdao.com/noteshare?id=1ed7b36aa41cbdc1154e3e5b54e43fce

    Linux干貨 2016-09-19

評論列表(1條)

  • 517766237
    517766237 2016-04-21 11:18

    寫的很詳細,學習

欧美性久久久久