1. 程式人生 > 其它 >Ansible-Playbook詳解

Ansible-Playbook詳解

技術標籤:自動化運維ansibleplaybook

目錄

一、Playbook 簡介

playbook是由一個或多個"play"組成的列表
play的主要功能在於將預定義的一組主機,裝扮成事先通過ansible中的task定義好的角色。
Task實際是呼叫ansible的一個module,將多個play組織在一個playbook中,

即可以讓它們聯合起來,按事先編排的機制執行預定義的動作
Playbook採用YAML語言編寫

二、Playbook 圖解

在這裡插入圖片描述

使用者通過ansible命令直接呼叫yml語言寫好的playbook,playbook由多條play組成
每條play都有一個任務(task)相對應的操作,然後呼叫模組modules,應用在主機清單上,通過ssh遠端連線
從而控制遠端主機或者網路裝置

三、YAML 介紹

YAML是一個可讀性高的用來表達資料序列的格式。它具備以下特性

  1. YAML的可讀性好
  2. YAML和指令碼語言的互動性好
  3. YAML使用實現語言的資料型別
  4. YAML有一個一致的資訊模型
  5. YAML易於實現
  6. YAML可以基於流來處理
  7. YAML表達能力強,擴充套件性好

四、Playbook 核心元素

Hosts          執行的遠端主機列表(應用在哪些主機上)

Tasks          任務集

Variables      內建變數或自定義變數在playbook中呼叫

Templates模板  可替換模板檔案中的變數並實現一些簡單邏輯的檔案

Handlers和notify結合使用,由特定條件觸發的操作,滿足條件方才執行,否則不執行

tags標籤       指定某條任務執行,用於選擇執行playbook中的部分程式碼。
                ansible具有冪等性,因此會自動跳過沒有變化的部分,
                即便如此,有些程式碼為測試其確實沒有發生變化的時間依然會非常地長。
                此時,如果確信其沒有變化,就可以通過tags跳過此些程式碼片斷
                ansible-playbook -t tagsname useradd.yml

五、Playbook 書寫

5.1 使用變數方法

  • 通過ansible命令傳遞
ansible-playboook test.yaml -e "key=value"
  • yaml直接定義變數
vars:
  key1=value1
  key2=value2
  • 在hosts裡檔案定義

5.2 條件測試

如果需要根據變數、facts (setup)或此前任務的執行結果來作為某task執行與否的前提時要用到條件測試,在Playbook中條件測試使用when子句。在task後新增when子句即可使用條件測試: when子句支援jinjia2表示式或語法。

- hosts: mysql
  remote_user: root
  tasks:
    - name: "shut down Centos 7 systems"
      command: /sbin/shutdown -r now
      when:
        - ansible_distribution == "Centos”
        - ansible_distribution_major_version =="7"

5.3 迭代

當有需要重複性執行的任務時,可以使用迭代機制。其使用格式為將需要迭代的內容定義為item變數引用,並通過with items語句指明迭代的元素

- hosts: webserver
  remote_user: root
  tasks:
    - name: "Add users"
      user: name={{ item.name }}  state=present groups={{ item.groups }}
      with_items:
        - { name:'test1', groups:'wheel'}
          { name:'test2', groups:'root'}

5.4 Templates 模組

vi templates/httpd.conf	//放在管理端
Listen {{http_port}}
ServerName {{server_name}}
MaxClients {{access_num}}

vi /etc/ansible/hosts
[webserver]
192.168.175.130 http_port=10.0.0.101:80 access num=100 server_name="www.cloud.com:80"


- hosts: webserver
  remote_user: root
  vars:
    - package: httpd
    - service: httpd
  tasks:
    - name: install httpd package
      yum: name={{package}} state=latest
    - name: install configure file
      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify:
        - restart httpd
    - name: start httpd server
      service: name={{service}} enabled=true state=started
  handlers:
    - name: restart httpd
      service: name={{service}} state=restarted

5.5 tags 模組

在一個playbook中,我們一般會定義很多個task,如果我們只想執行其中的某一個task或多個task時就可以使用tags標籤功能了

- hosts: webserver
  remote_user: root
  tasks:
    - name: copy hosts file
      copy: src=/etc/hosts dest=/opt/hosts
      tags:
      - only
    - name: touch file
      file: path=/opt/hosts01 state=touch

執行命令:ansible-plavbook hosts.vml --tags="only"

事實上,不光可以為單個或多個task指定同一個tags。playbook還提供了一個特殊的tags為always。作用就是當使用always當tags的task時,永遠執行該要求

六、roles

6.1 簡介

roles能夠根瓶層次型結構自動裝載變數檔案、task以及handlers等。簡單來講,roles就是通過分別將變數、檔案、任務、模組及處知器故置於單獨的目錄中,並可以便速地include它們,roles一直用於基於主機構建

6.2 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檔案,用於定義此角色的特殊設定及其依賴關係。