Contents

Ansible - 自動化組態管理工具介紹

基礎架構程式 IAC( infrastructure-as-code ),可以將原本需要人為部署環境,改由程式來自動化操作,然而 Ansible 這個工具誕生,就是專門實現自動化組態管理,可以大量部署出上百上千的同樣的環境( Linux、Windows ),或是控制網路設備(路由器、交換器等)。

1. Ansible 簡介

Ansible 是 Redhat 開源的組態管理工具,可以控制大量機器,並透過 ssh ( Windows 使用 WinRM 協定 ) 執行各項任務,其中最大特點是 Ansible 無須在各受控端安裝 Agent ,所以連網路設定也能進行控制及操作。

https://i.imgur.com/pcHyQPr.png
Ansible 操作圖例


2. Ansible 基本要求

  1. Linux 主控端安裝 Ansible
  2. Linux 被控端需有 python3.5 以上直譯器 or python2.7 以上直譯器 ( Linux 大多數版本都具備 )
  3. 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   

  1. 小結

Ansible 其實非常容易,只要明白哪些基本操作,後續其實就只是再撰寫 playbook (yaml) ,一步步達成自動化操作。不過 Ansible 是需要有個環境長期練習,不然很難體驗其中的強大。

可以自行安裝一個 Linux 當主控端安裝多個 Linux 當被控端練習來進行練習,或是使用 HowHow 製作的練習環境,可以快速使用多台機器,也能快速還原機器設定,方便練習時可以反覆操作,使用方式請參閱HowHow 的打造輕巧 Linux 練習 Lab環境吧。



如果你還沒有註冊 Like Coin,你可以在文章最下方看到 Like 的按鈕,點下去後即可申請帳號,透過申請帳號後可以幫我的文章按下 Like,而 Like 最多可以點五次,而你不用付出任何一塊錢,就能給我寫這篇文章的最大的回饋!