Ansible : AIX モジュールの確認 - installp


## Ansible AIX 検証 : installp モジュール


Ansible の installp (AIXファイルセット導入) モジュールの動きを確認しました。


* installp モジュールの説明はこちらを参照：　[installp_modue](https://docs.ansible.com/ansible/latest/modules/installp_module.html)



Notes に気になる記載<font color="ForestGreen">「Notes : If the package is already installed, even the package/fileset is new, the module will not install it.」</font>があります。
AIX のinstallpコマンドでは -a オプションを使用してファイルセットのアップデート実行はできますが、installp モジュールではアップデートは実行できないのでしょうか...?


---
* installp モジュール本体の内容はこちらと推測：[Link]
(https://github.com/kairoaraujo/ansible-aix-support/blob/master/lib/ansible/modules/packaging/os/installp.py)

installp.py 内に -a オプションを使用する条件分岐はあるようですが...

```
266 | else:
267 |      if not module.check_mode:
268 |          rc, install_out, err = module.run_command(
269 |              "%s -a %s -X -d %s %s" % (
270 |                  installp_cmd, accept_license_param[accept_license],
271 |                  repository_path, package))
```

---


### 実行環境
**Ansibleサーバー** : 
 - Local PC, Mac
 - Python 2.7.10
 - Ansible 2.9.9

**実行対象のAIXサーバー**: 
 - AIX 7.2 TL03 SP03
 - Python 2.7.15


**準備：アップデートメディアの配置**: 

AIX 7.2 TL03 SP04 Base メディア iso ファイル(aix_7200-03-04-1938_flash_022020.iso)を 対象AIX サーバー上に配置し、loopmount コマンドを実施して /mnt にマウントしています。


```
# loopmount -i /inst.images/aix_7200-03-04-1938_flash_022020.iso -o "-V cdrfs -o ro" -m /mnt
# echo $?
0
# ls -l /mnt
total 100
-rw-rw-r--    1 4000     4000             42 Jan 30 08:00 .Version
drwxr-xr-x    2 4000     4000           2048 Jan 30 07:57 7200-03
-rw-r--r--    1 4000     4000             16 Jan 30 07:57 OSLEVEL
-rw-r--r--    1 4000     4000            901 Jan 30 07:57 README.aix
drwxrwxr-x    4 4000     4000           2048 Jan 30 07:57 RPMS
-rw-r--r--    1 4000     4000           6365 Jan 30 07:57 bosinst.data
-rw-r--r--    1 4000     4000          15189 Jan 30 07:57 image.data
drwxr-xr-x    3 4000     4000           2048 Jan 30 07:57 installp
drwxr-xr-x    3 4000     4000           2048 Jan 30 07:58 ismp
drwxr-xr-x    2 4000     4000           6144 Jan 30 07:58 license
drwxr-xr-x    3 4000     4000           2048 Jan 30 07:57 ppc
drwxr-xr-x    3 4000     4000           2048 Jan 30 07:57 root
drwxr-xr-x   10 4000     4000           2048 Jan 30 07:59 usr
```

**準備：その他、Ansible 稼働の事前設定済み。**

---


**1) installp モジュールで、ファイルセット導入および既存ファイルセットのアップデート可否確を認**


使用する playbook

```aix_installp.yml
---
- hosts: all
  become: true
  tasks:

  # update fileset
  - installp:
      name: bos.sysmgt.nim.client 　　#< AIX に導入されている
      repository_path: /mnt          #< base iso ファイルのマウント・ディレクトリ
      accept_license: true
    register: r

  - debug:
      var: r

- hosts: all
  become: true
  tasks:

  # install additional fileset
  - installp:
      name: bos.sysmgt.nim.master           #< AIX に導入されていない
      repository_path: /mnt                 #< base iso ファイルのマウント・ディレクトリ
      accept_license: true
    register: r

  - debug:
      var: r
```

* accept_license は yes ではなく true でも実行できました。
* state は記述していないので、default 値の present (導入) が使用されます。


対象AIXで対象ファイルセットの状態確認

```
# oslevel -s
7200-03-03-1914

# lslpp -l | grep nim
  bos.sysmgt.nim.client     7.2.3.17  COMMITTED  Network Install Manager -
  bos.sysmgt.nim.client     7.2.3.17  COMMITTED  Network Install Manager -
```

「bos.sysmgt.nim.client 」は「7.2.3.17」が導入されていますが、「bos.sysmgt.nim.master 」は導入されていません。


**実行：**

```
$  time ansible-playbook -i ip -u root --private-key=id_rsa --ssh-common-args='-o StrictHostKeyChecking=no' -e ansible_python_interpreter=auto_silent  aix_installp.yml

PLAY [all] ***********************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [xx.xxx.xx.xxx]

TASK [installp] ******************************************************************************************************************
ok: [xx.xxx.xx.xxx]

TASK [debug] *********************************************************************************************************************
ok: [xx.xxx.xx.xxx] => {
    "r": {
        "changed": false,
        "failed": false,
        "msg": "No packages installed. Already installed: {'bos.sysmgt.nim.client': '7.2.3.17'}."
    }
}

PLAY [all] ***********************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [xx.xxx.xx.xxx]

TASK [installp] ******************************************************************************************************************
changed: [xx.xxx.xx.xxx]

TASK [debug] *********************************************************************************************************************
ok: [xx.xxx.xx.xxx] => {
    "r": {
        "changed": true,
        "failed": false,
        "msg": " Installed: bos.sysmgt.nim.master."
    }
}

PLAY RECAP ***********************************************************************************************************************
xx.xxx.xx.xxx              : ok=6    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

real    0m41.629s
user    0m8.117s
sys    0m2.009s
```

=> 「bos.sysmgt.nim.client」に対する処理は、導入済みのためインストールしない、というメッセージを出力しています。
　　 <font color="Red">"msg": "No packages installed. Already installed: {'bos.sysmgt.nim.client': '7.2.3.17'}."</font>



**実行後、ファイルセット確認:**

```
# lslpp -l | grep nim
  bos.sysmgt.nim.client     7.2.3.17  COMMITTED  Network Install Manager -
  bos.sysmgt.nim.master     7.2.3.18  COMMITTED  Network Install Manager -
  bos.sysmgt.nim.client     7.2.3.17  COMMITTED  Network Install Manager -
```

**結果：**「bos.sysmgt.nim.master」 は新規導入されましたが、「bos.sysmgt.nim.client」 はアップデートされませんでした。
<font color="Red">使用した Ansible バージョン 2.9.9 の installp モジュールでは、既存ファイルセットのアップデートは実施されないと考えられます。</font>


##### では、AIX のファイルセットアップデートはAnsible では何で実行したら良いのでしょう？

以下の方法を見つけました。
(他にもあるかもしれません)

1) shell module を使用

・Ansible の shell module を使用してコマンドを実行する方法です。

- 1) installp コマンドを実行し単体のファイルセットアップデートを実行
- 2) install_all_updates コマンドを実行し、用意したモジュールの全てのアップデートを実行


・[Ansible shell module](https://docs.ansible.com/ansible/latest/modules/shell_module.html)

2) aix_nim モジュールを使用

https://github.com/aixoss/ansible-playbooks
AIX OSS に aix_nim というモジュールがありました。NIMを利用したモジュール・アップデートとして使えるのかもしれません。ただ、公式Ansible のモジュールでは検索しても結果にでてきておらず、公式モジュールではないのかもしれません。

---

この記事では、1) shell module を使用した installp、install_all_updates コマンドの実行を確認しました。


#### 1-1. installp コマンド実行

実行前の状態

```
# lslpp -l | grep nim.client
  bos.sysmgt.nim.client     7.2.3.17  COMMITTED  Network Install Manager -
  bos.sysmgt.nim.client     7.2.3.17  COMMITTED  Network Install Manager -
```

以下の yml を使用。「bos.sysmgt.nim.client」をアップデートします。

```installp_update.yml
---
- hosts: all
  become: true
  tasks:

  - shell: |
      installp -a -d/mnt bos.sysmgt.nim.client
```

**実行：**

```
$ time ansible-playbook -i ip -u root --private-key=id_rsa --ssh-common-args='-o StrictHostKeyChecking=no' -e ansible_python_interpreter=auto_silent  installp_update.yml

PLAY [all] ***********************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [xx.xxx.xx.xxx]

TASK [shell] *********************************************************************************************************************
changed: [xx.xxx.xx.xxx]

PLAY RECAP ***********************************************************************************************************************
xx.xxx.xx.xxx              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

real    0m22.252s
user    0m4.461s
sys    0m1.028s

```


実行後の状態

```
# lslpp -l | grep nim.client
  bos.sysmgt.nim.client     7.2.3.18  COMMITTED  Network Install Manager -
  bos.sysmgt.nim.client     7.2.3.18  COMMITTED  Network Install Manager -
```


**結果：** ->  「bos.sysmgt.nim.client」 が 「7.2.3.18」 にupdate されました。

----

#### 1-2. install_all_updates コマンド実行


```install_all_updates.yml
---
- hosts: all
  become: true
  tasks:

  - shell: |
      install_all_updates -d /mnt
```


実行前の状態

```
# oslevel -s
7200-03-03-1914
```

lslpp の before 取得

```
# lslpp -l > lslpp_bef.txt 
```

**実行：**

```
$ time ansible-playbook -i ip -u root --private-key=id_rsa --ssh-common-args='-o StrictHostKeyChecking=no' -e ansible_python_interpreter=auto_silent install_all_updates.yml

PLAY [all] ***********************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
ok: [xx.xxx.xx.xxx]

TASK [shell] *********************************************************************************************************************
changed: [xx.xxx.xx.xxx]

PLAY RECAP ***********************************************************************************************************************
xx.xxx.xx.xxx              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

real    4m24.074s
user    0m38.401s
sys    0m6.777s
```



AIX にログインして確認

```
# oslevel -s
7200-03-04-1938
```
**結果:** AIX7.2TL03SP03 から AIX7.2TL03SP04 に変更されました。


lslpp の after 取得

```
# lslpp -l > lslpp_aft.txt
```

lslpp で diff の確認

ファイルセットのバージョンが変更されていることが確認できます。

```
# diff lslpp_bef.txt lslpp_aft.txt
53c53
<   X11.motif.mwm              7.2.0.0  COMMITTED  AIXwindows Motif Window
---
>   X11.motif.mwm             7.2.3.16  COMMITTED  AIXwindows Motif Window
91c91
<   adde.v2.ethernet.rte      7.2.3.15  COMMITTED  ADDE Ethernet Device Runtime
---
>   adde.v2.ethernet.rte      7.2.3.16  COMMITTED  ADDE Ethernet Device Runtime
95c95
<   artex.base.rte            7.2.3.16  COMMITTED  AIX Runtime Expert
---
>   artex.base.rte            7.2.3.17  COMMITTED  AIX Runtime Expert
98c98
<   bos.64bit                 7.2.3.16  COMMITTED  Base Operating System 64 bit
---
>   bos.64bit                 7.2.3.17  COMMITTED  Base Operating System 64 bit
100,101c100,101
<   bos.acct                  7.2.3.16  COMMITTED  Accounting Services
<   bos.adt.base              7.2.3.15  COMMITTED  Base Application Development
---
>   bos.acct                  7.2.3.17  COMMITTED  Accounting Services
>   bos.adt.base              7.2.3.16  COMMITTED  Base Application Development
105c105
<   bos.adt.include           7.2.3.16  COMMITTED  Base Application Development
---
>   bos.adt.include           7.2.3.17  COMMITTED  Base Application Development
112,113c112,113
<   bos.ahafs                 7.2.3.15  COMMITTED  Aha File System
<   bos.aixpert.cmds          7.2.3.15  COMMITTED  AIX Security Hardening
---
>   bos.ahafs                 7.2.3.16  COMMITTED  Aha File System
>   bos.aixpert.cmds          7.2.3.16  COMMITTED  AIX Security Hardening
115c115
<                             7.2.3.19  COMMITTED  Alternate Disk Installation
---
>                             7.2.3.20  COMMITTED  Alternate Disk Installation
117c117
<   bos.alt_disk_install.rte  7.2.3.16  COMMITTED  Alternate Disk Installation
---
>   bos.alt_disk_install.rte  7.2.3.17  COMMITTED  Alternate Disk Installation
122c122
<   bos.cluster.rte           7.2.3.16  COMMITTED  Cluster Aware AIX
---
>   bos.cluster.rte           7.2.3.17  COMMITTED  Cluster Aware AIX
127,128c127,128
<   bos.diag.rte              7.2.3.16  COMMITTED  Hardware Diagnostics
<   bos.diag.util             7.2.3.17  COMMITTED  Hardware Diagnostics Utilities
---
>   bos.diag.rte              7.2.3.17  COMMITTED  Hardware Diagnostics
>   bos.diag.util             7.2.3.18  COMMITTED  Hardware Diagnostics Utilities
131c131


~ 以下長いです。省略 ~ 
```



AIX アップデートに対応する公式モジュールは見つけられていませんが、shell モジュールのコマンド実行で実施することができました。



以上です。