使用 Ansible 进行 AIX 补丁管理
使用 Ansible 进行 AIX 补丁管理
如今,领先的企业使用 Red Hat Ansible 自动化平台来配置、管理、保护和协调混合 IT 环境。一个常见的误解是 Ansible 只用于管理 Linux 操作系统。这是一个错误的观念。Ansible 支持 Linux、Windows、AIX、IBM i 和 IBM z/OS 环境。本博客将帮助 AIX 系统管理员开始在 AIX 上使用 Ansible,并介绍一个补丁用例。
Ansible 内容集合
当 Ansible 自动化平台发布时,Ansible 内容集合成为分发、维护和使用自动化内容的事实标准。向集合的转变提高了社区参与度,并且指数级地增加了稳定且受支持的 Ansible 模块的数量。通过集合而不是与 Ansible Core 打包提供的模块,导致新模块的发布速度更快。
让我们探索 IBM 为 AIX 提供的 Ansible 集合。重要的是要注意,许多用于 Linux 操作系统的 Ansible 模块也将在 AIX 上工作(除了 IBM 提供的 AIX 模块外),这使得 Ansible 在 AIX 上的用例非常广泛。
Ansible 和 AIX,为什么?
AIX 操作系统已经存在 35 年,并且用于运行关键业务应用程序。从历史上看,AIX 系统使用与 AIX 捆绑在一起的工具进行管理,并辅以 AIX 系统管理员编写的 shell 脚本。这种方法的问题是,这些脚本多年来可能变得非常复杂,并且经常最终被“胶带和扎带”粘合在一起。
随着企业转向采用现代的企业级自动化策略(如 Ansible 自动化平台),将自动化扩展到 AIX 是简化和开发 AIX 系统支持方式一致性的一个好方法,同时使用可以在整个企业中使用的相同自动化工具。
Ansible 概念
首先让我们介绍一些将在示例中使用的一些基本的 Ansible 概念。更多信息可以在 Ansible 文档网站 上找到。
剧本,这是针对主机清单执行的任务和变量的排序列表。
任务是 Ansible 中的一个单一操作单元,它调用一个模块。
模块是 Ansible 执行的代码。每个模块都可以是像将文件复制到使用 NIM 触发 AIX 更新这样的东西。
角色是包含在特定目录结构中的可重复使用的任务捆绑包。
Ansible 中的变量被称为“”。
任务委派是任务如何在清单中的其他主机上委派,而不是 Ansible 运行所针对的主机。
Ansible 入门
在本示例中,我使用的是 Fedora Linux 34 工作站,因此我将使用 dnf 包管理器来安装 Ansible
$ sudo dnf install -y ansible
Ansible 安装完成后,我将安装 ibm.power_aix 集合
$ ansible-galaxy collection install ibm.power_aix
Ansible 安装后,将创建一个默认的清单文件 /etc/ansible/hosts。此时,我将把本示例中使用的主机包含到清单中
- nim01 是我们的 AIX 7.2 NIM 主机,它已启用且已定义了 lpp_source。
- bruce 是一个已注册到 nim01 NIM 主机的 AIX 7.2 NIM 客户端。
- freddie 是一个已注册到 nim01 NIM 主机的 AIX 7.2 NIM 客户端。
$ cat /etc/ansible/hosts nim01 ansible_host=10.0.0.5 ansible_user=root bruce ansible_host=10.0.0.6 ansible_user=root freddie ansible_host=10.0.0.7 ansible_user=root
我现在将通过 SSH 以“root”身份连接到所有系统。通常的做法是拥有一个具有“sudo”访问权限的服务帐户,但在此示例中,我将在我们的实验室环境中使用“root”。使用 ssh-copy-id 命令,我可以将我的 SSH 公钥分发到 AIX 服务器。
$ ssh-copy-id root@nim01 $ ssh-copy-id root@bruce $ ssh-copy-id root@freddie
下一步是使用 Ansible ping 模块检查我是否可以连接到清单中的三个主机。
$ ansible -m ping all PLAY [Ansible Ad-Hoc] ************************************************************************************************************************************************************************************************************************ TASK [ping] ********************************************************************************************************************************************************************************************************************************** ok: [nim01] ok: [freddie] ok: [bruce] PLAY RECAP *********************************************************************************************************************************************************************************************************************************** nim01 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 bruce : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 freddie : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Ansible 需要在 AIX 系统上安装“python”,并且理想情况下,还应该在 AIX 上配置“yum”包管理器。如果您的 AIX 系统没有安装这些包,或者是一个 AIX 的原始安装,IBM 提供了一个 Ansible 角色来“引导”一个 AIX 系统并对其进行管理。
下面的剧本使用 IBM 提供的角色来为 AIX 系统做好 Ansible 自动化的准备。
cat aix_bootstrap.yml --- - name: Prep AIX for Ansible hosts: all vars: pkgtype: yum collections: - ibm.power_aix roles: - power_aix_bootstrap
以下示例演示了运行剧本;但是,我可以看到 Ansible 运行所针对的主机已经安装了“python”和“yum”,因此不需要对这些主机进行任何更改。
$ ansible-playbook aix_bootstrap.yml PLAY [Prep AIX for Ansible] ****************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************** ok: [bruce] ok: [freddie] ok: [nim01] TASK [ibm.power_aix.power_aix_bootstrap : Fail if pkgtype not specified] ********************************************************************************************************************************************************************* skipping: [nim01] skipping: [bruce] skipping: [freddie] TASK [ibm.power_aix.power_aix_bootstrap : Fail if download_dir not specified] **************************************************************************************************************************************************************** skipping: [nim01] skipping: [bruce] skipping: [freddie] TASK [ibm.power_aix.power_aix_bootstrap : Fail if target_dir not specified] ****************************************************************************************************************************************************************** skipping: [nim01] skipping: [bruce] skipping: [freddie] TASK [ibm.power_aix.power_aix_bootstrap : Fail if rpm_src not specified] ********************************************************************************************************************************************************************* skipping: [nim01] skipping: [bruce] skipping: [freddie] TASK [ibm.power_aix.power_aix_bootstrap : Fail if yum_src not specified] ********************************************************************************************************************************************************************* skipping: [nim01] skipping: [bruce] skipping: [freddie] TASK [ibm.power_aix.power_aix_bootstrap : Bootstrap yum] ************************************************************************************************************************************************************************************* included: /home/tholloway/.ansible/collections/ansible_collections/ibm/power_aix/roles/power_aix_bootstrap/tasks/yum_install.yml for nim01, bruce, freddie TASK [ibm.power_aix.power_aix_bootstrap : Check for existence of yum] ************************************************************************************************************************************************************************ changed: [bruce] changed: [nim01] changed: [freddie] PLAY RECAP *********************************************************************************************************************************************************************************************************************************** nim01 : ok=3 changed=1 unreachable=0 failed=0 skipped=5 rescued=0 ignored=0 bruce : ok=3 changed=1 unreachable=0 failed=0 skipped=5 rescued=0 ignored=0 freddie : ok=3 changed=1 unreachable=0 failed=0 skipped=5 rescued=0 ignored=0
现在平台已满足所需的最低组件要求,我已准备好自动执行 AIX 操作。
使用 NIM 和 Ansible 运行 AIX 更新
首先,我将使用一个简单的剧本查看 NIM 主机和 NIM 客户端的“oslevel”,然后再开始。
$ cat aix_oslevel_check.yml --- - name: AIX oslevel checking playbook hosts: all tasks: - name: Gather LPP Facts shell: "oslevel -s" register: output_oslevel - name: Print the oslevel debug: msg: "{{ ansible_hostname }} has the AIX oslevel of {{ output_oslevel.stdout }}"
运行该剧本会提供以下结果。我可以看到 bruce 和 freddie 落后一个 Service Pack。
$ ansible-playbook aix_oslevel_check.yml PLAY [AIX oslevel checking playbook ] ***************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************** ok: [bruce] ok: [freddie] ok: [nim01] TASK [Gather LPP Facts] ********************************************************************************************************************************************************************************************************************** changed: [freddie] changed: [bruce] changed: [nim01] TASK [Print the oslevel] ********************************************************************************************************************************************************************************************************************* ok: [nim01] => msg: nim01 has the AIX oslevel of 7200-05-02-2114 ok: [bruce] => msg: bruce has the AIX oslevel of 7200-05-01-2038 ok: [freddie] => msg: freddie has the AIX oslevel of 7200-05-01-2038 PLAY RECAP *********************************************************************************************************************************************************************************************************************************** nim01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 bruce : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 freddie : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
为了确保所有系统都在同一 OS 级别上运行,我需要下载最新的 Service Pack。它应该在我们的 NIM 主机上定义一个“lpp_source”。确保“lpp_source”的名称与下面的示例匹配,否则 Ansible 模块将无法检测到“oslevel”。
$ cat aix_download.yml --- - name: AIX Patching Playbook hosts: nim01 vars: oslevel: 7200-05-02 nim_lpp_source: 7200-05-02-2114-lpp_source collections: - ibm.power_aix tasks: - name: Download AIX Updates nim_suma: action: download download_dir: "/export/nim/lpp_source" lpp_source_name: "{{ nim_lpp_source }}" oslevel: "{{ oslevel }}" targets: 'bruce, freddie'
下一步是运行下载剧本。它将从 IBM Fix Central 下载所需的更新,并在 NIM 主机上定义一个“lpp_source”。
$ ansible-playbook aix_download.yml PLAY [AIX Patching Playbook] ***************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************** ok: [nim01] TASK [Download AIX Updates] ****************************************************************************************************************************************************************************************************************** changed: [nim01] PLAY RECAP *********************************************************************************************************************************************************************************************************************************** nim01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
现在,我可以运行一个补丁剧本,它将使用“alt_disk”和“nim”Ansible 模块。该剧本将执行以下任务
- 删除 AIX 系统上遗留的任何现有“altinst_rootvg”“alt_disk_copy”。
- 将根卷组的“alt_disk_copy”克隆到备用磁盘作为备份。
- 运行应用程序停止脚本。
- 通过将任务委派到 NIM 主机来运行 AIX 更新。
- 重启。
- 运行应用程序启动脚本。
--- - name: AIX Patching Playbook hosts: bruce,freddie vars: nim_lpp_source: 7200-05-02-2114-lpp_source nim_master: nim01 collections: - ibm.power_aix tasks: - name: Cleanup any existing alt_disk_copy alt_disk: action: clean - name: Create an alt_disk_copy for backup alt_disk: targets: hdisk1 - name: Stop Application shell: /usr/local/bin/stop.sh - name: Run AIX Update nim: action: update lpp_source: "{{ nim_lpp_source }}" targets: "{{ ansible_hostname }}" delegate_to: "{{ nim_master }}" - name: Reboot reboot: post_reboot_delay: 180 - name: Start Application shell: /usr/local/bin/start.sh
现在,我将运行该剧本并为 NIM 客户端系统“bruce”和“freddie”打补丁
$ ansible-playbook aix_patching.yml PLAY [AIX Patching Playbook] ***************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************** ok: [bruce] ok: [freddie] TASK [Cleanup any existing alt_disk_copy] **************************************************************************************************************************************************************************************************** changed: [bruce] changed: [freddie] TASK [Create an alt_disk_copy for backup] **************************************************************************************************************************************************************************************************** changed: [bruce] changed: [freddie] TASK [Stop Application] ********************************************************************************************************************************************************************************************************************** changed: [bruce] changed: [freddie] TASK [Run AIX Update] ************************************************************************************************************************************************************************************************************************* changed: [bruce -> 10.0.0.5] changed: [freddie -> 10.0.0.5] TASK [Reboot] ******************************************************************************************************************************************************************************************************************************** changed: [freddie] changed: [bruce] TASK [Start Application] ********************************************************************************************************************************************************************************************************************* changed: [bruce] changed: [freddie] PLAY RECAP *********************************************************************************************************************************************************************************************************************************** bruce : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 freddie : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
接下来,我将再次运行 aix_oslevel_check.yml 剧本,并看到所有系统都运行在 AIX 7.2 TL5 SP2 上。
$ ansible-playbook aix_oslevel_check.yml PLAY [AIX oslevel checking playbook ] ***************************************************************************************************************************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************** ok: [bruce] ok: [freddie] ok: [nim01] TASK [Gather LPP Facts] ********************************************************************************************************************************************************************************************************************** changed: [freddie] changed: [bruce] changed: [nim01] TASK [Print the oslevel] ********************************************************************************************************************************************************************************************************************* ok: [nim01] => msg: nim01 has the AIX oslevel of 7200-05-02-2114 ok: [bruce] => msg: bruce has the AIX oslevel of 7200-05-02-2114 ok: [freddie] => msg: freddie has the AIX oslevel of 7200-05-02-2114 PLAY RECAP *********************************************************************************************************************************************************************************************************************************** nim01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 bruce : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 freddie : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
结论
从本示例中可以看出,Ansible 在自动化 AIX 操作方面提供了很多价值。有关更多信息,请参阅 自动化中心 中提供的受支持集合的文档。该集合也可从 Ansible Galaxy 获取。