自动化有助于提高效率、节省时间并提高一致性。所以红帽企业Linux(RHEL)包含了许多让任务自动化的功能。RHEL系统角色是一组Ansible内容,提供一致的工作流程和简化手动任务的执行。使用Podman系统角色,可以在多个RHEL系统上批量部署无根容器,在本地RHEL工作站上测试容器,并利用systemd保持容器运行。
要使用Podman系统角色部署容器,首先必须指定容器的属性。这包括使用哪个容器镜像、暴露哪些网络端口、持久化存储等。
Podman系统角色并未创建新的格式来定义这些信息,而是使用了Kubernetes YAML。许多人已经熟悉Kubernetes YAML,并使用它可以方便在Podman和基于Kubernetes的解决方案(如红帽OpenShift)之间过渡。
在我的实验室环境中,我有一个控制节点系统名为rhel9-controlnode.example.com,以及四个受控节点:
rhel9-server1.example.com
rhel9-server2.example.com
rhel8-server1.example.com
rhel8-server2.example.com
其中三个服务器运行RHEL 9.2,两个服务器运行RHEL 8.8。
我想在所有四个受控节点上部署一个容器,并使用systemd进行管理,以便在启动时自动启动,具体配置如下:
使用红帽ubi8/httpd-24容器镜像,其中包含Apache HTTP服务器
使用标准用户账户运行无根容器
将主机上的端口8080映射到容器内的端口8080,并通过防火墙访问,以便可以远程访问
将主机上的/mnt/home/brian/ubi-httpd-24-html挂载到容器内的/var/www/html
此外,我希望在这四个受控节点上安装RHEL Web控制台(包括Web控制台的Podman组件),以便可以轻松验证容器是否正确部署。我将使用Cockpit系统角色来自动化部署RHEL Web控制台。
首先,在rhel9-controlnode.example.com主机上定义Kubernetes YAML文件。将文件保存为ubi8-httpd-24.yml,并将以下内容粘贴到文件中:
apiVersion: v1
kind: Pod
metadata:
name: ubi8-httpd-24
spec:
containers:
- name: ubi8-httpd-24
image: registry.access.redhat.com/ubi8/httpd-24
ports:
- containerPort: 8080
hostPort: 8080
volumeMounts:
- mountPath: /var/www/html:Z
name: ubi8-httpd-24-html
volumes:
- name: ubi8-httpd-24-html
hostPath:
path: /home/brian/ubi8-httpd-24-html
接下来,在rhel9-controlnode.example.com主机上创建名为inventory.yml的清单文件。此文件列出了要配置的四个受控节点,并定义了角色变量,指定了Podman和Cockpit系统角色应该实施的配置。以下是一个示例inventory.yml文件:
all:
hosts:
rhel9-server1.example.com:
rhel9-server2.example.com:
rhel8-server1.example.com:
rhel8-server2.example.com:
vars:
#podman system role variables:
podman_firewall:
- port: 8080/tcp
state: enabled
podman_create_host_directories:
true
podman_host_directories:
"/home/brian/ubi8-httpd-24-html":
owner: brian
group: brian
mode: "0755"
podman_kube_specs:
- state: started
run_as_user: brian
run_as_group: brian
kube_file_src: ubi8-httpd-24.yml
#cockpit
system role variables:
cockpit_packages:
- cockpit-podman
cockpit_manage_firewall: true
在清单文件的顶部,列出了四个受控节点的主机名。
vars部分定义了Podman系统角色的变量。podman_firewall变量指定主机防火墙上打开了8080/tcp端口(Kubernetes YAML文件指定主机端口8080映射到容器端口8080)。
podman_create_host_directories确保角色创建了/home/brian/ubi8-httpd-24-html目录,并按照Kubernetes YAML文件中指定的brian:brian所有者和组以及0755权限进行设置。
podman_kube_specs变量指定容器以brian:brian用户和组运行,并使用ubi8-httpd-24.yml文件作为Kubernetes YAML的源。
在文件底部,有Cockpit系统角色的变量。cockpit_packages变量确保安装了cockpit-podman软件包,而cockpit_manage_firewall变量确保RHEL web控制台端口(9090/tcp)在防火墙中打开。
如果使用Ansible自动化控制器作为控制节点,则可以使用SCM项目或使用awx-manage实用程序将此清单导入到Red Hat Ansible Automation Platform。
最后,需要一个Ansible脚本来调用RHEL系统角色。在rhel9-controlnode.example.com主机上将此文件命名为system_roles.yml。
- name: Run podman RHEL system role
hosts: all
roles:
- redhat.rhel_system_roles.podman
- name: Run cockpit RHEL system role
hosts: all
roles:
- redhat.rhel_system_roles.cockpit
这是一个简单的脚本,只调用了Podman系统角色和Cockpit系统角色。
如果您使用Ansible自动化控制器作为控制节点,可以将这个Ansible脚本导入到R红帽Ansible自动化平台中。通常使用Git仓库来存储Ansible Playbooks。Ansible 自动化平台将自动化存储为称为作业(Jobs)的单元,其中包含Playbook、凭据和清单。
现在,一切都准备就绪。
从rhel9-controlnode.example.com主机(已安装了rhel-system-roles和ansible-core软件包)使用ansible-playbook命令来运行Playbook。使用-b标志提示Ansible升级权限,并使用-i选项指定inventory.yml作为Ansible清单。
$ ansible-playbook -i inventory.yml -b system_roles.yml
如果使用Ansible自动化控制器作为控制节点,可以从自动化控制器的Web界面启动作业。
验证脚本是否成功完成:
PLAY RECAP *******************************************************
rhel8-server1.example.com : ok=68 unreachable=0 failed=0 skipped=54...
rhel8-server2.example.com : ok=68 unreachable=0 failed=0 skipped=54...
rhel9-server1.example.com : ok=68 unreachable=0 failed=0 skipped=54...
rhel9-server2.example.com : ok=68 unreachable=0 failed=0 skipped=54...
接下来,验证Podman系统角色是否按预期部署了配置。每个主机应该具有相同的配置,所以选择一个进行抽查,在Web浏览器中打开主机的9090端口(RHEL web控制台的默认端口)并登录。
首先,点击Web控制台菜单中的“Services”。然后,在右上角,点击“User”以查看用户级别的systemd服务。
在搜索框中键入“httpd”。
Podman系统角色为ubi8-httpd-24容器创建了一个新的用户级别的systemd服务,该容器正在运行。
点击服务名称,查看有关该服务的更多信息。
可以通过在 Web 控制台菜单中查找 Podman 容器来验证 cockpit-podman 包是否已安装。
点击菜单中的 "Podman 容器",然后按需点击 "启动 Podman" 按钮。ub8-httpd-24 容器将在系统上使用标准用户帐户(在我的例子中是 brian)运行。主机上的端口 8080 被映射到容器内的端口 8080,并且主机目录 /home/brian/ubi8-httpd-24-html 被绑定挂载到容器内的 /var/www/html 目录。
接下来,点击 Web 控制台菜单中的 "Terminal "。切换到 /home/brian/ubi8-httpd-24-html 目录,然后创建一个 index.html 文件。
[rhel9-server1]$cd /home/brian/ubi8-httpd-24-html/
[rhel9-server1]$ echo 'Hello world!' > index.html
为了测试这个,连接到 rhel9-server1.example.com 主机的 8080 端口。将看到 index.html 文件的内容。
$ curl rhel9-server1.example.com:8080
Hello world!
作为最后的测试,验证systemd服务是否在重启rhel9-server1.example.com主机后自动启动容器。在重启后,容器将自动启动,并且仍然能够通过端口8080连接到rhel9-server1.example.com,以访问在index.html中放置的内容。
Podman系统角色帮助自动配置RHEL环境中的Podman,实现更一致且规模化的管理。这并不是红帽提供的唯一系统角色。还有许多其他RHEL系统角色可以帮助自动化RHEL环境的其他重要方面。要了解更多角色,请查阅可用的RHEL系统角色列表,并开始以更高效、一致和自动化的方式管理RHEL服务器。