文章目錄
- 一、YAML語言
-
- 1.1 YAML介紹
- 1.2 基本文法規則
- 1.3 YAML支援的資料結構
- 二、Ansible的腳本—playbook劇本
-
- 2.1 playbook的組成
- 2.2 補充指令
- 2.3 tasks和action
-
- 2.3.1 事務執行與復原
- 2.3.2 name的必要性
- 2.3.3 task的格式
- 2.3.4 其他注意點
- 三、編寫playbook劇本
-
- 3.1 備份檔案到已知使用者的家目錄下
- 3.2 建立新使用者
- 3.3 安裝服務及開啟服務
- 3.4 示例事務復原操作
- 3.5 忽略錯誤,強制傳回成功
- 3.6 多任務在同一劇本中
- 四、handlers介紹及劇本編寫
-
- 4.1 handlers介紹
- 4.2 編寫劇本
- 五、變量設定
-
- 5.1 直接在劇本中指派變量
- 5.2 通過ansible指令傳遞
- 5.3 傳遞系統固定變量
- 5.4 在hosts配置檔案中定義
- 六、條件測試
-
- 6.1 單條件測試
- 6.2 多條件判斷
- 6.3 組條件判斷
- 七、疊代
-
- 7.1 應用
- 八、Templates模闆子產品
-
- 8.1 執行個體
- 九、tags标簽子產品
-
- 9.1 單标簽任務
- 9.2 多标簽任務
- 9.3 always标簽
- 十、role子產品
-
- 10.1 roles内各目錄含義解釋
- 10.2 通過roles子產品來完成LAMP架構
一、YAML語言
1.1 YAML介紹
- 另一種标記語言,是用來寫配置檔案的語言,非常簡潔和強大;
- YAML語言和其他語言類似,也可以表達散清單、标量等資料結構;
- 結構通過空格來展示,序列裡配置項通過-來代表,Map裡鍵值用。
1.2 基本文法規則
- 大小寫敏感
- 是用縮進表示層級關系
- 縮進時不允許是用tab鍵,隻允許使用空格
- 縮進的空格數目不重要,隻要相同層級的元素左側對齊即可
1.3 YAML支援的資料結構
-
對象:鍵值對的集合,又稱為映射(mapping)/哈希(hashes)/字典(directory)
例如:name:Example Developer
-
數組:一組按次序排列的值,又稱為序列(sequence)/清單(list)
例如:-Apple
-orange
-
純量:單個的,不可再分的值
例如:number:12.30
二、Ansible的腳本—playbook劇本
playbook是通過task調用ansible的子產品将多個play組織在一個playbook中運作
2.1 playbook的組成
- Tasks:任務,即調用子產品完成的某操作
- Variables:變量
- Templates:模闆
- Handles:處理器,當滿足某條件是,觸發執行的操作
- Roles:角色
2.2 補充指令
ansible-playbook mysql.yaml --syntax-check # 檢查yaml檔案的額文法是否正确
ansible-playbook mysql.yaml --list-task # 檢查task任務
ansible-playbook mysql.yaml --list-hosts # 檢查生效的主機
ansible-playbook mysql.yaml --start-at-task="copy Nginx.conf" # 指定從某個task開始運作
2.3 tasks和action
2.3.1 事務執行與復原
- Play的主體部分是task清單,task清單中的各任務按次序逐個在hosts中指定的主機上執行,即在所有主機上完成第一個任務後再開始第二個任務
- 在運作playbook時(從上到下執行),如果一個host執行task失敗,整個tasks都會復原,請修正playbook中的錯誤,然後重新執行即可。
- Task的目的是使用指定的參數執行子產品,而在子產品參數中可以使用變量,子產品執行時幂等的,這意味着多次執行是安全的,因為其結果一緻.
2.3.2 name的必要性
每一個task必須有一個名稱name,這樣在運作playbook時,從其輸出的任務執行資訊中可以很好的辨識出是屬于哪一個task的。如果沒有定X
2.3.3 task的格式
定 一個task,常見的格式:”module: options”例如 : yum: name=httpd
2.3.4 其他注意點
ansible的自帶子產品中,command子產品和shell子產品無需使用key=value格式
三、編寫playbook劇本
3.1 備份檔案到已知使用者的家目錄下
[[email protected] opt]# vim sudo1.yaml
- hosts: mysql
remote_user: root
become: yes
become_user: wangwu
tasks:
- name: copy file
copy: src=/etc/fstab dest=/home/wangwu/fstab.bak
[[email protected] opt]# ansible-playbook sudo1.yaml --syntax-check # 對劇本的文法進行檢測
playbook: sudo1.yaml # 顯示這樣的為檢測通過
[[email protected] opt]# ansible-playbook sudo1.yaml # 執行劇本
PLAY [mysql] **************************************************************************************
TASK [Gathering Facts] ****************************************************************************
ok: [192.168.10.13]
TASK [copy file] **********************************************************************************
changed: [192.168.10.13]
PLAY RECAP ****************************************************************************************
192.168.10.13 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3.2 建立新使用者
[[email protected] opt]# vim create.yml
- hosts: mysql
remote_user: root
tasks:
- name: create group
group: name=tomcat gid=303
- name: create user
user: name=tomcat uid=303 group=tomcat
[[email protected] opt]# ansible-playbook create.yml --syntax-check # 檢查劇本的文法
playbook: create.yml
[[email protected] opt]# ansible-playbook create.yml # 執行劇本
PLAY [mysql] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.10.13]
TASK [create group] ************************************************************
ok: [192.168.10.13]
TASK [create user] *************************************************************
ok: [192.168.10.13]
PLAY RECAP *********************************************************************
192.168.10.13 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3.3 安裝服務及開啟服務
[[email protected] opt]# vim httpd.yaml
- hosts: mysql
remote_user: root
tasks:
- name: install httpd
yum: name=httpd
- name: stop firewlld
service: name=firewalld state=stopped
- name: start httpd
service: name=httpd state=started
- name: touch file
copy: content="this is web!!" dest=/var/www/html/index.html
[[email protected] opt]# ansible-playbook httpd.yaml # 執行劇本
PLAY [mysql] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.10.13]
TASK [install httpd] ***********************************************************
changed: [192.168.10.13]
TASK [stop firewlld] ***********************************************************
ok: [192.168.10.13]
TASK [start httpd] *************************************************************
changed: [192.168.10.13]
TASK [touch file] **************************************************************
changed: [192.168.10.13]
PLAY RECAP *********************************************************************
192.168.10.13 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3.4 示例事務復原操作
驗證以下的結論,復原操作使得在錯誤事務之前的操作完成,但是錯誤操作及以後的事務都沒有執行,這樣,讓檢查和維護的工作量減輕了很多
3.5 忽略錯誤,強制傳回成功
對應上一個實驗,我們可以認為幹預當碰見錯誤時,不讓程式直接實作復原,而讓程式跳過錯誤,繼續執行下面的操作。
3.6 多任務在同一劇本中
[[email protected] opt]# vim aa.yaml
- hosts: webserver
remote_user: root
tasks:
- name: create group
group: name=aaa gid=666
- name: create user
user: name=aaa uid=666 group=aaa
- hosts: webserver
remote_user: root
become: yes
become: aaa
tasks:
- name: copy file
copy: src=/etc/fstab dest=/home/aaa/fstab.bak
[[email protected] opt]# ansible-playbook aa.yaml # 執行劇本
[[email protected] ~]# id aaa # 到指定客戶機上面檢視執行情況
uid=666(aaa) gid=666(aaa) groups=666(aaa)
四、handlers介紹及劇本編寫
4.1 handlers介紹
- handlers也是一些tasks的清單,和一般的task并沒有什麼差別
- 是由通知者進行的notify,無果沒有notify,則handles不會執行,加入被notify了,則handles會執行
- 不管有多少個通知者進行了notify,等到play嘚瑟所有task執行完成後,handlers也隻會被執行一次
4.2 編寫劇本
[[email protected] opt]# vim www.yaml
- hosts: mysql
remote_user: root
tasks:
- name: install httpd
yum: name=httpd
- name: start httpd
service: name=httpd state=started enabled=true
notify: # 通知名稱,可以同時多個
- touch file
handlers: # 通知名稱必須一緻
- name: touch file
copy: content="this is web" dest=/var/www/html/index.html
[[email protected] opt]# ansible-playbook www.yaml --syntax-check
playbook: www.yaml
[[email protected] opt]# ansible-playbook www.yaml
PLAY [mysql] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.10.13]
TASK [install httpd] ***********************************************************
changed: [192.168.10.13]
TASK [start httpd] *************************************************************
changed: [192.168.10.13]
RUNNING HANDLER [touch file] ***************************************************
changed: [192.168.10.13]
PLAY RECAP *********************************************************************
192.168.10.13 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
五、變量設定
5.1 直接在劇本中指派變量
[[email protected] opt]# vim www.yaml
-
hosts: mysql
remote_user: root
vars:
-
aa: httpd
tasks:
-
name: install httpd
yum: name={{aa}}
-
name: start httpd
service: name={{aa}} state=started enabled=true
notify:
-
touch file
handlers:
-
-
name: touch file
copy: content=“this is web” dest=/var/www/html/index.html
-
在mysql節點上檢視httpd的狀态資訊:
5.2 通過ansible指令傳遞
[[email protected] opt]# vim www.yaml
-
hosts: mysql
remote_user: root
vars:
-
aa: ## 可根據需要在傳遞變量的時候床底多個變量
tasks:
-
name: install httpd
yum: name={{aa}}
-
name: start httpd
service: name={{aa}} state=started enabled=true
notify:
-
touch file
handlers:
-
-
name: touch file
copy: content=“this is web” dest=/var/www/html/index.html
-
通過ansible指令傳遞變量執行劇本:
在mysql節點上檢視httpd的狀态資訊:
5.3 傳遞系統固定變量
[[email protected] opt]# vim gdbl.yml
-
hosts: mysql
remote_user: root
tasks:
-
name: print
copy: content="{{ansible_all_ipv4_addresses}}" dest=/opt/add.txt
-
5.4 在hosts配置檔案中定義
[[email protected] opt]# grep -v "^#" /etc/ansible/hosts | grep -v "^$"
[webserver]
192.168.10.12
[mysql]
192.168.10.13 zhangsan="123456" # 在hosts裡面指派
[[email protected] opt]# vim gdbl.yml
- hosts: mysql
remote_user: root
tasks:
- name: print
copy: content="{{zhangsan}}" dest=/opt/zhangsan.txt
[[email protected] opt]# ansible-playbook gdbl.yml --syntax-check # 文法的檢測
playbook: gdbl.yml
[[email protected] opt]# ansible-playbook gdbl.yml # 執行劇本
PLAY [mysql] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.10.13]
TASK [print] *******************************************************************
changed: [192.168.10.13]
PLAY RECAP *********************************************************************
192.168.10.13 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
服務變量:
- 劇本使用的 伺服器名稱,資料
- 指令 ip位址,測試
- 固定變量
- 節點hosts 以系統的參數值
六、條件測試
- 如果需要根據變量、facts (setup) 或此前任務的執行結果來作為某task執行與否的前提時要用到條件測試,在Playbook中條件測試使用when
- 在task後添加when子句即可使用條件測試: when子句支援jinjia2表達式或文法
6.1 單條件測試
[[email protected] opt]# vim xt.yml
- hosts: mysql
remote_user: root
tasks:
- name: shutdown Cent
command: /sbin/shutdown -h now
when: ansible_distribution == "CentOS"
6.2 多條件判斷
[[email protected] opt]# vim xt.yml
- hosts: mysql
remote_user: root
tasks:
- name: shutdown Cent
command: /sbin/shutdown -h now
when:
- ansible_distribution == "CentOS"
- ansible_distribution_major_version == "7"
6.3 組條件判斷
[[email protected] opt]# vim xt.yml
-
hosts: mysql
remote_user: root
tasks:
-
name: shutdown Cent
command: /sbin/shutdown -h now
when: (ansible_distribution == “CentOS” and ansible_distribution_major_version == “7”) or
(ansible_distribution == “Debian” and ansible_distribution_major_version == “7”)
-
七、疊代
- 當有需要重複性執行的任務時,可以使用疊代機制,其使用格式為将需要疊代的内容定義為item變量引用,并通過with_items語句指明疊代的元素
7.1 應用
- 疊代的安裝軟體
[[email protected] opt]# vim install.yml - hosts: mysql remote_user: root tasks: - name: install httpd ftpd yum: name={{item}} with_items: - httpd - tomcat
安裝完成:
- 通過疊代來添加使用者群組
[[email protected] opt]# vim useradd.yaml - hosts: mysql remote_user: root tasks: - name: create group group: name={{item.name}} gid={{item.gid}} with_items: - { name: 'zhaoming',gid: '333'} - { name: 'chenqian',gid: '444'} - name: create user user: name={{item.xingming}} uid={{item.uid}} group={{item.group}} with_items: - { xingming: 'zhaoming',uid: '333',group: 'zhaoming'} - { xingming: 'chenqian',uid: '444',group: 'chenqian'}
八、Templates模闆子產品
- Jinja是基于Python的模闆引擎。template類是Jinja的另一個重要元件,可以看作一個編譯過的子產品檔案,用來生産目标文本,傳遞Python的變量給模闆去替換模闆中的标記。
- jinja2是基于python的模闆引擎,功能比較類似于PHP的smarty,J2ee的Freemark和velocity。它能完全支援unicode,并具有內建的沙盒執行環境,應用廣泛。jinja2使用BSD授權
8.1 執行個體
以安裝apache為例,具體來說明Templates子產品的工作流程
- 首先要拷貝模闆配置檔案到ansible管理端來
scp [email protected]:/etc/httpd/conf/httpd.conf /opt/
- 對拷貝過來的檔案進行修改,改成我們需要的格式類型,并修改此時配置檔案的格式
# vim httpd.conf Listen {{http_port}} ServerName {{server_name}} Maxclients {{access_num}} # mv httpd.conf httpd.conf.j2
- 進入ansible隻配置檔案,指派變量
[[email protected] opt]# vi /etc/ansible/hosts [webserver] 192.168.10.12 http_port=192.168.10.12:80 server_name=www.aa.com:80 access_num=600
- 劇本的編寫
[[email protected] opt]# vim apache.yaml - hosts: webserver remote_user: root tasks: - name: install httpd yum: name=httpd - name: congfig file template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf - name: start httpd service: name=httpd state=started - name: stop firewalld service: name=firewalld state=stopped
我們進入到webserver節點檢查已經安裝好的httpd服務,并檢視其配置檔案,是否根據我們的要求更改完成。
[[email protected] ~]# vi /etc/httpd/conf/httpd.conf
Listen 192.168.10.12:80
ServerName www.aa.com:80
Maxclients 600
九、tags标簽子產品
- 在一個playbook中,我們一般會定義很多個task,如果我們隻想執行其中的某一個或者多個task時就可以使用tags标簽功能了
9.1 單标簽任務
[[email protected] opt]# vim biaoqian.yml
-
hosts: webserver
remote_user: root
tasks:
-
name: copy hosts
copy: src=/etc/hosts dest=/opt/hosts1
tags:
- aaa
-
name: touch hosts2
file: path=/opt/hosts2 state=touch
-
name: touch hosts3
file: path=/opt/hosts3 state=directory
-
9.2 多标簽任務
- 當劇本中有多個任務,但存在兩個标簽任務,且标簽名一樣時,執行時,隻執行這兩給任務
[[email protected] opt]# vim biaoqian.yml - hosts: webserver remote_user: root tasks: - name: copy hosts copy: src=/etc/hosts dest=/opt/hosts1 tags: - aaa - name: touch hosts2 file: path=/opt/hosts2 state=touch tags: - aaa - name: touch hosts3 file: path=/opt/hosts3 state=directory
9.3 always标簽
- 事實上不光可以為單個或多個task指定同一個tags,playbook還提供了一個特殊的tags為always,作用就是當使用always當tags的task時,無論執行哪個tags時,定義有always的任務必須強制執行
[[email protected] opt]# vim biaoqian.yml - hosts: webserver remote_user: root tasks: - name: copy hosts copy: src=/etc/hosts dest=/opt/hosts1 tags: - aaa - name: touch hosts2 file: path=/opt/hosts2 state=touch tags: - aaa - name: touch hosts3 file: path=/opt/hosts3 state=directory tags: - always
說明always标簽無論是否選中的情況下,都進行了執行。
十、role子產品
- roles(角色)能夠根據層次型結構自動裝載變量檔案、task以及handlers等。 簡單來講,roles就是通過分别将變量、檔案、任務、子產品及處理器放置于單獨的目錄中,并可以便捷地include
10.1 roles内各目錄含義解釋
目錄 | 描述 |
---|---|
files | 用來存放由copy子產品或script子產品調用的檔案 |
templates | 用來存放jinjia2模闆,template子產品會自動在此目錄中尋找jinjia2模闆檔案 |
tasks | 此目錄應當包含一個main.yml檔案, 用于定義此角色的任務清單,此檔案可以使用include包含其它的位于此目錄的task檔案 |
handlers | 此目錄應當包含一個main.yml檔案,用于定義此角色中觸發條件時執行的動作 |
vars | 此目錄應當包含一個main.yml檔案,用于定義此角色用到的變量 |
defaults | 此目錄應當包含一個main.yml檔案,用于為目前角色設定預設變量 |
meta | 此目錄應當包含一個main.yml檔案, 用于定義此角色的特殊設定及其依賴關系 |
10.2 通過roles子產品來完成LAMP架構
# 建立所需的三部分的功能子產品
cd /etc/ansible/roles/
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p
# 建立各子產品所需的main.yml檔案(空檔案)
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml
配置 main.yml 檔案内容
cd /etc/ansible/roles/
vim httpd/tasks/main.yml
- name: install httpd
yum: pkg=httpd
vim mysql/tasks/main.yml
- name: install mysql
yum: pkg=mariadb*
vim php/tasks/main.yml
- name: install php
yum: pkg=php
配置執行劇本檔案
cd /etc/ansible/
vim site.yml
- hosts: mysql
remote_user: root
roles:
- httpd
- mysql
- php
執行劇本
[[email protected] ansible]# ansible-playbook site.yml --syntax-check
playbook: site.yml
[[email protected] ansible]# ansible-playbook site.yml
PLAY [mysql] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.10.13]
TASK [install httpd] ***********************************************************
changed: [192.168.10.13]
TASK [install mysql] ***********************************************************
ok: [192.168.10.13]
TASK [install php] *************************************************************
changed: [192.168.10.13]
PLAY RECAP *********************************************************************
192.168.10.13 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
到指定的主機進行驗證:
[[email protected] ~]# rpm -qa httpd
httpd-2.4.6-95.el7.centos.x86_64
[[email protected] ~]# rpm -qa php
php-5.4.16-48.el7.x86_64
[[email protected] ~]# cd /etc/my.cnf.d/
[[email protected] my.cnf.d]# ll
total 4
-rw-r--r--. 1 root root 232 Apr 30 2017 mysql-clients.cnf