Linux伺服器 Linux伺服器

資工所專業課程上課教材

資工所專業課程 > 課程內容 > 專題 - 使用 Ansible 進行快速佈署 - 重要練習

專題 - 使用 Ansible 進行快速佈署 - 重要練習

上次更新日期 2020/11/10

ansible 如果應用得宜,你伺服器的管理就會變得很簡單。不過,萬事都需要練習!因此,我們就多多來練習吧! 底下會有數個題目,大家可以慢慢實驗慢慢做!希望對大家有幫助啊!

playbook 與變數

  1. 建立專案目錄、建立 inventory、刪除 webserver1 的相關軟體、設計等
    1. 先建立新的 ansible 操作目錄,以及新的 ansible 設定檔、新的 inventory
      $ cd ~; mkdir ansible-playbook-var
      
      $ cd ansible-playbook-var
      $ cp ../ansible-init/ansible.cfg .
      $ cat ansible.cfg
      [defaults]                   # 預設值
      inventory = ./inventory
      remote_user = sysadm
      ask_pass = false
      
      [privilege_escalation]      # 特權升級
      become = true
      become_method = sudo
      become_user = root
      become_ask_pass = false
      
      $ vim inventory
      [website]
      webserver1
      dbserver1
      
      [devel]
      webserver1
      devnode1
      
      $ ansible website --list-hosts
      
    2. 編寫 remove_web_service.yml 的 playbook 檔案,將 webserver1 的相關資料刪除較佳:
      $ vim remove_web_service.yml
      ---
        - name: remove web server packages
          hosts:
            - webserver1
          vars:
            pkgs:
              - httpd
              - php
              - mariadb-server
              - mariadb
              - mod_ssl
          tasks:
            - name: remove index.html
              file:
                path: /var/www/html/index.html
                state: absent
            - name: remove /var/www/https
              file:
                path: /var/www/https
                recurse: true
                state: absent
            - name: remove apache.pw
              file:
                path: /var/www/apache.pw
                state: absent
            - name: remove virhosts.conf
              file:
                path: /etc/httpd/conf.d/virhosts.conf
                state: absent
            - name: remove packages
              yum:
                name: "{{pkgs}}"
                state: removed
            - name: firewalld
              firewalld:
                immediate: true
                permanent: true
                service: http
                state: disabled
            - name: firewalld
              firewalld:
                immediate: true
                permanent: true
                service: https
                state: disabled
      
      $ ansible-playbook remove_web_service.yml
      
  2. 任務規劃:任務在建立 web server,具有某些特殊功能
    1. 針對 webserver1 的服務建立 - 啟用虛擬主機 (virtualhost)
      • 啟用 https 服務,可以讓使用者使用 https://webserver1 瀏覽
      • 讓 http 與 https 瀏覽分開,讓 http://webserver1 可以前往 /var/www/html, 而 https://webserver1 可以前往 /var/www/https。
      • 上述工作需要使用 apache 的 VirtualHost 的功能,因此,我們需要建立 virhosts.conf 的檔案,內容就是 apache 根據不同協定或主機名稱而指定不同目錄的方式。
    2. 增加 https://webserver1 的瀏覽需要輸入 apache 密碼 - Apache 認證:
      • Apache 認證除了 httpd.conf 需要設定,也能夠透過上述 virhosts.conf 去設定即可,這是第一個要進行的任務。
      • 在需要登入帳密的目錄,在本例中會使用 /var/www/https 目錄作為密碼登入目錄,此時,該目錄底下需要一個名為 .htaccess 的檔案,記載如何驗證的方式。
      • 登入需要帳號與密碼檔,這個檔案一般需要屬於 apache 可以讀寫的狀態。可以放在 /etc/httpd 底下, 也可以放置到 /var/www 底下。我們預計建立 apache.pw 檔案,預設放置到 /var/www/apache.pw 這個檔名上面。 這個檔案裡面記載了帳號 guest 與密碼 okmain 的紀錄
    3. 在 control node 上面,驗證 managed host 的 www service 是否建立成功:
      • 先檢查 http://webserver1 是否回傳正確的內容,假設內容為『 I am http service 』
      • 不使用密碼的方式登入 https://webserver1 ,看看是否回傳正確內容,假設內容為『 Using https service 』
      • 不想要讓帳號密碼被偷看,因此建立 ansible vault 加密的設定檔,檔名就指定為 mysec.yml,內容以 YAML 語法寫上帳密。 若回傳正確內容的話,代表帳號密碼是正確無誤的!
  3. 事先建立本案例所有需要的檔案,這些檔案基本上與專案 (apache) 有關,但是跟 ansible 本身無關喔!
    1. 建立虛擬主機與身份驗證所需要的 AuthConfig 功能:
      $ vim files/virhosts.conf
      # 規範一般連線 http: 的連線位置
      <VirtualHost *:80>
              DocumentRoot /var/www/html
              ServerName   webserver1
      </VirtualHost>
      
      # 規範加密連線 https: 的連線位置
      <VirtualHost *:443>
              DocumentRoot /var/www/https
              ServerName   webserver1
      </VirtualHost>
      
      # 規範此目錄底下可以使用 .htaccess 改寫驗證 (AuthConfig) 的設計
      <Directory "/var/www/https">
      	Options Indexes FollowSymLinks
      	AllowOverride AuthConfig
      </Directory>
      
    2. 建立認證檔的 .htaccess 的檔案內容,這個檔案先以非隱藏檔處理
      $ vim files/htaccess
      AuthType        basic
      AuthName        "Input your password"
      AuthUserFile    /var/www/apache.pw
      require valid-user
      
    3. 建立密碼檔,這需要 httpd-tools 的支援才可以!
      $ htpasswd -c files/apache.pw guest
      New password:           <==輸入 okmain
      Re-type new password:   <==輸入 okmain
      Adding password for user guest
      $ 
      
  4. 建立 ansible 的 playbook 檔案:
    1. 事先設計需要的變數與相關的設定檔案資料:
      web_pkg1 = httpd                                  # web 服務所需要的軟體與服務名稱
      web_pkg2 = php
      web_pkg3 = mod_ssl
      web_srv = httpd
      web_vhost_src =  files/virhosts.conf              # 設定檔的來源與目標位置放置處
      web_vhost_dest = /etc/httpd/conf.d/virhosts.conf
      web_access_src = files/htaccess                   # 控制登入設定的檔案來源與目標放置處
      web_access_dest = /var/www/https/.htaccess
      web_pwfile_src = files/apache.pw                  # Apache 密碼檔來源與目標位置放置處
      web_pwfile_dest = /var/www/apache.pw
      web_root1 = /var/www/html                         # 非加密 root1 與加密 root2 的所在根目錄
      web_root2 = /var/www/https
      fire_pkg = firewalld                              # 防火牆的軟體與服務名稱
      fire_srv = firewalld
      
    2. 假設檔名為 create_web_server.yml 好了,編寫第一個 play, play 名稱可以隨便寫,類似:『 create web server 』也行。 需要注意的是主機名稱,請撰寫 website 主機群組。
    3. 編寫變數資料,將上述預先假定的變數設定帶進來 vars: 這個設定值底下即可。
    4. 開始 tasks 任務的編寫,大致上需要:
      • 第 1 個任務:先安裝所需要的 web 軟體,請使用 web_pkg{1,2,3} 與 fire_pkg 這幾個變數來處理安裝的項目
      • 第 2 個任務:將 virhosts.conf 放置到應該放置的地方,且注意,其擁有者屬於 root:root,權限為 0644 這樣的情境。
      • 第 3 個任務:建立 /var/www/https 這個新的 ssl 支援的目錄,該目錄的擁有者應該是屬於 root:root,且權限應該是要 755 才對喔!
      • 第 4 個任務:將 .htaccess 放置到該目錄內,且權限應該是要 644 即可!擁有者保留預設值
      • 第 5 個任務:將 apache.pw 放置到正確的位置上,且擁有者為 apache:apache,權限為僅有 apache 可以唯讀
      • 第 6 個任務:建立 root1 非加密的首頁內容,記得內容寫上『 I am http service 』即可。
      • 第 7 個任務:建立 root2 加密的首頁內容,內容填寫上『 My IP: 正確IP,\n this is https service』
      • 第 8 個任務:啟動 web_srv 服務,記得需要啟動,而且需要開機就啟動!
      • 第 9 個任務:啟動 firewall 服務,記得需要啟動,而且需要開機就啟動!
      • 第 10 個任務:防火牆放行 http 服務
      • 第 11 個任務:防火牆放行 https 服務
    5. 在同一個檔案裡面開始編寫第二個 play,名稱可以寫成『 check web server url content 』,針對的主機其實是 localhost,預計的作法, 是透過 control node 本機去檢查 managed hosts 設計的 web server 服務是否正確的意思。因為是用戶端進行測試而已,所以不要切換成為 root (become: false) 才對喔!
    6. 我們不想讓人家知道 apache 的登入密碼,因此,將帳號與密碼都寫入到 files/secure.yml 檔案中,所以,這裡請以 vars_files 規範這個帳密檔案。 該 secure.yml 裡面設計了 web_user, web_pass 兩個變數。
    7. 開始 tasks 任務的編寫,主要就是 (1)瀏覽 http 目錄; (2)不登入瀏覽 https 目錄; (3)登入瀏覽 https 目錄。
      • 第 1 個任務,使用 uri 模組,直接瀏覽 http 目錄,網址應該是 http://webserver1/index.html 才對, 且回傳碼必須是正確的 200,而且需要回傳瀏覽內容 (return_content)。
      • 使用註冊 (register) 變數的方式,註冊瀏覽內容
      • 第 2 個任務,使用 debug 模組,將剛剛的內容僅擷取 content (return_content.content) 的方式,將內容顯示出來。
      • 第 3 個任務,使用 rui 模組,直接瀏覽 https 目錄,網址應該是 https://webserver1/index.html 才對。 指定『 validate_certs: false 』,不須嚴格認證 ssl 之意,因為假定判斷會驗證失敗,所以,回傳碼需要驗證失敗的 401 , 同時需要回傳瀏覽內容
      • 使用註冊 (register) 變數的方式,註冊瀏覽內容
      • 第 4 個任務,使用 debug 模組,將剛剛的內容僅擷取 content (return_content.content) 的方式,將內容顯示出來。
      • 第 5 個任務,使用 rui 模組,直接瀏覽 https 目錄,網址應該是 https://webserver1/index.html 才對。 指定『 validate_certs: false 』,不須嚴格認證 ssl 之意,指定『 force_basic_auth: true 』,強迫需要帳密登入驗證, 設計 user: "{{ web_user }}"",設計 password: "{{ web_pass }}" ,同時需要回傳瀏覽內容
      • 使用註冊 (register) 變數的方式,註冊瀏覽內容
      • 第 6 個任務,使用 debug 模組,將剛剛的內容僅擷取 content (return_content.content) 的方式,將內容顯示出來。
    8. 開始設計 files/secure.yml,這個檔案需要加密喔!所以使用 ansible-vault 處理。同時,先編寫密碼檔,處理流程如下:
      $ vim files/mypass.txt
      centos
      
      $ chmod 400 files/mypass.txt
      
      $ ansible-vault create --vault-password-file=files/mypass.txt files/secure.yml
        web_user: guest
        web_pass: okmain
      
    9. 檢測看看 create_web_server.yml 有沒有語法的問題,若沒有問題,就直接執行看看:
      $ ansible-playbook --vault-password-file=files/mypass.txt \
      > --syntax-check create_web_server.yml
      
      playbook: create_web_server.yml
      
      $ ansible-playbook --vault-password-file=files/mypass.txt create_web_server.yml
      PLAY [create web server] ************************************************************
      
      TASK [Gathering Facts] **************************************************************
      ok: [dbserver1]
      ok: [webserver1]
      
      TASK [install apache packages] ******************************************************
      ok: [dbserver1]
      ok: [webserver1]
      
      TASK [create virtual host and directory settings] ***********************************
      ok: [dbserver1]
      ok: [webserver1]
      
      TASK [create /var/www/https] ********************************************************
      ok: [webserver1]
      ok: [dbserver1]
      
      TASK [copy htaccess to .htaccess] ***************************************************
      ok: [webserver1]
      ok: [dbserver1]
      
      TASK [copy password file] ***********************************************************
      ok: [webserver1]
      ok: [dbserver1]
      
      TASK [create http index.html] *******************************************************
      ok: [webserver1]
      ok: [dbserver1]
      
      TASK [create https index.html] ******************************************************
      ok: [webserver1]
      ok: [dbserver1]
      
      TASK [start web service] ************************************************************
      ok: [webserver1]
      ok: [dbserver1]
      
      TASK [start firewalld] **************************************************************
      ok: [dbserver1]
      ok: [webserver1]
      
      TASK [firewalld release http] *******************************************************
      ok: [dbserver1]
      ok: [webserver1]
      
      TASK [firewalld release https] ******************************************************
      ok: [webserver1]
      ok: [dbserver1]
      
      PLAY [check web server url content] *************************************************
      
      TASK [Gathering Facts] **************************************************************
      ok: [localhost]
      
      TASK [brows http dir] ***************************************************************
      ok: [localhost]
      
      TASK [show content] *****************************************************************
      ok: [localhost] => {
          "return_content.content": "I am http service"
      }
      
      TASK [brows https dir] **************************************************************
      ok: [localhost]
      
      TASK [show content] *****************************************************************
      ok: [localhost] => {
          "return_content.content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">
      \n<html><head>\n<title>401 Unauthorized</title>\n</head>
      <body>\n<h1>Unauthorized</h1>\n<p>This server could not verify 
      that you\nare authorized to access the document\nrequested.  Either you supplied the 
      wrong\ncredentials (e.g., bad password), or your\nbrowser doesn't understand how to 
      supply\nthe credentials required.</p>\n</body></html>\n"
      }
      
      TASK [brows https dir] **************************************************************
      ok: [localhost]
      
      TASK [show content] *****************************************************************
      ok: [localhost] => {
          "return_content.content": "My IP: 172.17.200.1\n This is https service"
      }
      
      PLAY RECAP **************************************************************************
      dbserver1  : ok=12 changed=0  unreachable=0  failed=0 skipped=0  rescued=0  ignored=0
      localhost  : ok=7  changed=0  unreachable=0  failed=0 skipped=0  rescued=0  ignored=0
      webserver1 : ok=12 changed=0  unreachable=0  failed=0 skipped=0  rescued=0  ignored=0
      
      你有可能需要反覆不斷的重新執行這個 playbook 之後,才有辦法慢慢克服這些問題點!最終才能將整個 playbook 寫完整喔!

....


  • 2020/11/10:加入第一個大練習!真的是相當有趣!