專題 - 使用 Ansible 進行快速佈署 - 重要練習
上次更新日期 2020/11/10
ansible 如果應用得宜,你伺服器的管理就會變得很簡單。不過,萬事都需要練習!因此,我們就多多來練習吧! 底下會有數個題目,大家可以慢慢實驗慢慢做!希望對大家有幫助啊!
playbook 與變數
- 建立專案目錄、建立 inventory、刪除 webserver1 的相關軟體、設計等
- 先建立新的 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
- 編寫 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
- 先建立新的 ansible 操作目錄,以及新的 ansible 設定檔、新的 inventory
- 任務規劃:任務在建立 web server,具有某些特殊功能
- 針對 webserver1 的服務建立 - 啟用虛擬主機 (virtualhost)
- 啟用 https 服務,可以讓使用者使用 https://webserver1 瀏覽
- 讓 http 與 https 瀏覽分開,讓 http://webserver1 可以前往 /var/www/html, 而 https://webserver1 可以前往 /var/www/https。
- 上述工作需要使用 apache 的 VirtualHost 的功能,因此,我們需要建立 virhosts.conf 的檔案,內容就是 apache 根據不同協定或主機名稱而指定不同目錄的方式。
- 增加 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 的紀錄
- 在 control node 上面,驗證 managed host 的 www service 是否建立成功:
- 先檢查 http://webserver1 是否回傳正確的內容,假設內容為『 I am http service 』
- 不使用密碼的方式登入 https://webserver1 ,看看是否回傳正確內容,假設內容為『 Using https service 』
- 不想要讓帳號密碼被偷看,因此建立 ansible vault 加密的設定檔,檔名就指定為 mysec.yml,內容以 YAML 語法寫上帳密。 若回傳正確內容的話,代表帳號密碼是正確無誤的!
- 針對 webserver1 的服務建立 - 啟用虛擬主機 (virtualhost)
- 事先建立本案例所有需要的檔案,這些檔案基本上與專案 (apache) 有關,但是跟 ansible 本身無關喔!
- 建立虛擬主機與身份驗證所需要的 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>
- 建立認證檔的 .htaccess 的檔案內容,這個檔案先以非隱藏檔處理
$ vim files/htaccess AuthType basic AuthName "Input your password" AuthUserFile /var/www/apache.pw require valid-user
- 建立密碼檔,這需要 httpd-tools 的支援才可以!
$ htpasswd -c files/apache.pw guest New password: <==輸入 okmain Re-type new password: <==輸入 okmain Adding password for user guest $
- 建立虛擬主機與身份驗證所需要的 AuthConfig 功能:
- 建立 ansible 的 playbook 檔案:
- 事先設計需要的變數與相關的設定檔案資料:
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
- 假設檔名為 create_web_server.yml 好了,編寫第一個 play, play 名稱可以隨便寫,類似:『 create web server 』也行。 需要注意的是主機名稱,請撰寫 website 主機群組。
- 編寫變數資料,將上述預先假定的變數設定帶進來 vars: 這個設定值底下即可。
- 開始 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 服務
- 在同一個檔案裡面開始編寫第二個 play,名稱可以寫成『 check web server url content 』,針對的主機其實是 localhost,預計的作法, 是透過 control node 本機去檢查 managed hosts 設計的 web server 服務是否正確的意思。因為是用戶端進行測試而已,所以不要切換成為 root (become: false) 才對喔!
- 我們不想讓人家知道 apache 的登入密碼,因此,將帳號與密碼都寫入到 files/secure.yml 檔案中,所以,這裡請以 vars_files 規範這個帳密檔案。 該 secure.yml 裡面設計了 web_user, web_pass 兩個變數。
- 開始 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) 的方式,將內容顯示出來。
- 開始設計 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
- 檢測看看 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:加入第一個大練習!真的是相當有趣!