Ansible之Playbook詳解、案例

playbook-劇本 介紹

playbooks是 一個不一樣於使用Ansible命令行執行方式的模式,其功能更強大靈活。簡單來講,playbook是一個很是簡單的配置管理和多主機部署系統,不一樣於任何已經存在的模式,可做爲一個適合部署複雜應用程序的基礎。Playbook能夠定製配置,能夠按照指定的操做步驟有序執行,支持同步和異步方式。值得注意的是playbook是經過YAML格式來進行描述定義的。
mysql

  • 核心元素

Tasks:任務,由模板定義的操做列表
Variables:變量
Templates:模板,即便用模板語法的文件
Handlers:處理器 ,當某條件知足時,觸發執行的操做
Roles:角色linux

  • hosts和users介紹
  • 在playbook中的每個play均可以選擇在哪些服務器和以什麼用戶完成,hosts一行能夠是一個主機組、主機、多個主機,中間以冒號分隔,可以使用通配模式。其中remote_user表示執行的用戶帳號。sql

    ---
    - hosts: abc               #指定主機組,能夠是一個或多個組。
        remote_user: root                #指定遠程主機執行的用戶名
  • 指定遠程主機sudo切換用shell

    # vim ping.yml
    ---
    - hosts: abc
        remote_user: root            
        become: yes                #2.6版本之後的參數,以前是sudo,意思爲切換用戶運行
        become_user: mysql          #指定sudo用戶爲mysql
    
    執行playbook
    # ansible-playbook ping.yml -K
  • Tasks list 和action介紹

1:Play的主體部分是task列表,task列表中的各任務按次序逐個在hosts中指定的主機上執行,即在全部主機上完成第一個任務後再開始第二個任務。
在運行playbook時(從上到下執行),若是一個host執行task失敗,整個tasks都會回滾,請修正playbook 中的錯誤,而後從新執行便可。
Task的目的是使用指定的參數執行模塊,而在模塊參數中可使用變量,模塊執行時冪等的,這意味着屢次執行是安全的,由於其結果一致。
2:每個task必須有一個名稱name,這樣在運行playbook時,從其輸出的任務執行信息中能夠很好的辨別出是屬於哪個task的。若是沒有定義name,‘action’的值將會用做輸出信息中標記特定的task。
3:定義一個task,常見的格式:」module: options」 例如:yum: name=httpd
4:ansible的自帶模塊中,command模塊和shell模塊無需使用key=value格式apache

  • 經常使用命令
  • ansible-playbook [yaml文件名、也能夠yml結尾]
  • 例如:ansible-playbook a.yml
  • 參數:vim

    -k(–ask-pass) 用來交互輸入ssh密碼
    -K(-ask-become-pass) 用來交互輸入sudo密碼
    -u 指定用戶安全

    # ansible-playbook a.yml --syntax-check    #檢查yaml文件的語法是否正確
        # ansible-playbook a.yml --list-task       #檢查tasks任務
        # ansible-playbook a.yml --list-hosts      #檢查生效的主機
        # ansible-playbook a.yml --start-at-task='Copy Nginx.conf'     #指定從某個task開始運行
  • 示例服務器

    # vim a.yml
    ---
    - hosts: 192.168.200.129                  //指定主機
        remote_user: root                         //指定在被管理的主機上執行任務的用戶
        tasks:                                            //任務列表↓
         - name: disable selinux                //任務名關閉防火牆
           command: '/sbin/setenforce 0'    //調用command模塊 執行關閉防火牆命令
         - name: start httpd                         //任務名 開啓httpd
           service: name=httpd state=started         //調用service模塊 開啓httpd 服務
    # ansible-playbook a.yml --syntax-check    #檢查yaml文件的語法是否正確
    # ansible-playbook a.yml

Ansible之Playbook詳解、案例
Ansible之Playbook詳解、案例

  • play中只要執行命令的返回值不爲0,就會報錯,tasks中止,能夠添加下面
  • ignore_errors: True #忽略錯誤,強制返回成功

Ansible之Playbook詳解、案例
Ansible之Playbook詳解、案例


  • Handlers介紹
  • andlers也是一些task的列表,和通常的task並無什麼區別。
  • 是由通知者進行的notify,若是沒有被notify,則Handlers不會執行,假如被notify了,則Handlers被執行
  • 無論有多少個通知者進行了notify,等到play中的全部task執行完成以後,handlers也只會被執行一次
  • 示例

Ansible之Playbook詳解、案例

  • 引用變量
  • 使用:vars: 添加變量

Ansible之Playbook詳解、案例

  • 直接引用Ansible變量
  • ansible_all_ipv4_addresses 獲取IP

Ansible之Playbook詳解、案例

  • 引用主機變量
  • 在組的主機後面添加變量ssh

    # vim /etc/ansible/hosts

    Ansible之Playbook詳解、案例

    # vim c.yml
    # ansible-playbook c.yml  //執行這個劇本

Ansible之Playbook詳解、案例

  • 查看這個生成的文件
    Ansible之Playbook詳解、案例



條件判斷異步

  • when的值是一個條件表達式,若是條件判斷成立,這個task就執行,若是判斷不成立,則task不執行
  • 若是須要根據變量、facts(setup)或此前任務的執行結果來做爲某task執行與否的前提時要用到條件測試,在Playbook中條件測試使用when子句。
  • 在task後添加when子句便可使用條件測試:when子句支持jinjia2表達式或語法,例如:

Ansible之Playbook詳解、案例

  • 多條件判斷

Ansible之Playbook詳解、案例

  • 組條件判斷

Ansible之Playbook詳解、案例

  • 自定義條件判斷
    Ansible之Playbook詳解、案例


  • 迭代
  • 有須要重複性執行的任務時,可使用迭代機制。其使用格式爲將須要迭代的內容定義爲item變量引用,並經過with_items語句指明迭代的元素列表便可。
  • 示例:
    Ansible之Playbook詳解、案例

Ansible之Playbook詳解、案例


  • Templates介紹
  • Jinja是基於Python的模板引擎。template類是Jinja的另外一個重要組件,能夠看做一個編譯過的模塊文件,用來生產目標文本,傳遞Python的變量給模板去替換模板中的標記。

    # scp root@192.168.175.130:/etc/httpd/conf/httpd.conf ./templates      //複製被管理端的配置文件到本地
    # vim templates/httpd.conf      //在管理端講配置文件要修改的地方定義變量
    Listen {{http_port}}
    ServerName {{server_name}}
    MaxClients {{access_num}}
  • 在/etc/ansible/hosts 添加變量

    # vim /etc/ansible/hosts
    [abc]
    192.168.200.129 http_port=192.168.200.129:80 access_num=100 server_name="www.yun.com:80"
    # vim apache.yml
    # ansible-playbook apache.yml    #而後執行腳本  而後去abc組的主機上查看下配置文件是否已經改了

Ansible之Playbook詳解、案例


  • Tags介紹
  • 在一個playbook中,咱們通常會定義不少個task,若是咱們只想執行其中的某一個task或多個task時就可使用tags標籤功能了

Ansible之Playbook詳解、案例

# ansible-playbook hosts.yml --tags="only"   //只執行這個標籤上面的任務
  • 事實上,不光能夠爲單個或多個task指定同一個tags。playbook還提供了一個特殊的tags爲always。做用就是當使用always當tags的task時,不管執行哪個tags時,定義有always的tags都會執行。

    Ansible之Playbook詳解、案例

    執行下面命令

    # ansible-playbook hosts.yml --tags="only"    //去被管理主機上查看文件建立狀況 2個tags都會執行
相關文章
相關標籤/搜索