ansible自動運維工具之ansible-playbook詳解

1、Playbook簡介mysql

playbook配置文件使用YAML語法,具備簡潔明瞭、結構清晰等特色。playbook配置文件相似於shell腳本,是一個YAML格式的文件,用於保存針對特定需求的任務列表。上面介紹的ansible命令雖然能夠完成各類任務,可是當配置一些複雜任務時,逐條輸入就顯得效率很是低下了。更有效的方案是在playbook配置文件中放置全部的任務代碼,利用ansible-playbook命令執行該文件,能夠實現自動化運維。YAML文件的擴展名一般爲.yaml或.yml。web

2、playbook的核心元素sql

playbook的核心元素包含:shell

  • hosts:任務的目標主機,多個主機用冒號分隔,通常調用/etc/ansible/hosts中的分組信息。
  • remote_user:遠程主機上,運行此任務的默認身份爲root。
  • tasks:任務,即定義的具體任務,由模塊定義的操做列表。
  • handlers:觸發器,相似tasks,只是在特定的條件下才會觸發的任務。某任務的狀態在運行後爲changed時,可經過「notify」通知給相應的handlers進行觸發執行。
  • roles:角色,將hosts剝離出去,由tasks、handlers等所組成的一種特定的結構集合。

3、playbook格式數據庫

playbook須要注意的事項:vim

  • playbook由YMAL語言編寫。YAML參考了其餘多種語言,包括:XML、C語言、Python、Perl等。MAL格式是相似於JSON的文件格式,便於人理解和閱讀,同時便於書寫。
  • 經過「-」來表明項,經過冒號 「 :」來分隔鍵和值,整個文件以「---」開始並以「...」結束。
  • 全部的「-」和「 : 」後面均由空格,並且要嚴格注意縮進和對齊,不然語法可能能會報錯。
  • 每次在執行playbook文件以前,必定要使用「-C」選項來進行預測試。該選項會執行一遍playbook文件,但不會對目標主機進行任何更改,若語法有錯或目標主機缺乏某個文件,都將報錯提示。

一、執行簡單的playbook文件:bash

[root@ansible ~]# grep -v ^# /etc/ansible/hosts | grep -v ^$              #查看hosts中的分組信息
[web1]
192.168.1.2
[web2]
192.168.1.3
[root@ansible ~]# vim /etc/ansible/a.yml        #建立a.yml文件,寫入如下內容
---
- hosts: web1                   #針對web1組中的操做
  remote_user: root                    #遠端執行用戶身份爲root
  tasks:                #任務列表
        - name: adduser                                          #任務名稱
          user: name=user1 state=present          #執行user模塊,建立用戶
          tags:                 #建立tag標籤
          - aaa                   #tag標籤爲aaa
        - name: addgroup             #任務名稱
          group: name=root system=yes           #執行group模塊,建立組
          tags:                  #建立tag標籤
          - bbb                   #tag標籤爲bbb
- hosts: web2                  #針對web2組中的操做
  remote_user: root              #遠端執行用戶身份爲root
  tasks:                      #任務列表
        - name: copy file to web                #任務名稱
          copy: src=/etc/passwd dest=/home            #執行copy模塊,複製文件
          tags:                        #建立tag標籤
          - ccc                      #tag標籤爲ccc
...

我這裏編寫的playbook文件以下:
ansible自動運維工具之ansible-playbook詳解
playbook文件定義的任務須要經過ansible-playbook命令進行調用並執行,ansible-playbook命令用法以下:服務器

[root@ansible ~]# ansible-playbook  [ option ]/etc/ansible/a.yml
其中option中的功能包括:
* --syntax-check:檢測yaml文件的語法。
* -C:預測試,不會改變目標主機的任何設置。
* --list-tasks:列出yaml文件的任務列表。
* --list-hosts:列出yaml文件影響的主機列表。
* --list-tags:列出yaml文件中的標籤。
* -t TAGS:表示只執行指定標籤的任務。
* --skip-tags=SKIP_TAGS:表示出了指定標籤的任務,執行其餘任務。
* --start-at-task=START_AT:從指定任務開始往下運行。

執行a.yml文件的示例以下:運維

[root@ansible ~]# ansible-playbook --syntax-check /etc/ansible/a.yml    #語法檢測

playbook: /etc/ansible/a.yml       #表示沒有報錯
[root@ansible ~]# ansible-playbook -C /etc/ansible/a.yml         #對a.yml進行預測試
                                  .................#省略部份內容
192.168.1.2       : ok=3    changed=1    unreachable=0    failed=0   
192.168.1.3       : ok=2    changed=1    unreachable=0    failed=0   
#返回結果表示沒有錯誤,所有能夠執行成功。
[root@ansible ~]# ansible-playbook --list-hosts /etc/ansible/a.yml    #列出a.yml文件中的主機
[root@ansible ~]# ansible-playbook --list-tasks /etc/ansible/a.yml       #列出任務
[root@ansible ~]# ansible-playbook --list-tags /etc/ansible/a.yml            #列出標籤
[root@ansible ~]# ansible-playbook /etc/ansible/a.yml                #執行任務
[root@ansible ~]# ssh 192.168.1.2 tail -1 /etc/passwd              #確認執行結果
user1:x:1001:1001::/home/user1:/bin/bash
[root@ansible ~]# ssh 192.168.1.3 ls -ld /home/passwd
-rw-r--r--. 1 root root 2342 7月  23 16:06 /home/passwd
#通常狀況先執行「-C」命令進行預測試,沒有問題後再執行.yml文件。

有一個在線的ansible-playbook語法檢測工具,能夠更直觀的檢查出語法中的錯誤,感興趣能夠看一下:http://www.yamllint.com/
二、觸發器ssh

須要觸發才能執行的任務,當以前在tasks中的任務執行成功後,若但願在此基礎上觸發其餘任務,這就須要定義handlers。例如,當經過ansible的模塊對目標主機的配置文件進行修改以後,若是任務執行成功,能夠觸發一個觸發器,在觸發器中定義目標主機的服務重啓操做,以便配置文件生效。handlers觸發器具備以下特色:

  • handlers是ansible提供的條件機制之一。handlers和task很相似,可是它只在被task通知的時候纔會觸發執行。
  • handlers只會在全部任務執行完成後執行。並且即便被通知了不少次,它也只會執行一次。

handlers觸發器的使用示例以下:

[root@ansible ~]# ssh 192.168.1.2 netstat -anpt | grep 80                  #查詢1.2主機監聽的端口
tcp6       0      0 :::80         :::*          LISTEN      94858/httpd 
#能夠看到是監聽80端口,如今經過腳本改成8080端口,並使其生效。
[root@ansible ~]# vim /etc/ansible/httpd.yml          #編輯httpd.yml文件,寫入如下內容

---
- hosts: web1
  remote_user: root
  tasks:
        - name: change port
          command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf
          notify:                                        #配置觸發條件
                - restart httpd server     #完成該任務後調用名爲「restart httpd server」的觸發器
  handlers:                                          #配置觸發器
        - name: restart httpd server  #指定觸發器名字,要和上面「notify」指定的觸發器名字同樣
          service: name=httpd state=restarted           #觸發任務爲重啓httpd服務。
...
#編寫完成後,保存退出便可。
[root@ansible ~]# ansible-playbook -C /etc/ansible/httpd.yml           #進行預測試。
[root@ansible ~]# ansible-playbook  /etc/ansible/httpd.yml               #執行腳本。
[root@ansible ~]# ssh 192.168.1.2 netstat -anpt | grep 8080        #遠端主機已經運行8080端口
tcp6       0      0 :::8080        :::*         LISTEN      103594/httpd

三、角色

將多種不一樣的tasks的文件集中存儲在某個目錄下,則該目錄就是角色。角色通常存放在/etc/ansible/roles/目錄下,可經過ansible的配置文件來調整默認的角色目錄,/etc/ansible/roles/目錄下有不少子目錄,其中每個子目錄對應一個角色,每一個角色也有本身的目錄結構,結構以下:
ansible自動運維工具之ansible-playbook詳解

/etc/ansible/roles/爲角色集合,該目錄下有自定義的各個子目錄:

  • mariadb:mysql角色。
  • Apache:httpd角色。
  • Nginx:Nginx角色。
  • 每一個角色的定義,以特定的層級目錄結構進行組織。以mariadb(mysql角色)爲例:
  • files:存放由copy或script等模塊調用的文件。
  • templates:存放template模塊查找所須要的模板文件的目錄,如mysql配置文件模板。
  • tasks:任務存放的目錄。
  • handlers:存放相關觸發執行的目錄。
  • vars:變量存放的目錄。
  • meta:用於存放此角色元數據。
  • default:默認變量存放的目錄,文件中定義了此角色使用的默認變量。

上面的目錄中,tasks、handlers、vars、meta、default至少應該包含一個main.yml文件,該目錄下也能夠有其餘.yml文件,可是須要在main.yml文件中用include指令將其餘.yml文件包含進來。
.
有了角色後,能夠直接在yaml文件(playbook配置文件)中調用角色,示例以下:

---
- hosts: web1
  remote_user: root
  roles:            
  - mysql        #調用角色名
  - httpd             #調用角色名
...

能夠只調用一個角色,也能夠調用多個角色,當定義了角色後,用ansible-playbook PALYBOOK文件執行便可。此時ansible會到角色集合的目錄(/etc/ansible/roles)去找mysql和httpd目錄,而後依次運行mysql和httpd目錄下的全部代碼。
.
下面來個安裝及配置mariadb數據庫的實例:

需求分析:

  • 要求被管理主機上自動安裝mariadb,安裝完成後上傳提早準備好的配置文件至遠端主機,重啓服務,而後新建testdb數據庫,並容許test用戶對其擁有全部權限。
  • 被管理主機配置yum倉庫,自行配置,若被管理端能夠鏈接互聯網,那麼直接將yum倉庫指向互聯網便可。

開始在ansible服務器上實施:

[root@ansible /]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
mkdir: 已建立目錄 "/etc/ansible/roles/mariadb"
mkdir: 已建立目錄 "/etc/ansible/roles/mariadb/files"
mkdir: 已建立目錄 "/etc/ansible/roles/mariadb/tasks"
mkdir: 已建立目錄 "/etc/ansible/roles/mariadb/handlers"
[root@ansible /]# cd /etc/ansible/roles/mariadb/tasks/       #切換至指定目錄
[root@ansible tasks]# ls
[root@ansible tasks]# vim main.yml                     #編寫main.yml文件
---
- name: install mariadb
  yum: name=mariadb-server state=present
- name: move config file
  shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file
  copy: src=my.cnf dest=/etc/my.cnf
- name: reload mariadb
  shell: systemctl restart mariadb
- name: create database testdb
  shell: mysql -u root -e "create database testdb;grant all on testdb.* to 'test'@'192.168.1.%' identified by 'test123';flush privileges;"
  notify:
  - restart mariadb
...
#編寫完畢,保存退出便可。
[root@ansible tasks]# cd ../handlers/            #切換至觸發器目錄
[root@ansible handlers]# vim main.yml              #編寫main.yml文件,寫入如下內容
---
- name: restart mariadb
  service: name=mariadb state=restarted
...
#編寫完畢,保存退出便可。
[root@ansible handlers]# cd ../files     #進入mariadb角色文件夾的files
[root@ansible files]# pwd
/etc/ansible/roles/mariadb/files
[root@ansible files]# ls            #準備好配置好的mysql數據庫配置文件,須要分發到遠程主機的
my.cnf
[root@ansible files]# cd /etc/ansible/
[root@ansible ansible]# vim mariadb.yml         #編寫.yml文件
---
- hosts: web
  remote_user: root
  roles:
  - mariadb
...
##編寫完畢,保存退出便可。
[root@ansible ansible]# ansible-playbook -C mariadb.yml          #進行預檢測
                                  ........................          #省略部份內容
PLAY RECAP ***************************************************************************
192.168.1.2                : ok=3    changed=1    unreachable=0    failed=0 
#返回結果表示沒問題
[root@ansible ansible]# ansible-playbook mariadb.yml           #執行安裝

待安裝完成後,在遠端主機上查看是否已經建立了testdb數據庫,並測試以test用戶登陸,自行測試吧。

相關文章
相關標籤/搜索