使用 Ansible 配置 Podman 容器
在復(fù)雜的 IT 基礎(chǔ)設(shè)施中,有許多重復(fù)性任務(wù)。成功運行這些任務(wù)并不容易。運行失敗大多數(shù)是人為錯誤引發(fā)。在 Ansible 幫助下,你可以通過遠程主機來執(zhí)行所有任務(wù),這些遠程主機按照行動手冊執(zhí)行,行動手冊可以根據(jù)需要重復(fù)使用多次。在本文中,你將學(xué)習(xí)如何在 Fedora Linux 上安裝、配置 Ansible,以及如何使用它來管理、配置 Podman 容器。
Ansible
Ansible 是一個由紅帽贊助的開源基礎(chǔ)設(shè)施自動化工具。它可以處理大型基礎(chǔ)設(shè)施帶來的所有問題,例如安裝和更新軟件包、備份、確保特定服務(wù)持續(xù)運行等等。你用 YAML 寫的行動手冊來做這些事。Ansible 行動手冊可以反復(fù)使用,使系統(tǒng)管理員的工作不那么復(fù)雜。行動手冊減少了重復(fù)任務(wù),并且可以輕松修改。但是我們有很多像 Ansible 一樣的自動化工具,為什么要用它呢?與其他一些配置管理工具不同,Ansible 是無代理的:你不必在受管節(jié)點上安裝任何東西。
Podman
Podman 是一個開源的容器引擎,用于開發(fā)、管理和運行容器鏡像。但什么是容器呢?每當(dāng)你創(chuàng)建任何新應(yīng)用程序并將其部署在物理服務(wù)器、云服務(wù)器或虛擬機上時,你面臨的最常見問題是可移植性和兼容性。這就是容器出現(xiàn)的原因。容器在操作系統(tǒng)級別上進行虛擬化,因此它們只包含所需的庫和應(yīng)用程序服務(wù)。容器的好處包括:
- 便攜性
- 隔離性
- 擴展性
- 輕量級
- 快速啟動
- 更小的磁盤和內(nèi)存需求
簡而言之:當(dāng)你為任何應(yīng)用程序構(gòu)建容器鏡像時,所有必需的依賴項都被打包到容器中。你現(xiàn)在可以在任何主機操作系統(tǒng)上運行該容器,沒有任何可移植性和兼容性問題。
Podman 的關(guān)鍵亮點在于它沒有守護程序,因此不需要 root 權(quán)限來運行容器。你可以借助 Dockerfile 構(gòu)建容器鏡像,或者從 Docker Hub、fedoraproject.org 或 Quay 上拉取鏡像。
為什么用 Ansible 配置 Podman?
Ansible 提供了一種輕松多次運行重復(fù)任務(wù)的方法。它還為云提供商(如 AWS、GCP 和 Azure)、容器管理工具(如 Docker 和 Podman)與數(shù)據(jù)庫管理提供了大量模塊。Ansible 還有一個社區(qū)(Ansible Galaxy),在這里你可以找到大量 Ansible 角色,它們由來自世界各地的貢獻者創(chuàng)建。因為這些,Ansible 成為了 DevOps 工程師和系統(tǒng)管理員手中的好工具。
借助 DevOps,應(yīng)用程序的開發(fā)步伐很快。開發(fā)的應(yīng)用不局限于任意操作系統(tǒng),這點至關(guān)重要。這就是 Podman 出現(xiàn)的地方。
安裝 Ansible
首先,安裝 Ansible:
$ sudo dnf install ansible -y
配置 Ansible
Ansible 需要在受管節(jié)點上運行 ssh,所以首先生成一個密鑰對。
$ ssh-keygen
生成密鑰后,將密鑰復(fù)制到受管節(jié)點。
輸入 yes
,然后輸入受管節(jié)點的密碼?,F(xiàn)在可以遠程訪問受管主機。
為了能夠訪問受管節(jié)點,你需要將所有主機名或 IP 地址存儲在清單文件中。默認情況下,這是在 ~/etc/ansible/hosts
。
這是庫存文件的樣子。方括號用于將組分配給某些特定的節(jié)點。
[group1]
green.example.com
blue.example.com
[group2]
192.168.100.11
192.168.100.10
檢查所有受管節(jié)點是否可以到達。
$ ansible all -m ping
你可以看到如下輸出:
[mahesh@fedora new] $ ansible all -m ping
fedora.example.com I SUCCESS {
"ansibe_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[mahesh@fedora new] $
現(xiàn)在創(chuàng)建你的第一個行動手冊,它將在受管節(jié)點上安裝 Podman。首先用 .yml 拓展名創(chuàng)建一個任意名稱的文件。
$ vim name_of_playbook.yml
行動手冊應(yīng)該如下所示。第一個字段是行動手冊的名稱。主機字段(hosts
)用于提及清單中提到的主機名或組名。become: yes
表示升級權(quán)限,以及任務(wù)(tasks
)包含所要執(zhí)行的任務(wù),這里的名稱(name
)指定任務(wù)(tasks
)名稱,yum
是安裝軟件包的模塊,下面在名稱字段(name
)指定軟件包名稱,在狀態(tài)字段(state
)指定安裝或刪除軟件包。
---
- name: First playbook
hosts: fedora.example.com
become: yes
tasks:
- name: Installing podman.
yum:
name: podman
state: present
檢查文件中是否有語法錯誤:
$ ansible-playbook filename --syntax-check
現(xiàn)在運行行動手冊:
$ ansible-playbook filename
你可以看到如下輸出:
[mahesh@fedora new] $ ansible-playbook podman_installation.yml
PLAY [First playbook] *************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
0k: [fedora.example.com]
TASK [Installing podman] ************************************************************************************************
changed: [fedora.example.com]
PLAY RECAP *************************************************************************************************
fedora.example.com : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[mahesh@fedora new] $
現(xiàn)在創(chuàng)建一個新的行動手冊,從 Docker Hub 中拉取一個鏡像。你將使用 podman_image
模塊從 Docker Hub 中提取版本號為 2-alpine 的 httpd 鏡像。
---
- name: Playbook for podman.
hosts: fedora.example.com
tasks:
- name: Pull httpd:2-alpine image from dockerhub.
podman_image:
name: docker.io/httpd
tag: 2-alpine
現(xiàn)在檢查已拉取的鏡像:
[mahesh@fedora new] $ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/httpd 2-alpine fa848876521a 11 days ago 57 MB
[mahesh@fedora new] $
創(chuàng)建一個新的行動手冊來運行 httpd 鏡像。更多信息請查看 podman_container 模塊文檔。
---
- name: Playbook for podman.
hosts: fedora.example.com
tasks:
- name: Running httpd image.
containers.podman.podman_container:
name: my-first-container
image: docker.io/httpd:2-alpine
state: started
檢查容器運行狀態(tài)。
[mahesh@fedora new] $ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45d966eOe207 docker.io/library/httpd:2-alpine httpd-foreground 13 seconds ago Up 13 seconds ago my-first-container
[mahesh@fedora new] $
現(xiàn)在停止已運行的容器,改變狀態(tài),由 started
變?yōu)?nbsp;absent
。
- name: Stopping httpd container.
containers.podman.podman_container:
name: my-first-container
image: docker.io/httpd:2-alpine
state: absent
當(dāng)你執(zhí)行 podman ps
命令時,你看不到任何運行的容器。
[mahesh@fedora new] $ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[mahesh@fedora new] $
podman_container
可以做很多事情,例如重新創(chuàng)建容器、重新啟動容器、檢查容器是否正在運行等等。有關(guān)執(zhí)行這些操作的信息,請參考 文檔。