ansible playbook使用總結

Ansible playbook的使用nginx

playbooks概念web

task:shell

     任務:使用各模塊所執行的特性操做任務,好比:-m user -a 'name= password='apache

Variables:vim

     變量:服務器

Templates:數據結構

     模板ide

在定義模板後能夠實現各節點對應的變量來取代,表達式自身會根據當前節點所賦值作運算,以後生成的值則賦予這個參數,用於生產不一樣配置的配置文件,因此模板主要實現配置不一樣場景文本文件ui

 

並且這種使用模板語言來定義this

模板語言中能夠根據定義替換成特定主機的某些值

 

handlers:

處理器:

若是某一次操做配置文件發生改變的話,遠程和本地配置文件不一致,那麼確定是將其配置文件須要進行覆蓋,這樣須要在配置文件發送改變的話須要觸動某些機制進行操做

      說白了就是事先能夠在某些條件下,好比配置發生改變)被觸發的操做

Rolse:

    角色:層次型組織playbooks以及其所依賴的各類資源的一種機制;其角色能夠單獨被調用

彼此之間的server服務器的配置確定是徹底不同的,若是對於這些節點同時配置並提供一樣的playbooks 是不可能的,因此將其每一個server分紅組

之間有些角色或者功能是相同的,那麼好比web server 之間可能有同步時間等,某些服務是通用的,所以有了這些機制以後可以實現按須要將某個類特定服務器相同操做定義基礎配置,將特定功能定義成一類操做


playbook
是基於YAML語言所定義的聲明試配置文件

數據結構包括:

每一個橫線所表示引導一個列表中的一貫,經過縮進所表示具備相同縮進的元素是同一個列表的元素

以下所示,定義playbook的結構化部分:

 

- name : deploy web server     #定義一個任務模塊,跟上這個名稱

  user : foouser               #使用user模塊定義其使用的用戶是foouer

  sodu : True                  #是否容許sudo權限

  hosts : all                  #對全部的主機模塊生效

 

tasks:                     #將一個任務定義應用某一個具體操做

- name : install apache         #定義名稱爲install apache

  apt : pkg=apache2-mpm-prefork state=latest       #使用apt模塊進行安裝 狀態爲latest

 

首先來定義一個httpd服務,並讓其可以開機自動啓動服務

[root@testA test]# pwd

/opt/test

首先定義頭部信息

- name: install httpd service

  user: root

  hosts: a

 

#再定義任務信息

tasks:

  - name: install                       #定義第一個任務名稱並調用yum模塊,與命令一致

    yum: name=httpd state=present

 

  - name: service on                    #定義第二個任務

    service: name=httpd enabled=yes state=started

 

執行

[root@testA test]# ansible-playbook web.yaml

 

PLAY [install httpd service] **************************************************

 

GATHERING FACTS ***************************************************************

ok: [192.168.101.243]

ok: [192.168.101.242]

 

TASK: [install] ***************************************************************

changed: [192.168.101.243]

changed: [192.168.101.242]

 

TASK: [service on] ************************************************************

changed: [192.168.101.243]

changed: [192.168.101.242]

 

PLAY RECAP ********************************************************************

192.168.101.242            : ok=3    changed=2    unreachable=0    failed=0  

192.168.101.243            : ok=3    changed=2    unreachable=0    failed=0  

ok = 3 有3個設定執行成功,分別是1.安裝 2.修改服務啓動狀態 3.開啓服務

以上爲playbook的最簡單的使用

 

 

YAML語法

YAML的語法和其餘高階語言相似,而且能夠簡單表達清單、散列表、標量等數據結構。其結構(Structure)經過空格來展現,序列(Sequence)裏的項用"-"來表明,Map裏的鍵值對用":"分隔。下面是一個示例。

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最關鍵的部分爲列表 字段 和映射

列表的全部元素均使用「-」打頭,例如:
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango

必定要作好縮進,經過空格進行排序,排列整齊的認爲是同一級別的

 

Ansible基礎元素

facts

在套用某個主機以前先獲取其各類相關數據的一種機制

 

獲取某個節點的變量信息:

[root@testA wangchao]# ansible 192.168.101.242 -m setup

直接返回了許多數據,這裏所描述的功能表示基於setup所獲取指定主機各類變量

 

在跟對方節點通訊以前能夠先將對方節點返回一些可用信息,而這些信息都是經過facts所獲取的

而這些信息都是變量 都是能夠被調用的,

有些變量頗有用,好比:

        "ansible_os_family": "RedHat",
       "ansible_pkg_mgr": "yum", 

根據反饋的結果再來決定使用哪些組件來管理

 

能夠經過這些東西來判斷來應用哪些任務

得到對方的線程,無非是cpu個數x2,那麼在變量中也有體現,以下所示:

        "ansible_processor_cores": 1, 

 

變量的種類

1.自定義變量

2.facts

3.主機/invertory變量  host variables

4.組變量,將多個主機定義爲一個組,以下所示:

[a]

hostip

[a:vars]

ntp_server=ntp.xxx.com

 

組中能夠嵌套一個組

[apache]

host_1

host_2

 

[nginx]

ngx1.xx.com

 

[webservers:children]

nginx

apache

 

[webserver:vars]

ntp_server=ntp.xxx.com

所以常見變量有以上4類

 

根據以前的反饋來判斷任務是否執行成功

獲取到某一指定的結果狀態纔會運行,好比:

tasks:

  -command: /bin/false

   register: result          

   ingnore_errors: True

第二種方式:

  - command:/bin/something

    when: result|failed          #能夠根據此前執行結果作出執行

 

when中能夠判斷此前某個結果是不是所指望的,進而根據其作出判斷的

 

迭代:

還能夠實現遍歷循環操做,以下所示:

在主機組a中,添加3個用戶

- name: add user

  remote_user: root

  hosts: a

 

  tasks:

  - name: add serveral users

    user: name={{items}} state=present

    with_items:

    - test4

    - test5

    - test6

這裏變量必須是以{{item}}進行標記,而調用變量必須是with_items:進行賦值

 

讓各自執行安裝,可是要使用yum安裝,而且只有對方包管理器是yum

須要用到變量判斷的功能

涉及到:when

首先須要使用setup獲取對方變量,若是使用的匹配yum,那麼再進行操做

[root@testA ~]# ansible 192.168.101.242 -m setup

涉及變量:

"ansible_pkg_mgr": "yum",

 

涉及參數:

  when: ansible_pkg_mgr == "yum"

當變量爲yum的時候才執行操做

- name: install zsh

  remote_user: root

  hosts: a

  tasks:

  - name: install zsh

    yum: name=zsh state=present

    when: ansible_pkg_mgr == "yum"


執行:

[root@testA wangchao]# ansible-playbook zsh.yaml

PLAY [install zsh] ************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.101.243]     #
手機各個節點的facts信息
ok: [192.168.101.242]

TASK: [install zsh] *********************************************************** 

#開始執行任務

changed: [192.168.101.243]

changed: [192.168.101.242]

PLAY RECAP ******************************************************************** 

#返回的執行結果
192.168.101.242            : ok=2    changed=1    unreachable=0    failed=0  
192.168.101.243            : ok=2    changed=1    unreachable=0    failed=0   

 

補充:在使用with_items的時候還可使用hashes

user:name={{item,name}} state=present groups=`item`.`group`

with_items:

  -{name:'test1',gourp: 'wheel'}

  -{name:'test2',gourp: 'root'}

 

經過以上的操做,簡單來講就是由多個列表,其主要功能就是將事先歸併的主機,先經過tasks定義好的角色

聯合起來共同完成一個任務

 

關於狀態碼

若是命令或腳本的退出狀態碼不爲0,那麼可使用一下方式代替

tasks:

  - name: run this xxx

    shell: /usr/bin/somecommand || /bin/true

#或:

    ignore_errors: True

 

playbook基礎組建

handlers      觸發操做

handlers用於當關注的資源發生變化時採起必定的操做

就是說只有觸發的時候纔會操做

 

使用notify這個action能夠用於每一個play的最後被觸發,這樣能夠避免屢次發生改變每次都執行指定的操做

因此能夠指定每次何時出發handlers 

 

官方給出的例子:

- name: template config file

  template: src=template.j2 dest=/etc/foo.conf   #萬一這個配置文件發生了改變,那麼執行下面操做

  notify:

    - restart service                        #這裏的restart是須要定義handlers的,因此要保持一致

    - restart service(httpd)

 

handlers:

    - name restart memcache

      service: name=memcache state=restarted

    - name: restart httpd

      service: name=httpd  state=restarted

以上意思爲,若是src的配置文件發生了改變,那麼則觸發這個handlers定義的操做

 

接下來咱們定義一個httpd的配置文件,當文件發生改變的時候,則推送這個配置文件到各個節點並重啓httpd服務

[root@testA test]# mkdir httpd

[root@testA test]# cd httpd/

[root@testA httpd]# pwd

/opt/test/httpd

[root@testA httpd]# cp /etc/httpd/conf/httpd.conf .

[root@testA httpd]# ls

httpd.conf

 

爲了演示效果將端口監聽在8080端口

Listen 8080

 

效果以下:

[root@testA httpd]# cat httpd.yaml

- name: conf

  remote_user: root

  hosts: a

  tasks:

  - name: install httpd

    yum: name=httpd state=present

    when: ansible_pkg_mgr == "yum"

 

  - name: conf file

    copy: src=/opt/test/httpd/httpd.conf dest=/etc/httpd/conf/httpd.conf

    notify: restart httpd

 

  - name: start httpd

    service: name=httpd enabled=yes state=started

 

  handlers:

  - name: restart httpd

    service: name=httpd state=restarted

以上爲從檢測對端是否爲yum包管理器 若是是yum則安裝httpd 再cp配置文件到指定目錄最後將服務加到開機啓動項並啓動,最後重啓服務

可是以上有幾個步驟重複了

 

改進:

若是第二次執行的時候就沒有必要去從新yum安裝

在playbook中 其中一個選項 -t

-t表示能夠執行某些特定標籤對應的tasks

接下來爲每一個步驟都添加一個標籤,以下所示:

  - name: conf file

    copy: src=/opt/test/httpd/httpd.conf dest=/etc/httpd/conf/httpd.conf

    tags: conf

    notify: restart httpd

 

執行:

[root@testA httpd]# ansible-playbook httpd.yaml -t conf

 

PLAY [conf] *******************************************************************

 

GATHERING FACTS ***************************************************************

ok: [192.168.101.243]

ok: [192.168.101.242]

 

TASK: [conf file] *************************************************************

ok: [192.168.101.243]

ok: [192.168.101.242]

 

PLAY RECAP ********************************************************************

192.168.101.242            : ok=2    changed=0    unreachable=0    failed=0  

192.168.101.243            : ok=2    changed=0    unreachable=0    failed=0  

 

若是是多個任務,也能夠同時使用一個tags

都在每一個tasks 指定tags: conf 便可

 

經過目錄結構的方式也將其一組資源再次切分

以下所示:

直接使用inculde進行調用其餘的yaml文件

[root@testA httpd]# mkdir tasks

將如下部分保留

[root@testA httpd]# vim tasks/main.yaml

  - name: install httpd

    yum: name=httpd state=present

    when: ansible_pkg_mgr == "yum"

 

  - name: conf file

    copy: src=/opt/test/httpd/httpd.conf dest=/etc/httpd/conf/httpd.conf

    tags: conf

    notify: restart httpd       #用來調用handlers

 

  - name: start httpd

    service: name=httpd enabled=yes state=started

 

 

編輯httpd.yaml

[root@testA httpd]# cat httpd.yaml

- name: conf

  remote_user: root

  hosts: a

  tasks:

    include: tasks/main.yaml

 

定義handlers

[root@testA httpd]# mkdir handlers

[root@testA httpd]# cd handlers/

[root@testA handlers]# vim main.yaml

內容以下:

  - name: restart httpd

    service: name=httpd state=restarted

經過以上的定義,再修改主配置文件:

[root@testA httpd]# pwd

/opt/test/httpd

[root@testA httpd]# cat httpd.yaml

- name: conf

  remote_user: root

  hosts: a

  tasks:

    include: tasks/main.yaml

  handlers:

    include: handlers/main.yaml

執行操做並查看

 

若是沒有問題則改一下httpd.conf配置文件並指定標籤

[root@testA httpd]# ansible-playbook httpd.yaml -t conf

 

一個roles的案例以下所示:
          site.yml
          webservers.yml
          fooservers.yml
          roles/
             common/
               files/
               templates/
               tasks/
               handlers/
               vars/  
               meta/
             webservers/
               files/
               templates/
               tasks/
               handlers/
               vars/
               meta/

建立role的步驟

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

 

rolse

再定義一個目錄rolse

[root@testA httpd]# mkdir roles

將目錄的文件都挪到roles裏

[root@testA httpd]# mv files/ handlers/ httpd.yaml tasks/ roles/web/

[root@testA httpd]# ls roles/
web

 

這裏的roles 表示角色目錄,而這個角色名就叫作web

而在這個角色當中,一般命名爲site.yaml

[root@testA web]# mv httpd.yaml site.yaml

 

定義一個yaml 用於調用site.yaml

[root@testA httpd]# cat webserver.yaml

- name: web service

  remote_user: root

  hosts: a

  roles:

  - web

相關文章
相關標籤/搜索