Ansible2.10(オフラインインストール)

#はじめに
Ansible2.10から従来のAnsible2.9とは異なり、モジュールの大半がansible-galaxyに集約され最低限のモジュールが利用できるansible-baseの提供が開始される。
ただし、Ansible2.10のインストール形式には以下の２種類がある。
①Ansible-base
Ansible-baseのみの提供。最低限のモジュールとpluginのみ包含されるため、必要なモジュールはansible-galaxyから取得する。
②Ansible
従来の配布形態と同様、Ansible-baseにモジュールやpluginがバインドされた形式。

今回の記事では、②Ansibleのオフラインインストールを実施。
※①Ansible-baseについては別の記事をご参照

#0. 前提条件
以下資源をオフラインの環境へ持ち込み、インストールする。
pipでインストールするもの。(pip listで確認)

```
pip-21.0.1.tar.gz 
wheel-0.36.2.tar.gz
setuptools-54.2.0.tar.gz 
```

###※pipのオフラインアップグレード

```
# pip3 install --upgrade /tmp/pip/pip-20.3.3.tar.gz
```

rpmでインストールするもの。

```
sshpass-1.06-9.el8.x86_64.rpm
```

#1.ansible2.10インストール用ファイルのダウンロード
pipコマンドでansible2.10インストール用ファイルをダウンロード。
実行結果は以下の通り。

```
# pip3 download -d ansible ansible
# ls -ltr
合計 37164
-rw-r--r--. 1 root root 28622006 12月 19 19:28 ansible-2.10.4.tar.gz
-rw-r--r--. 1 root root  5708083 12月 19 19:28 ansible-base-2.10.4.tar.gz
-rw-r--r--. 1 root root   125774 12月 19 19:28 Jinja2-2.11.2-py2.py3-none-any.whl
-rw-r--r--. 1 root root   269377 12月 19 19:28 PyYAML-5.3.1.tar.gz
-rw-r--r--. 1 root root  2655338 12月 19 19:28 cryptography-3.3.1-cp36-abi3-manylinux1_x86_64.whl
-rw-r--r--. 1 root root    39857 12月 19 19:28 packaging-20.8-py2.py3-none-any.whl
-rw-r--r--. 1 root root    27520 12月 19 19:28 MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl
-rw-r--r--. 1 root root    10963 12月 19 19:28 six-1.15.0-py2.py3-none-any.whl
-rw-r--r--. 1 root root   401227 12月 19 19:28 cffi-1.14.4-cp36-cp36m-manylinux1_x86_64.whl
-rw-r--r--. 1 root root    67842 12月 19 19:28 pyparsing-2.4.7-py2.py3-none-any.whl
-rw-r--r--. 1 root root   112041 12月 19 19:28 pycparser-2.20-py2.py3-none-any.whl
```

#2. インストール
1.の手順でダウンロードした資源をオフラインの環境に配置。
以下コマンドを実行し、ansibleをインストール。

```
# pip3 install <パッケージ名>
```
インストールされたことを確認する。

```
# ansible --version
ansible 2.10.4
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.6/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.6.8 (default, Apr 16 2020, 01:36:27) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
```

#3. テスト用playbook実行
以下テスト用のplaybookを作成し、稼働確認

```
---
  - hosts: localhost

    tasks:
      - file:
          path: /tmp
          state: directory

```

実行結果は以下の通り。ansibleが正常に動いていることが確認できた。

```
# # ansible-playbook test.yml
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [file] ********************************************************************
ok: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```

#4. 依存関係
依存関係は以下

```
$ pipdeptree
ansible==2.10.7
  - ansible-base [required: >=2.10.5,<2.11, installed: 2.10.6]
    - cryptography [required: Any, installed: 2.3]
      - asn1crypto [required: >=0.21.0, installed: 0.24.0]
      - cffi [required: >=1.7,!=1.11.3, installed: 1.11.5]
        - pycparser [required: Any, installed: 2.14]
      - idna [required: >=2.1, installed: 2.5]
      - six [required: >=1.4.1, installed: 1.11.0]
    - jinja2 [required: Any, installed: 2.10.1]
      - MarkupSafe [required: >=0.23, installed: 0.23]
    - packaging [required: Any, installed: 20.9]
      - pyparsing [required: >=2.0.2, installed: 2.4.7]
    - PyYAML [required: Any, installed: 3.12]
    - $ pipdeptree
ansible==2.10.7
  - ansible-base [required: >=2.10.5,<2.11, installed: 2.10.6]
    - cryptography [required: Any, installed: 2.3]
      - asn1crypto [required: >=0.21.0, installed: 0.24.0]
      - cffi [required: >=1.7,!=1.11.3, installed: 1.11.5]
        - pycparser [required: Any, installed: 2.14]
      - idna [required: >=2.1, installed: 2.5]
      - six [required: >=1.4.1, installed: 1.11.0]
    - jinja2 [required: Any, installed: 2.10.1]
      - MarkupSafe [required: >=0.23, installed: 0.23]
    - packaging [required: Any, installed: 20.9]
      - pyparsing [required: >=2.0.2, installed: 2.4.7]
    - PyYAML [required: Any, installed: 3.12]
```