選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
5 分鐘閱讀時間 (954 個字)

Ansible #14 - Playbook [1]

shutterstock_198004562
  • 前面花了不少篇幅在講 Ad-Hoc 指令,是為了讓大家熟悉 Ansible 的一些概念,像是 Inventory, Group, Module ... 等

    • 但 Ad-Hoc 會有什麼問題呢?

      • 不知各位有沒有想過,如果都是 Ad-Hoc 指令,那不就跟寫一般的 shell script 一樣嗎?
      • 那我們還要特別記有哪些 Module 可以用,而且指令都是 hardcode,如果要抽換,或是有很多同樣的事情要做,該不會又回到了 shell 的世界?
    • 沒錯…Ad-Hoc 充其量只是讓你初步知道 Ansible 的威力

      • 在 Ansible 的世界裡,組態的維護檔被稱作 playbook

      • 它記錄了一連串要執行的任務來達到你想要的狀態,就好比籃球場上的戰術執行,是為了得分或是防守成功

      • Playbook 是以 YAML 的型式撰寫的,而且 playbook 可以再引用 playbook,達到共用的效果

      • 以下是一段再常見不過的 shell script:

          # Install apache
          yum install --quiet httpd httpd-devel
        
          # Copy configuration files.
          cp httpd.conf /etc/httpd/conf/httpd.conf
          cp httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf
        
          # Start Apache and configure it to run at boot.
          service httpd start
          chkconfig httpd on
      • 如果換成 playbook 的型式會是如何呢?

          ---
          - hosts: all
        
            tasks:
              - name: Install Apache.
                command: yum install --quiet -y httpd httpd-devel
              - name: Copy configuration files.
                command: cp httpd.conf /etc/httpd/conf/httpd.conf
              - command: cp httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf
              - name: Start Apache and configure it to run at boot.
                command: service httpd start
              - command: chkconfig httpd on
      • 呃 ... 這不是只是換了個語言寫而已嗎?

        • 沒錯!所以只要你會寫 shell script,你就會寫 ansible playbook
        • 此外,不太一樣的是每一個 task 都有一個 name
      • 下面我們將透過 Ansible 的 module 來優化這個 playbook,否則就沒必要用了不是嗎? 說好的 Idempotence

          ---
          - hosts: all
            become: yes
        
            tasks:
              - name: Install apache
                yum: name={{ item }} state=present
                with_items:
                  - httpd
                  - httpd-devel
              - name: Copy configuration files
                copy:
                  src: "{{ item.src }}"
                  dest: "{{ item.dest }}"
                  owner: root
                  group: root
                  mode: 0644
                with_items:
                  - src: "httpd.conf"
                    dest: "/etc/httpd/conf/httpd.conf"
                  - src: "httpd-vhosts.conf"
                    dest: "/etc/httpd/conf/httpd-vhosts.conf"
        
              - name: Make sure Apache is started now and at boot.
                service: name=httpd state=started enabled=yes

        • 如上圖可以看到 3 個 task 有 2 個成功,但有一個失敗了,那個失敗是因為我亂給設定檔 XD
      • 如果我們再執行一次呢?

        • 看似一樣的結果,但注意 changed 是 0
        • 這是因為上一次的執行有成功的已經達成所定義的狀態了,而失敗的依舊是失敗
        • 圖中我們有看到一些 deprecated 的寫法,那個暫時不重要,依它的說明調整那些 warning 就會消失了
    • 上面的範例主要有幾個大重點:

      • 第一列的 3 個 hyphen 是告知大家這個是一個 YAML 檔(前面的篇章有提過)
      • 第二列的 hosts 指的是 這個 playbook 會作用在什麼群組上,all 代表所有在 hosts 這個檔案裡的機器(我們的指令有 -i 指定 inventory)
      • 第三列的 become: yes 代表的是 sudo 權限執行(前面的篇章提過)
      • 第五列的 tasks,是代表接下來會有一系列的任務
      • 第 1 個任務就是安裝 Apache,但留意先出現的 name 它不是個 module,它是註解說明用的,而且執行 playbook 時會出現在畫面上
      • 接著就是使用 yum 這個 module,安裝什麼呢? 在兩個 curly braces 中間的 item,而且它的 state 必須是 present(如果是 absent 就是移除,如果是 latest 就是最新的版本)
      • item 會搭配著下面的 with_items 陣列(等同於 JSON 的 [item1, item2, ...]),像是迴圈般逐一安裝需要的套件
      • 接著的 copy module 跟 service module 我想就不言而寓了吧
      • 最後很重要的一點前面提過了,就是這個腳本不管執行幾次,都會是同樣的結果
  • 以上是第一個 playbook,希望各位可以自行操作看看

    • 下一個篇章將建立一個非常簡單的 Hello World 網頁
    • 承上,再多認識一些 playbook 的用法 ... playbook 可不是只有這樣而已呢!
Ansible # 15 - Playbook [2]
Ansible #13 - Ad-Hoc 指令[Windows篇]

相關文章

 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2024/05/02, 週四

Captcha 圖像