基礎架構程式 IAC( infrastructure-as-code ),可以將原本需要人為部署環境,改由程式來自動化操作,然而 Ansible 這個工具誕生,就是專門實現自動化組態管理,可以大量部署出上百上千的同樣的環境( Linux、Windows ),或是控制網路設備(路由器、交換器等)。
1. Ansible 簡介
Ansible 是 Redhat 開源的組態管理工具,可以控制大量機器,並透過 ssh ( Windows 使用 WinRM 協定 ) 執行各項任務,其中最大特點是 Ansible 無須在各受控端安裝 Agent ,所以連網路設定也能進行控制及操作。
2. Ansible 基本要求
- Linux 主控端安裝 Ansible
- Linux 被控端需有 python3.5 以上直譯器 or python2.7 以上直譯器 ( Linux 大多數版本都具備 )
- Linux 被控端需要啟動 openssh 服務 ( Linux 大多數版本都具備 )
Note
如果被控端為 Windows 作業系統需開啟 WinRM,另外控制端系統只能為 Linux 作業系統。
3. Ansible 安裝
RHEL 系列包含 Redhat、Fedora、CentOS、Rocky Linux、 Oracle Linux、AlmaLinux 等 Redhat 系列都可以使用。
3.1. RHEL 8 系列安裝方式:
1
2
|
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf install -y ansible
|
3.2. RHEL 7 系列安裝方式:
1
2
|
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install -y ansible
|
Tip
囿於RHEL 8 預設已經有 python 3.6 版本直譯器,建議使用 RHEL 7 也安裝 python 3.5 以上直譯器版本,雖然 python 2.7 版本就可以執行,不過對於社區版模組支援對相對較少。
3.3. 驗證是否安裝
1
2
3
4
5
6
7
|
[student@workstation ~]$ ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/student/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Nov 9 2021, 14:44:26) [GCC 8.5.0 20210514 (Red Hat 8.5.0-3)]
|
Ubuntu 系列
使用 Ubuntu 18.04 以上的版本可以直接使用 apt install ansible安裝
4. Ansible 必備要素
執行 Ansible 有幾件事情需要準備 :
- inventory (主機清單)
- ansible.cfg (設定檔)
- playbook.yml (如何執行)
4.1. inventory 配置
inventroy 為主機清單,用來定義被控端機器的 IP 或 FQDN ,預設寫在 /etc/ansible/hosts
,但是不建議直接修改那個路徑檔案,通常都是一個資料夾表示一個 Project,每一個 Project 都會有自己的主清單 ( 每一次執行的專案電腦都可能會異動,各自獨立),範例如下:
1
2
3
4
5
6
|
[dev]
servera.lab.example.com
[test]
serverb.lab.example.com
[prod]
serverc.lab.example.com
|
4.2. ansible.cfg 配置
ansible.cfg 為 Ansible 執行方式,如要採用 SSH 登入角色為何、是否啟用 sudo 、主機清單配置在哪等等,如同 inventory ,每一個 project 獨立一個 ansible.cfg 配置,範例如下:
1
2
3
4
5
6
7
8
9
|
[defaults]
inventory = ./inventory
remote_user = devops
[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False
|
4.3 playbook.yml
playbook 名稱可以自行定義,以 yml 或 yaml 結尾檔案, 定義每一個 Project 任務該如何執行,如 inventory 一樣擺置同一個資料夾內,其範例如下:
1
2
3
4
5
6
7
|
- name: exmaple
hosts: all
gather_facts: yes
tasks:
- name: Print Hello Ansible
debug:
msg: "Hello Ansible ~~"
|
4.4 範例樹狀圖
1
2
3
4
5
6
7
|
[student@workstation ~]$ tree example/
example/
├── ansible.cfg
├── example-playbook.yaml
└── inventory
0 directories, 3 files
|
Ansible 初入門
目前先做簡單 Ansible 範例介紹,讓大家有個基礎概念,後續會有各章節,依依做詳細說明並說明其欄位用途。
5. Ansible 執行
Ansible 執行有兩種,一種是執行單一任務命列模式 ( ad-hoc ),另一種是執行編寫好的 playbook
Tip
需先配置好 ansible.cfg 及 inventory 並存放在執行的資料夾內,不然會沒有主機可以執行~
5.1 ad-hoc 執行方式
使用 ansible <主機> -m <執行的模組>
,來進行操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[student@workstation example]$ ansible all -m ping
serverc | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
serverb | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
servera | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
|
5.2 play-book 執行方式
使用 ansible-play <playbook>
,來進行操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[student@workstation example]$ ansible-playbook example-playbook.yaml
PLAY [exmaple] ***************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [servera]
ok: [serverb]
ok: [serverc]
TASK [Print Hello Ansible] ***************************************************************************************************************************************************************************************
ok: [servera] => {
"msg": "Hello Ansible ~~"
}
ok: [serverb] => {
"msg": "Hello Ansible ~~"
}
ok: [serverc] => {
"msg": "Hello Ansible ~~"
}
PLAY RECAP *******************************************************************************************************************************************************************************************************
servera : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
serverb : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
serverc : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
|
- 小結
Ansible 其實非常容易,只要明白哪些基本操作,後續其實就只是再撰寫 playbook (yaml) ,一步步達成自動化操作。不過 Ansible 是需要有個環境長期練習,不然很難體驗其中的強大。
可以自行安裝一個 Linux 當主控端安裝多個 Linux 當被控端練習來進行練習,或是使用 HowHow 製作的練習環境,可以快速使用多台機器,也能快速還原機器設定,方便練習時可以反覆操作,使用方式請參閱HowHow 的打造輕巧 Linux 練習 Lab環境吧。