昨天在 Get Started 中使用 Ansible 的方式叫作 ad-hoc,就是透過 Ansible 命令列,直接以參數的方式讓管理節點執行指令,但一般還是會以設定檔的方式來組織工作內容。Ansible 用於配置任務的設定檔主要有兩個,一個是 inventory,用來組織管理節點,告訴 Ansible 要到那些機器上做事,另一個是 playbook,告訴 Ansible 要在管理節點上進行那些操作。我們先來看一下配置 nginx 範例的 playbook 內容。
web.yml
- name: Configure web server with nginx
hosts: webservers
become: True
tasks:
- name: install nginx
apt: name=nginx update_cache=yes
- name: copy nginx config file
copy: src=files/nginx.conf dest=/etc/nginx/sites-available/default
- name: enable configuration
file: >
dest=/etc/nginx/sites-enabled/default
src=/etc/nginx/sites-available/default
state=link
- name: copy index.html
template: src=templates/index.html.j2 dest=/usr/share/nginx/html/index.html mode=0644
- name: restart nginx
service: name=nginx state=restarted
playbook 是以 YAML 格式寫成的。YAML 和 JSON 一樣,是以鍵值的配對,以及陣列兩種方式組成,但它的鍵值配對會以 key: value 這種方式呈現,而陣列中的每一個元素會以減號 (-) 開頭。字串不需用引號包住,空格縮排則是必要的,用以呈現資料間的階層關係。YAML 格式的設定檔除了 Ansible 外,Docker、Kubernetes 也都會用到,建議花一點時間瞭解,網路上有很多 YAML 格式的詳細說明及教學文件,請再自行查閱。
一個 playbook 由一或多個 play 組成。這裡我們先把 playbook 翻譯成劇本,一個劇本中會包含多個幕或場景 (play),每一幕會有一個角色 (role),就是一組主機 (hosts),以及這個角色所要完成的一或多組任務 (tasks)。範例的 playbook 有一個 play,包含五個 task。像 service、template 這類位於 playbook 中鍵值 (key) 位置的參數名稱,文件有時會稱它們為 directive。雖然還不太明白各個 directive 的詳細作用,我們還是大概看一下這個 playbook 的內容在做些什麼。
這個 play 用來設置 nginx 網頁伺服器,作用在名稱為 webservers 的主機。webservers 代表那些機器是在 inventory 設定檔中定義的。become 設定為 True 表示任務要以 root 權限執行,昨天在 ad-hoc 的執行方式中,也看到 become 這個旗標,取代了舊版的 sudo。要執行的任務包括安裝 nginx、複製 nginx 設定檔、啟用設定值、複製首頁 (index.html) 並重啟 nginx。我們大致上可以由 name 及任務中的 directive 理解這個 playbook 的作用。因為其中有拷貝檔案的任務,將檔案內容列在下面:
nginx.conf
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
server_name localhost;
location / {
try_files $uri $uri/ =404;
}
}
index.html.j2,這是一個 Jinja2 的樣版,因此把副檔名命名為 .j2。
<html>
<head>
<title>Welcome to ansible</title>
</head>
<body>
<h1>nginx, configured by Ansible</h1>
<p>If you can see this, Ansible successfully installed nginx.</p>
<p>{{ ansible_managed }}</p>
</body>
</html>
接下來是定義要佈到那些主機上,使用 inventory 設定檔。定義了一個主機群 webservers,在剛才 playbook 中有用到,包含一台機器 testserver,ansible_host 請修改成 node2 或 node3 的 IP。
hosts
[webservers]
testserver ansible_host=192.168.50.20 ansible_port=22
接下來新建一個專案目錄。Ansible 有一些存放各類型檔案位置目錄的慣例,因此我們將這四個檔案依下列架構放到專案目錄中。
現在可以來執行這個 playbook 了,請參考下面的指令,-i 參數代表 inventory 設定檔的路徑。
$ ansible-playbook -i hosts web.yml
在我的環境中,執行過程的輸出如下:
PLAY [Configure web server with nginx] ***********************************
TASK [Gathering Facts] ***************************************************
ok: [testserver]
TASK [install nginx] *****************************************************
changed: [testserver]
TASK [copy nginx config file] ********************************************
changed: [testserver]
TASK [enable configuration] **********************************************
ok: [testserver]
TASK [copy index.html] ***************************************************
changed: [testserver]
TASK [restart nginx] *****************************************************
changed: [testserver]
PLAY RECAP ***************************************************************
testserver : ok=6 changed=4 unreachable=0 failed=0
好的,現在用瀏覽器連到 node2,http://192.168.50.20,應該會看到如下含有 nginx, configured by Ansible 字串的畫面。
那麼今天就到這裡了。今天透過 nginx 網頁伺服器的例子,瞭解 Ansible 專案的基本設置,包括 playbook、inventory 等。明天再繼續看看 playbook 及 inventory。