ansible使用二(ansible playbook)

ansible playbookhtml

 

    ansible playbooks 是使用ansible簡單的配置管理部署系統的基礎,使用YAML語法格式的配置文件。每個playbook中包含一系列的任務。使用ansible playbook能夠更方便的管理、維護多態主機。node

一、yaml語法
    yaml是」YAML Ain't a Markup Language」的縮寫,即不是一種標記性語言,它是一種直觀的可以被電腦識別的數據序列化格式,是一個可讀性高而且容易被人類閱讀,容易和腳本語言交互,用來表達資料序列的編程語言。linux

yaml編寫playbook配置文件的規範:git

(1)首行以」---」(3個減號)開始,且需頂行首寫。web

(2)使用#號註釋代碼。正則表達式

(3)縮進必須是統一的,不能空格和tab混用編程

(4)縮進的級別也必須是一致的,一樣的縮進表明一樣的級別,程序判別配置的級別是經過縮進結合換行來實現的。centos

(5)YAML文件內容和Linux系統大小寫判斷方式保持一致,是區別大小寫的,k/v的值均需大小寫敏感。安全

(6)k/v的值可同行寫也可換行寫。同行使用:分隔,換行寫須要以」-」分隔。服務器

(7)一個完整的代碼塊功能需最少元素需包括 name: task。

(8)一個name只能包括一個task

二、編寫執行ansible playbook
(1)使用ansible playbook安裝啓動httpd服務

---
#定義主機及主機組
- hosts: test
#定義執行任務的用戶
remote_user: root
#編排執行的任務
tasks:
- name: install httpd
yum: name=httpd state=latest
- name: httpd configure
copy: src=/home/dayi123/ansible/httpd.conf dest=/etc/httpd/conf/ backup=yes
when: ansible_distribution_major_version == "6"
notify:
- restart httpd
- name: start httpd
service: name=httpd state=started
#和前面的notify時配合使用的,當配置發生變化時,執行 handlers中的任務
handlers:
- name: restart httpd
service: name=httpd state=restarted
(2)Playbook的主要組成元素

    Hosts: 運行指定任務的目標主機,能夠是主機,也能夠是主機組,支持正則表達式。

    Tasks: 任務列表,一個playbook配置文件中只能有一個tasks,一個tasks下能夠編排多個任務。

    Varniables: 變量

   Templates: 模板,使用templates能夠針對不一樣的主機定製不一樣參數。

   Handlers: 由特定條件觸發的任務,監控資源改變時纔會觸發,須要配合notify使用。

   Roles: Playbook的按固定目錄結構組成

(3)執行playbook

    playbook執行時使用」ansible-playbook」命令後跟寫好的yaml格式的playbook文件便可,但在執行前最好檢查下playbook文件語法是否正確

#檢查playbook配置語法是否正確
ansible-playbook web.yaml -C
#執行playbook
ansible-playbook web.yaml
playbook在執行時還能夠跟其餘的一些選項:

    1)指定執行的主機或主機組:

      playbook在執行時默認會在據配置文件在」hosts」中定義的主機及主機組上去執行,若是不想在配置文件中指定的主機上去執行,可使用」--limit」指定主機。

#查看執行時受影響的主機
[root@ansible-server]# ansible-playbook web.yaml --list-hosts
#指定主機或主機組去執行
[root@ansible-server]# ansible-playbook web.yaml --limit test2
    2)指定執行playbook的用戶

      playbook在執行時默認會使用配置文件中」remote_user」指定的用戶去執行,若是想使用別的用戶去執行,可使用參數」--remote-user」指定用戶去執行。若是使用參數指定的用戶沒有作ssh安全認證,則可使用參數」--ask-sudo-pass」在執行命令時根據提示輸入密碼便可正常執行。

#指定沒有作ssh公私鑰認證的用戶執行playbook
[liuyi@ansible-server ~]$ ansible-playbook web.yaml --sudo --sudo-user=dayi123 --ask
    3)執行playbook時傳入變量

   執行playbook時,若是在」hosts」配置文件中及playbook中定義了變量並在執行時參入變量,則優先使用執行時用參數傳入的變量,其次使用playbook中的變量,最後使用」inventory」文件中定義的變量。

   在執行playbook時可使用」-e」選項後跟」key1=value1,key2=value2」的方式傳入變量。

#修改全部的http服務的端口爲2345
ansible-playbook web.yaml -e "serverport=23456"
    4)其餘可以使用的選項

          -i(--inventory=PATH):指定inventory文件,默認文件是/etc/ansible/hosts

         -v(--verbose):顯示詳細的輸出,也可以使用-vvvv顯示精確到每分鐘的輸出

         -f(--forks=NUM):指定併發執行的任務數,默認爲5,可根據服務器的性能進行調節

         -C(--check):檢測模式,playbook中定義的全部任務將在每臺遠程主機上進行檢測,但不執行。

三、ansible template模塊
    template模塊能夠將帶有參數的配置文件傳遞到目標地址,能夠對文件進行屬組屬主的修改以及備份。使用了Jinjia2格式做爲文件模版(即以」.j2」結尾的文件),進行文檔內變量的替換。

(1)template模塊選項

    選項:

         dest 遠程節點上用於放置文件位置。

        group 設置遠程節點上的的template文件的所屬用戶組

        mode 設置遠程節點上的template文件權限。相似Linux中chmod的用法

        owner 設置遠程節點上的template文件所屬用戶

        src 本地Jinjia2模版的template文件位置。

(2)Jinja2語法格式

    Jinja2調用變量時使用」{{ 變量名 }}」的格式來引用變量,並可使用算術運算符(+ - * / % ** )、比較操做符(== >= != <= < > )、邏輯運算符(And or not)和流程表達式(for if when)。

  根據hosts文件中定義的變量針對不一樣的主機修改httpd服務爲不一樣的端口:

#hosts定義的變量
[test]
10.0.0.13 servername=ansible-client01 serverport=6666
10.0.0.14 servername=ansible-client02 serverport=8888
10.0.0.8 servername=ansible-server serverport=9999
#模板文件中定義的變量
[root@ansible-server ansible]# cat httpd.conf.j2 | grep ^Listen
Listen {{ serverport }}
#playbook的配置
---
- hosts: test
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=latest
- name: httpd configure
#文件拷貝到目標主機後任須要修改成httpd.conf格式
template: src=/home/dayi123/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
handlers:
- name: restart httpd
service: name=httpd state=restarted
使用算術運算符爲每一個服務的端口號加1:

[root@ansible-server ansible]# cat httpd.conf.j2 | grep ^Listen
Listen {{ serverport+1 }}
判斷當系統爲centos6時執行某個任務(判斷的值可使用ansible的setup模塊抓取):

#當系統爲centos6時將配置文件拷貝到遠程主機
- name: httpd configure
tags: confighttpd
template: src=/home/dayi123/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == "6"
判斷語句和for循環語句的使用:

#定義httpd服務虛擬主機的端口,定義兩個端口,一個普通端口,一個https端口
[root@ansible-server ansible]# cat /etc/ansible/group_vars/test
---
serverport: 80
vports:
- 8080
- 443
#定義基於端口的虛擬主機的模板
[root@ansible-server ansible]# tail -13 httpd.conf.j2
#使用for循環語句
{% for vport in vports %}
<VirtualHost {{ ansible_default_ipv4.address }}:{{ vport }}>
ServerName www.{{ ansible_hostname }}.com
DocumentRoot /var/www/html
#若是沒有定義accesslog,則使用默認的日誌/var/log/httpd/access_log
{% if accesslog is not defined %}
CustomLog {{ accesslog | default('/var/log/httpd/access_log') }} combined
{% endif %}
<Directory "/var/www/html/">
Require All granted
</Directory>
</VirtualHOst>

{% endfor %}
四、playbook變量
    ansible中的變量命名規則與linux操做系統的變量命名規則相似,變量的命名要以英文大小寫字母開頭,中間可包含下劃線或數字。ansible playbook的變量可定義在inventory中,也可在執行playbook時傳入或者定義在playbook中。

(1)變量定義在playbook中

   變量能夠直接定義在playbook中,定義的方法以下:

- hosts: "*"
vars:
- serverport: 999
變量也能夠定義在別yaml的文件中,在playbook的配置文件中導入

#定義端口的yaml文件
[root@ansible-server ansible]# cat serverport.yaml
---
serverport: 1024
#在playbook中導入配置文件
---
- hosts: "*"
vars_files:
- serverport.yaml
(2)在inventory中定義變量

    inventory文件一般指ansible主機和組的定義文件hosts,定義變量時使用」=」爲變量賦值,變量一般定義在主機名的後面或組的下方。

#在inventory(hosts)中定義主機變量
[test]
10.0.0.13 servername=ansible-client01
10.0.0.14 servername=ansible-client02
#在inventory(hosts)中定義組變量
[test:vars]
httpdserver_port=8080
    ansible官方並不建議直接在hosts文件中定義變量,執行ansible命令時,ansible會從」/etc/ansible/host_vars/」和」/etc/ansible/group_vars/」目錄下讀取文件,這兩個文件分別爲主機的變量定義目錄和組的變量定義目錄,若是這兩個目錄不存在,可直接手工建立。這兩個目錄下定義的變量爲以組名或者以主機名爲文件名的yaml格式的文件。

#定義」test」組的變量
[root@ansible-server ansible]# cat /etc/ansible/group_vars/test
---
serverport: 8080
(3)在運行playbook時,可以使用-e參數或」--extra-vars」傳入變量。

五、playbook tags標籤
    默認狀況下,Ansible在執行一個playbook時,會執行playbook中定義的全部任務,使用tags能夠給roles、文件、某個單獨的任務以及整個playbook 打上標籤,而後利用這些標籤指定要運行playbook中的某個任務或不執行某個任務。

#給某些任務打上標籤
tasks:
- name: install httpd
tags: installhttpd
yum: name=httpd state=latest

- name: httpd configure
tags: confighttpd
template: src=/home/dayi123/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == "6"

- name: start httpd
tags: reloadhttpd
service: name=httpd state=restarted
執行時跳過某個任務:

#執行時跳過安裝
[root@ansible-server ansible]# ansible-playbook web.yaml --skip-tags "installhttpd"
執行時只執行某些任務

#只執行confighttpd和reloadhttpd標籤裏面的任務
[root@ansible-server ansible]# ansible-playbook web.yaml --tags "confighttpd,reloadhttpd"
六、playbook debug
    在使用ansible playbook時,一個playbook中能夠包含多個任務,任務執行完,咱們並不知道任務的具體執行結果,使用playbook debug能夠將某個任務的執行結果或者咱們須要的信息打印出來。

    參數:

       msg:調試輸出的消息

       var:將某個任務執行的輸出做爲變量傳遞給debug模塊,debug會直接將其打印輸出

       verbosity:debug的級別(默認是0級,所有顯示)

(1)playbook debug 結合註冊變量register打印日誌

    在playbook運行的過程當中,一個任務能夠經過」register」註冊一個變量來任務運行的結果,同時註冊變量的結果也能夠經過debug打印出來。

- name: httpd configure
template: src=/home/dayi123/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
# 定義一個記錄執行結果的變量
register: copy_configuer_log
# 將執行結果打印出來
- name: show copy configure log
debug: var=copy_configuer_log
使用msg打印自定義的信息

打印自定義信息,也能夠根據ansible setup模塊打印出來的信息進行調用。

#打印主機的遠程uuid及mac地址。
- name: show host
debug: msg="uuid:{{ ansible_product_uuid }} hostname:{{ ansible_nodename }}"
七、ansible playbook迭代
    當有須要重複性執行的任務時,可使用迭代機制。其使用格式爲將須要迭代的內容定義爲item變量引用,並經過with_items語句來指明迭代的元素列表便可。                      

#使用迭代的方式安裝多個軟件 - name: yum install yum: name={{ item }} state=present with_items: - git - curl #批量添加用戶 - name: user add user: name={{ item.name }} state=present groups={{ item.groups }} with_items: - { name: 'user01',groups: 'dayi123' } - { name: "user02",groups: 'dayi123' }

相關文章
相關標籤/搜索