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文件以下:
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/目錄下有不少子目錄,其中每個子目錄對應一個角色,每一個角色也有本身的目錄結構,結構以下:
/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用戶登陸,自行測試吧。