Ansible Galaxy: 尝试使用 ibm.power_aix – installp 来安装
首先
最近,随着自动化趋势的发展,Ansible对PowerSystems的影响也愈发普遍。
参考:
・使用Ansible实现PowerSystems的自动化
IBM Power Systems AIX Collection: IBM力量系统AIX集合
Ansible Galaxy发布了ibm.power_aix,扩展了AIX模块。
参考:
・ibm.power_aix
・Ansible PowerSystems AIX
・GitHub仓库: ansible-power-aix
我计划使用Galaxy版的ibm.power_aix,尝试在之前的文章《Ansible: AIX模块确认 – installp》无法执行的installp模块中进行更新。
环境
・Ansible服务器的Mac PC
– Ansible版本2.9
・受管理的AIX 7.2 TL03 SP03服务器
– python版本2.7
验证
1) 引入 ibm.power_aix
请参考 https://ibm.github.io/ansible-power-aix/installation.html 步骤。
$ ansible-galaxy collection install ibm.power_aix
Process install dependency map
Starting collection install process
Installing 'ibm.power_aix:1.0.2' to '/Users/c_u/.ansible/collections/ansible_collections/ibm/power_aix'
$ ls -l /Users/c_u/.ansible/collections/ansible_collections/ibm/power_aix
total 160
-rw-r--r-- 1 user staff 3227 Aug 28 11:25 CODE_OF_CONDUCT.md
-rw-r--r-- 1 user staff 2869 Aug 28 11:25 CONTRIBUTING.md
-rw-r--r-- 1 user staff 18105 Aug 28 11:25 FILES.json
-rw-r--r-- 1 user staff 35149 Aug 28 11:25 LICENSE
-rw-r--r-- 1 user staff 222 Aug 28 11:25 MAINTAINERS.md
-rw-r--r-- 1 user staff 920 Aug 28 11:25 MANIFEST.json
-rw-r--r-- 1 user staff 1352 Aug 28 11:25 README.md
-rw-r--r-- 1 user staff 25 Aug 28 11:25 _config.yml
drwxr-xr-x 3 user staff 96 Aug 28 11:25 collections
drwxr-xr-x 5 user staff 160 Aug 28 11:25 docs
drwxr-xr-x 3 user staff 96 Aug 28 11:25 meta
drwxr-xr-x 18 user staff 576 Aug 28 11:25 playbooks
drwxr-xr-x 3 user staff 96 Aug 28 11:25 plugins
drwxr-xr-x 4 user staff 128 Aug 28 11:25 roles
已安装 “ibm.power_aix:1.0.2″。
默认情况下,它安装在用户的主目录下的 .ansible 文件夹中。
还可以使用 -p 选项更改安装目录。
2) 检查 ibm.power_aix 模块
$ ls -l /Users/c_u/.ansible/collections/ansible_collections/ibm/power_aix/plugins/modules
total 1144
-rw-r--r-- 1 user staff 9909 Aug 28 11:25 devices.py
-rw-r--r-- 1 user staff 21228 Aug 28 11:25 emgr.py
-rw-r--r-- 1 user staff 12395 Aug 28 11:25 filesystem.py
-rw-r--r-- 1 user staff 47141 Aug 28 11:25 flrtvc.py
-rw-r--r-- 1 user staff 4670 Aug 28 11:25 geninstall.py
-rw-r--r-- 1 user staff 11142 Aug 28 11:25 installp.py #<= 今回試したいモジュール
-rw-r--r-- 1 user staff 15613 Aug 28 11:25 lvg.py
-rw-r--r-- 1 user staff 4383 Aug 28 11:25 mktcpip.py
-rw-r--r-- 1 user staff 8581 Aug 28 11:25 mount.py
-rw-r--r-- 1 user staff 50696 Aug 28 11:25 nim.py
-rw-r--r-- 1 user staff 42418 Aug 28 11:25 nim_backup.py
-rw-r--r-- 1 user staff 60807 Aug 28 11:25 nim_flrtvc.py
-rw-r--r-- 1 user staff 35808 Aug 28 11:25 nim_suma.py
-rw-r--r-- 1 user staff 36950 Aug 28 11:25 nim_updateios.py
-rw-r--r-- 1 user staff 49891 Aug 28 11:25 nim_upgradeios.py
-rw-r--r-- 1 user staff 54317 Aug 28 11:25 nim_vios_alt_disk.py
-rw-r--r-- 1 user staff 22222 Aug 28 11:25 nim_vios_hc.py
-rw-r--r-- 1 user staff 18387 Aug 28 11:25 nim_viosupgrade.py
-rw-r--r-- 1 user staff 29612 Aug 28 11:25 suma.py
准备 ansible 环境。
・准备存货文件
$ cat inventory
[test]
xx.xxx.xx.xxx #<= 対象IPアドレス
准备ansible.cfg
$ cat ansible.cfg
[defaults]
inventory = ./inventory
remote_user = root
ask_pass = false
become = true
private_key_file = ./id_rsa
我能连上吗?我来试试ping模块。
$ ansible test -m ping
[WARNING]: Platform aix on host xx.xxx.xx.xxx is using the discovered Python interpreter at /usr/bin/python, but future
installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
xx.xxx.xx.xxx | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
由于ansible_facts显示连接已建立,因此需要在ansible.cfg中添加”interpreter_python=/usr/bin/python”。
[defaults]
inventory = ./inventory
remote_user = root
ask_pass = false
become = true
interpreter_python=/usr/bin/python #<= 追加
private_key_file = ./id_rsa
・我要尝试Ping模块。
$ ansible test -m ping
xx.xxx.xx.xxx | SUCCESS => {
"changed": false,
"ping": "pong"
}
“嘣!”已经通过了。
之前的 interpreter_python 的消息已经消失了。
4) 准备执行 playbook
我在阅读安装模块和QuickStart说明的同时,制作了一个名为”update.yml”的playbook,其目的是更新”bos.sysmgt.nim.client”文件集。
在ansible的官方模块中也有一个名为”installp”的模块。您需要指定power_aix版本的模块。
---
- hosts: all
collections:
- ibm.power_aix #<= 今回導入した ibm.power_aix を指定。
tasks:
- name: Update bos.sysmgt.nim.client
installp:
action: apply
device: /mnt #<= 対象AIXサーバー /mnt ディレクトリにアップデート・モジュールを配置しています
install_list: bos.sysmgt.nim.client #<= 対象ファイルセット
agree_licenses: yes
5) 需要在执行前确认目标服务器的状态
确认 “oslevel” 和 “bos.sysmgt.nim.client” 文件集的级别。
$ ansible test -a 'oslevel -s'
xx.xx.xx.xxx | CHANGED | rc=0 >>
7200-03-03-1914
$ ansible test -a 'lslpp -l bos.sysmgt.nim.client'
xx.xx.xx.xxx | CHANGED | rc=0 >>
Fileset Level State Description
----------------------------------------------------------------------------
Path: /usr/lib/objrepos
bos.sysmgt.nim.client 7.2.3.17 COMMITTED Network Install Manager -
Client Tools
Path: /etc/objrepos
bos.sysmgt.nim.client 7.2.3.17 COMMITTED Network Install Manager -
Client Tools
“bos.sysmgt.nim.client” 文件集的当前级别为 7.2.3.17。
6) 运行
好的,现在我们来执行 update.yml 的实验验证。
$ ansible-playbook update.yml --check
PLAY [all] ***********************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************
ok: [xx.xx.xx.xxx]
TASK [Update bos.sysmgt.nim.client] **********************************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: TypeError: 'NoneType' object is not iterable
fatal: [xx.xx.xx.xxx]: FAILED! => {"changed": false, "module_stderr": "Shared connection to xx.xx.xx.xxx closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n File \"/.ansible/tmp/ansible-tmp-1598704575.200843-28397-151765467413263/AnsiballZ_installp.py\", line 102, in <module>\r\n _ansiballz_main()\r\n File \"/.ansible/tmp/ansible-tmp-1598704575.200843-28397-151765467413263/AnsiballZ_installp.py\", line 94, in _ansiballz_main\r\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n File \"/.ansible/tmp/ansible-tmp-1598704575.200843-28397-151765467413263/AnsiballZ_installp.py\", line 40, in invoke_module\r\n runpy.run_module(mod_name='ansible.modules.installp', init_globals=None, run_name='__main__', alter_sys=True)\r\n File \"/opt/freeware/lib/python2.7/runpy.py\", line 188, in run_module\r\n fname, loader, pkg_name)\r\n File \"/opt/freeware/lib/python2.7/runpy.py\", line 82, in _run_module_code\r\n mod_name, mod_fname, mod_loader, pkg_name)\r\n File \"/opt/freeware/lib/python2.7/runpy.py\", line 72, in _run_code\r\n exec code in run_globals\r\n File \"/tmp/ansible_installp_payload_ZuI7Tg/ansible_installp_payload.zip/ansible/modules/installp.py\", line 344, in <module>\r\n File \"/tmp/ansible_installp_payload_ZuI7Tg/ansible_installp_payload.zip/ansible/modules/installp.py\", line 282, in main\r\nTypeError: 'NoneType' object is not iterable\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
PLAY RECAP ***********************************************************************************************************************
xx.xx.xx.xxx : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
出现了”‘NoneType’ object is not iterable”的错误,导致失败。
在我的调查中,我确认了在dev-collection分支上已经做出了修正。然而,在我下载的1.0.2版本中似乎还没有反映出这些修正。
・dev-collection分支
https://github.com/IBM/ansible-power-aix/blob/dev-collection/plugins/modules/installp.py
・修改历史:
https://github.com/IBM/ansible-power-aix/commit/1c4142715dcee11066e8b5acf683ada07cc05b9f#diff-ff778c4f6c7d881ad8fffe0dbc130fc3
我试着替换了上述 dev-collection 的 install.py 并执行了一次。
$ ansible-playbook update.yml --check
PLAY [all] ***********************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************
ok: [xx.xx.xx.xxx]
TASK [Update bos.sysmgt.nim.client] **********************************************************************************************
changed: [xx.xx.xx.xxx]
PLAY RECAP ***********************************************************************************************************************
xx.xx.xx.xxx : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
沿着这个路线走没错!那么,开始行动吧。
$ ansible-playbook update.yml
PLAY [all] ***********************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************
ok: [xx.xx.xx.xxx]
TASK [Update bos.sysmgt.nim.client] **********************************************************************************************
changed: [xx.xx.xx.xxx]
PLAY RECAP ***********************************************************************************************************************
xx.xx.xx.xxx : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
路过了。
确认
$ ansible test -a 'oslevel -s'
xx.xx.xx.xxx | CHANGED | rc=0 >>
7200-03-03-1914
$ ansible test -a 'lslpp -l bos.sysmgt.nim.client'
xx.xx.xx.xxx | CHANGED | rc=0 >>
Fileset Level State Description
----------------------------------------------------------------------------
Path: /usr/lib/objrepos
bos.sysmgt.nim.client 7.2.3.18 COMMITTED Network Install Manager -
Client Tools
Path: /etc/objrepos
bos.sysmgt.nim.client 7.2.3.18 COMMITTED Network Install Manager -
Client Tools
操作系统级别没有变化。
文件集 “bos.sysmgt.nim.client” 已更新至版本 7.2.3.18。更新成功!
概括起来
・截至2020年8月29日,IBM的Power AIX 1.0.2版本的installp.py模块存在一个错误。
・目前正在dev-collection分支上进行修复。
提交:1c41427「installp: 迭代前检查”parts”是否为非空。」
https://github.com/IBM/ansible-power-aix/commit/1c4142715dcee11066e8b5acf683ada07cc05b9f
期待着修正后的installp模块的后续正式发布…
这就是上面的内容。