Ansible 之 playbook使用
Playbook組織格式是YAML格式,編排的是任務(task),用來記錄重復執行的命令
YAML:YAML(/?j?m?l/,尾音類似camel駱駝)是一個可讀性高,用來表達數據序列的格式。YAML參考了其他多種語言,包括:C語言、Python、Perl,並從XML、電子郵件的數據格式(RFC 2822)中獲得靈感。Clark Evans在2001年首次發表了這種語言,另外Ingy d?t Net與Oren Ben-Kiki也是這語言的共同設計者。目前已經有數種編程語言或腳本語言支持(或者說解析)這種語言。
YAML是"YAML Ain't a Markup Language"(YAML不是一種標記語言)的遞歸縮寫。在開發的這種語言時,YAML 的意思其實是:"Yet Another Markup Language"(仍是一種標記語言),但為了強調這種語言以數據做為中心,而不是以標記語言為重點,而用反向縮略語重命名。
YAML的語法和其他高級語言類似,並且可以簡單表達清單、散列表,標量等數據形態。它使用空白符號縮進和大量依賴外觀的特色,特別適合用來表達或編輯數據結構、各種配置文件、傾印除錯內容、文件大綱(例如:許多電子郵件標題格式和YAML非常接近)。
基本數據結構:
標量、數組、關聯數組
表量:直接值
數組:用花括號組成的鍵值對
2 playbook的基礎組件
1)Hosts:運行指定任務的目標主機;
2)remoute_user: 在遠程主機上執行任務的用戶;
sudo_user:
3)tasks:任務列表
模塊,模塊參數;
格式:
(1) action: module arguments
(2) module: arguments
註意:shell和command模塊後面直接跟命令,而非key=value類的參數列表;
(1) 某任務的狀態在運行後為changed時,可通過“notify”通知給相應的handlers;
(2) 任務可以通過"tags“打標簽,而後可在ansible-playbook命令上使用-t指定進行調用;
4)handlers:
任務,在特定條件下觸發;
接收到其它任務的通知時被觸發;
notify: HANDLER TASK NAME
5)variables:
(1) facts:可直接調用;
註意:可使用setup模塊直接獲取目標主機的facters;
例子
收集172.18.50.72內置變量,通過setup模塊實現收集主機的變量
ansible 172.18.50.72 -m setup
(2) 用戶自定義變量:
兩種設定的方式
(a) ansible-playbook命令的命令行中的,-e可以重復使用
-e VARS, --extra-vars=VARS
(b) 在playbook中定義變量的方法:
vars:
- var1: value1
- var2: value2
變量引用:{{ variable }},變量兩側有空格
(3) 通過roles傳遞變量;
(4) Host Inventory
(a) 用戶自定義變量
(i) 向不同的主機傳遞不同的變量;
IP/HOSTNAME varaiable=value var2=value2
(ii) 向組中的主機傳遞相同的變量;
[groupname:vars]
variable=value
(b) invertory參數
用於定義ansible遠程連接目標主機時使用的參數,而非傳遞給playbook的變量;
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
3 運行playbook的方式
(1) 測試
ansible-playbook --check
只檢測可能會發生的改變,但不真正執行操作;
ansible-playbook --list-hosts
例子
ansible-playbook --list-hosts installpkg.yml
列出運行任務的主機;
ansible-playbook --syntax-check
檢查語法,沒有輸出表示沒有語法錯誤
ansible-playbook --syntax-check installpkg.yml
(2) 運行
ansible-playbook 腳本
例子:
ansible-playbook installpkg.yml
4 例子
例一:編寫一個yaml文檔,用來安裝redis和ngnix服務,並啟動相關服務
註意,語法裏有橫線用來引導,區分不同的功能的語句,如下面語句有多個hosts,因此在hosts前加橫桿,tasks有多個,用橫桿區分每個tasks,而且縮進是有要求的,同一層級,一般縮進一樣。註意橫桿和冒號後有空格。
vim installpkg.yaml - hosts: websrvs remote_user: root tasks: - name: install nginx package yum: name=nginx state=latest - name: start nginx service service: name=nginx enabled=true state=started - hosts: dbsrvs remote_user: root tasks: - name: install redis package yum: name=redis state=latest - name: install conf file copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644 - name: start redis service service: name=redis state=started
準備redis的配置模板
更改redis配置模板監聽端口為0.0.0.0 和 端口為6380
vim redis.conf vim /root/redis.conf bind 0.0.0.0 port 6380
查看playbook裏的主機
ansible-playbook --list-hosts installpkg.yml
查看playbook裏的tasks
ansible-playbook --list-tasks installpkg.yml
測試執行腳本,添加選項-C,並沒有實際執行
ansible-playbook -C installpkg.yml
以上腳本,測試正常的話,就去掉-C選項,實際執行
ansible-playbook installpkg.yml
例二:handler的使用
條件式觸發:handler,滿足條件的時候觸發條件
handlers:處理器,配置文件被修改的時候才執行,條件定義在notify
以下命令,表示當配置文件被更改的時候,notify就會觸發handler,實現重啟的操作.註意格式的書寫。
vim /root/ansible/handler.yml - hosts: websrvs remote_user: root tasks: - name: install nginx package yum: name=nginx state=latest - name: start nginx service service: name=nginx enabled=true state=started - hosts: dbsrvs remote_user: root tasks: - name: install redis package yum: name=redis state=latest - name: install conf file copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644 tags: instconf notify: restart redis service - name: start redis service service: name=redis state=started handlers: - name: restart redis service service: name=redis state=restarted
例三:tag的使用
更改websrvs的配置內容,設置tag為instnginx
vim /root/ansible/installpkg.yml - hosts: websrvs remote_user: root tasks: - name: install nginx package yum: name=nginx state=latest tags: instnginx - name: start nginx service service: name=nginx enabled=true state=started - hosts: dbsrvs remote_user: root tasks: - name: install redis package yum: name=redis state=latest - name: install conf file copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644 tags: instconf notify: restart redis service - name: start redis service service: name=redis state=started handlers: - name: restart redis service service: name=redis state=restarted
查看任務,會顯示對應的標簽
ansible-playbook --list-tasks installpkg.yml
指定標簽,可以重新跑指定的標簽命令,如他部分的命令不執行,如這裏指定tag為instnginx,則只安裝nginx包,但是不啟動服務,其他部分的命令不會執行
ansible-playbook -t instnginx installpkg.yml
同時跑多個標簽,多個任務可以指定同一標簽,比較靈活 。如以下配置中,把安裝不同的服務包的tag都設置為instpkg,同時設置了 復制dbsrvs組的配置文件,設備復制文件的tag為instconf,同時執行多個tag間用逗號隔開
vim /root/ansible/installpkg.yml - hosts: websrvs remote_user: root tasks: - name: install nginx package yum: name=nginx state=latest tags: instpkg - name: start nginx service service: name=nginx enabled=true state=started - hosts: dbsrvs remote_user: root tasks: - name: install redis package yum: name=redis state=latest tags: instpkg - name: install conf file copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644 tags: instconf notify: restart redis service - name: start redis service service: name=redis state=started handlers: - name: restart redis service service: name=redis state=restarted
執行如下
ansible-playbook -t instpkg,instconf installpkg.yaml
結果是websrvs組只安裝nginx,但是沒有啟動nginx服務,同時dbsrvs安裝了redis包而且復制了配置文件到對應的主機,而且在install conf file任務中配置了notify任務,所以dbsrvs組的redis服務會被啟動
例四:變量的使用
通過變量pkgname安裝相關的包
vim installvar.yml - hosts: websrvs remote_user: root vars: - pkgname: tree tasks: - name: install package yum: name={{ pkgname }} state=latest
運行腳本,不指定變量默認是安裝tree
ansible-playbook installvar.yml
指定變量,playbook命令行裏定義的變量優先級比腳本裏高, 這裏會安裝memcached,而不是腳本裏的tree
ansible-playbook -e "pkgname=memcached" installvar.yaml
直接在host裏定義變量,但是這個變量級別很低,比腳本裏的變量還低
vim /etc/ansible/hosts [websrvs] 172.18.50.72 pkgname=redis 172.18.50.75 pkgname=memcached
vim /root/ansible/installvar.yml - hosts: websrvs remote_user: root vars: - pkgname: tree tasks: - name: install package yum: name={{ pkgname }} state=latest
執行命令
ansible-playbook installvar.yaml
則websrvs安裝的服務包是tree,而不是/etc/ansible/hosts裏賦值的變量
去掉腳本裏的變量
vim /root/ansible/installvar.yaml - hosts: websrvs remote_user: root tasks: - name: install package yum: name={{ pkgname }} state=latest
重新執行
ansible-playbook installvar.yml
則72主機安裝服務包redis,75主機安裝memcached
例五:在配置文件裏傳遞參數
vim /etc/ansible/hosts [websrvs] 172.18.50.72 pkgname=redis ansible_ssh_user=root ansible_ssh_pass=Pass123456 172.18.50.75 pkgname=memcached
Ansible 之 playbook使用