Ansible 自動(dòng)化工具安裝、配置和快速入門指南
市面上有很多自動(dòng)化工具。我可以舉幾個(gè)例子,例如 Puppet、Chef、CFEngine、Foreman、Katello、Saltstock、Space Walk,它們被許多組織廣泛使用。
自動(dòng)化工具可以做什么?
自動(dòng)化工具可以自動(dòng)執(zhí)行例行任務(wù),無需人工干預(yù),從而使 Linux 管理員的工作變得更加輕松。這些工具允許用戶執(zhí)行配置管理,應(yīng)用程序部署和資源調(diào)配。
為什么喜歡 Ansible?
Ansible 是一種無代理的自動(dòng)化工具,使用 SSH 執(zhí)行所有任務(wù),但其它工具需要在客戶端節(jié)點(diǎn)上安裝代理。
什么是 Ansible?
Ansible 是一個(gè)開源、易于使用的功能強(qiáng)大的 IT 自動(dòng)化工具,通過 SSH 在客戶端節(jié)點(diǎn)上執(zhí)行任務(wù)。
它是用 Python 構(gòu)建的,這是當(dāng)今世界上最流行、最強(qiáng)大的編程語言之一。兩端都需要使用 Python 才能執(zhí)行所有模塊。
它可以配置系統(tǒng)、部署軟件和安排高級 IT 任務(wù),例如連續(xù)部署或零停機(jī)滾動(dòng)更新。你可以通過 Ansible 輕松執(zhí)行任何類型的自動(dòng)化任務(wù),包括簡單和復(fù)雜的任務(wù)。
在開始之前,你需要了解一些 Ansible 術(shù)語,這些術(shù)語可以幫助你更好的創(chuàng)建任務(wù)。
Ansible 如何工作?
Ansible 通過在客戶端節(jié)點(diǎn)上推送稱為 ansible 模塊的小程序來工作,這些模塊臨時(shí)存儲在客戶端節(jié)點(diǎn)中,通過 JSON 協(xié)議與 Ansible 服務(wù)器進(jìn)行通信。
Ansible 通過 SSH 運(yùn)行這些模塊,并在完成后將其刪除。
模塊是用 Python 或 Perl 等編寫的一些腳本。
控制節(jié)點(diǎn),用于控制劇本的全部功能,包括客戶端節(jié)點(diǎn)(主機(jī))。
- 控制節(jié)點(diǎn):使用 Ansible 在受控節(jié)點(diǎn)上執(zhí)行任務(wù)的主機(jī)。你可以有多個(gè)控制節(jié)點(diǎn),但不能使用 Windows 系統(tǒng)主機(jī)當(dāng)作控制節(jié)點(diǎn)。
- 受控節(jié)點(diǎn):控制節(jié)點(diǎn)配置的主機(jī)列表。
- 清單:控制節(jié)點(diǎn)管理的一個(gè)主機(jī)列表,這些節(jié)點(diǎn)在
/etc/ansible/hosts
文件中配置。它包含每個(gè)節(jié)點(diǎn)的信息,比如 IP 地址或其主機(jī)名,還可以根據(jù)需要對這些節(jié)點(diǎn)進(jìn)行分組。 - 模塊:每個(gè)模塊用于執(zhí)行特定任務(wù),目前有 3387 個(gè)模塊。
- 點(diǎn)對點(diǎn):它允許你一次性運(yùn)行一個(gè)任務(wù),它使用
/usr/bin/ansible
二進(jìn)制文件。 - 任務(wù):每個(gè)動(dòng)作都有一個(gè)任務(wù)列表。任務(wù)按順序執(zhí)行,在受控節(jié)點(diǎn)中一次執(zhí)行一個(gè)任務(wù)。
- 劇本:你可以使用劇本同時(shí)執(zhí)行多個(gè)任務(wù),而使用點(diǎn)對點(diǎn)只能執(zhí)行一個(gè)任務(wù)。劇本使用 YAML 編寫,易于閱讀。將來,我們將會(huì)寫一篇有關(guān)劇本的文章,你可以用它來執(zhí)行復(fù)雜的任務(wù)。
測試環(huán)境
此環(huán)境包含一個(gè)控制節(jié)點(diǎn)(server.2g.lab
)和三個(gè)受控節(jié)點(diǎn)(node1.2g.lab
、node2.2g.lab
、node3.2g.lab
),它們均在虛擬環(huán)境中運(yùn)行,操作系統(tǒng)分別為:
System Purpose | Hostname | IP Address | OS |
---|---|---|---|
Ansible Control Node | server.2g.lab | 192.168.1.7 | Manjaro 18 |
Managed Node1 | node1.2g.lab | 192.168.1.6 | CentOS7 |
Managed Node2 | node2.2g.lab | 192.168.1.5 | CentOS8 |
Managed Node3 | node3.2g.lab | 192.168.1.9 | Ubuntu 18.04 |
User: daygeek |
前置條件
- 在 Ansible 控制節(jié)點(diǎn)和受控節(jié)點(diǎn)之間啟用無密碼身份驗(yàn)證。
- 控制節(jié)點(diǎn)必須是 Python 2(2.7 版本) 或 Python 3(3.5 或更高版本)。
- 受控節(jié)點(diǎn)必須是 Python 2(2.6 或更高版本) 或 Python 3(3.5 或更高版本)。
- 如果在遠(yuǎn)程節(jié)點(diǎn)上啟用了 SELinux,則在 Ansible 中使用任何與復(fù)制、文件、模板相關(guān)的功能之前,還需要在它們上安裝
libselinux-python
。
如何在控制節(jié)點(diǎn)上安裝 Ansible
對于 Fedora/RHEL 8/CentOS 8 系統(tǒng),使用 DNF 命令 來安裝 Ansible。
注意:你需要在 RHEL/CentOS 系統(tǒng)上啟用 EPEL 倉庫,因?yàn)?Ansible 軟件包在發(fā)行版官方倉庫中不可用。
$ sudo dnf install ansible
對于 Debian/Ubuntu 系統(tǒng),使用 APT-GET 命令 或 APT 命令 來安裝 Ansible。
配置下面的 PPA 以便在 Ubuntu 上安裝最新穩(wěn)定版本的 Ansible。
$ sudo apt update
$ sudo apt install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible
對于 Debian 系統(tǒng),配置以下源列表:
$ echo "deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main" | sudo tee -a /etc/apt/sources.list.d/ansible.list
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367
$ sudo apt update
$ sudo apt install ansible
對于 Arch Linux 系統(tǒng),使用 Pacman 命令 來安裝 Ansible:
$ sudo pacman -S ansible
對于 RHEL/CentOS 系統(tǒng),使用 YUM 命令 來安裝 Ansible:
$ sudo yum install ansible
對于 openSUSE 系統(tǒng),使用 Zypper 命令 來安裝 Ansible:
$ sudo zypper install ansible
或者,你可以使用 Python PIP 包管理工具 來安裝:
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python get-pip.py
$ sudo pip install ansible
在控制節(jié)點(diǎn)上檢查安裝的 Ansible 版本:
$ ansible --version
ansible 2.9.2
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/daygeek/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.8/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.8.1 (default, Jan 8 2020, 23:09:20) [GCC 9.2.0]
如何在受控節(jié)點(diǎn)上安裝 Python?
使用以下命令在受控節(jié)點(diǎn)上安裝 python:
$ sudo yum install -y python
$ sudo dnf install -y python
$ sudo zypper install -y python
$ sudo pacman -S python
$ sudo apt install -y python
如何在 Linux 設(shè)置 SSH 密鑰身份驗(yàn)證(無密碼身份驗(yàn)證)
使用以下命令創(chuàng)建 ssh 密鑰,然后將其復(fù)制到遠(yuǎn)程計(jì)算機(jī)。
$ ssh-keygen
$ ssh-copy-id daygeek@node1.2g.lab
$ ssh-copy-id daygeek@node2.2g.lab
$ ssh-copy-id daygeek@node3.2g.lab
具體參考這篇文章《在 Linux 上設(shè)置 SSH 密鑰身份驗(yàn)證(無密碼身份驗(yàn)證)》。
如何創(chuàng)建 Ansible 主機(jī)清單
在 /etc/ansible/hosts
文件中添加要管理的節(jié)點(diǎn)列表。如果沒有該文件,則可以創(chuàng)建一個(gè)新文件。以下是我的測試環(huán)境的主機(jī)清單文件:
$ sudo vi /etc/ansible/hosts
[web]
node1.2g.lab
node2.2g.lab
[app]
node3.2g.lab
讓我們看看是否可以使用以下命令查找所有主機(jī)。
$ ansible all --list-hosts
hosts (3):
node1.2g.lab
node2.2g.lab
node3.2g.lab
對單個(gè)組運(yùn)行以下命令:
$ ansible web --list-hosts
hosts (2):
node1.2g.lab
node2.2g.lab
如何使用點(diǎn)對點(diǎn)命令執(zhí)行任務(wù)
一旦完成主機(jī)清單驗(yàn)證檢查后,你就可以上路了。干的漂亮!
語法:
ansible [pattern] -m [module] -a "[module options]"
Details:
========
ansible: A command
pattern: Enter the entire inventory or a specific group
-m [module]: Run the given module name
-a [module options]: Specify the module arguments
使用 Ping 模塊對主機(jī)清單中的所有節(jié)點(diǎn)執(zhí)行 ping 操作:
$ ansible all -m ping
node3.2g.lab | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
node1.2g.lab | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
node2.2g.lab | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
所有系統(tǒng)都返回了成功,但什么都沒有改變,只返回了 pong
代表成功。
你可以使用以下命令獲取可用模塊的列表。
$ ansible-doc -l
當(dāng)前有 3387 個(gè)內(nèi)置模塊,它們會(huì)隨著 Ansible 版本的遞增而增加:
$ ansible-doc -l | wc -l
3387
使用 command 模塊對主機(jī)清單中的所有節(jié)點(diǎn)執(zhí)行命令:
$ ansible all -m command -a "uptime"
node3.2g.lab | CHANGED | rc=0 >>
18:05:07 up 1:21, 3 users, load average: 0.12, 0.06, 0.01
node1.2g.lab | CHANGED | rc=0 >>
06:35:06 up 1:21, 4 users, load average: 0.01, 0.03, 0.05
node2.2g.lab | CHANGED | rc=0 >>
18:05:07 up 1:25, 3 users, load average: 0.01, 0.01, 0.00
對指定組執(zhí)行 command 模塊。
檢查 app 組主機(jī)的內(nèi)存使用情況:
$ ansible app -m command -a "free -m"
node3.2g.lab | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 1993 1065 91 6 836 748
Swap: 1425 0 1424
要對 web 組運(yùn)行 hostnamectl
命令,使用以下格式:
$ ansible web -m command -a "hostnamectl"
node1.2g.lab | CHANGED | rc=0 >>
Static hostname: CentOS7.2daygeek.com
Icon name: computer-vm
Chassis: vm
Machine ID: 002f47b82af248f5be1d67b67e03514c
Boot ID: dc38f9b8089d4b2d9304e526e00c6a8f
Virtualization: kvm
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-957.el7.x86_64
Architecture: x86-64
node2.2g.lab | CHANGED | rc=0 >>
Static hostname: node2.2g.lab
Icon name: computer-vm
Chassis: vm
Machine ID: e39e3a27005d44d8bcbfcab201480b45
Boot ID: 27b46a09dde546da95ace03420fe12cb
Virtualization: oracle
Operating System: CentOS Linux 8 (Core)
CPE OS Name: cpe:/o:centos:centos:8
Kernel: Linux 4.18.0-80.el8.x86_64
Architecture: x86-64
參考:Ansible 文檔。