Ansibleをオフラインでインストールするためのメモ

# Ansibleをオフラインでインストール

本記事はAnsibleをオフライン環境でインストールするために調査したものになります。
なので、中途半端ですし、間違っている可能性もありますので、あくまでも参考程度となります。

## 環境

```
# cat /etc/redhat-release 
CentOS Linux release 8.3.2011

# pip3 --version
pip 20.3.3 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)

# python3 --version
Python 3.6.8
```

## 資材を揃える

まず、最新のAnsibleの依存関係を知るためにオンライン環境で以下を実施します。
ansible2.10からはansible-baseがモジュールとして入ったようです。

```
【オンラインでやる作業】
# mkdir /tmp/src
# pip3 download -d /tmp/src --no-binary :all: ansible 
# ls -l /tmp/src
合計 35968
-rw-r--r-- 1 root root   257594 12月 20 18:05 Jinja2-2.11.2.tar.gz
-rw-r--r-- 1 root root    19151 12月 20 18:05 MarkupSafe-1.1.1.tar.gz
-rw-r--r-- 1 root root   269377 12月 20 18:05 PyYAML-5.3.1.tar.gz
-rw-r--r-- 1 root root 28622006 12月 20 18:04 ansible-2.10.4.tar.gz
-rw-r--r-- 1 root root  5708083 12月 20 18:05 ansible-base-2.10.4.tar.gz
-rw-r--r-- 1 root root   471302 12月 20 18:05 cffi-1.14.4.tar.gz
-rw-r--r-- 1 root root   539756 12月 20 18:05 cryptography-3.3.1.tar.gz
-rw-r--r-- 1 root root    79359 12月 20 18:05 packaging-20.8.tar.gz
-rw-r--r-- 1 root root   161330 12月 20 18:05 pycparser-2.20.tar.gz
-rw-r--r-- 1 root root   649718 12月 20 18:05 pyparsing-2.4.7.tar.gz
-rw-r--r-- 1 root root    33917 12月 20 18:05 six-1.15.0.tar.gz
```

また、上とは別に以下も必要なものとなる。

```
pip-20.3.3.tar.gz
wheel-0.36.2.tar.gz
setuptools-51.0.0.tar.gz
sshpass-1.06-9.el8.x86_64.rpm
```

上のパッケージを参考に https://pypi.org/ より必要なものをダウンロードします。
sshpassは以下よりダウンロードする。
https://centos.pkgs.org/8/epel-x86_64/sshpass-1.06-9.el8.x86_64.rpm.html
なんらかの方法でオフライン環境に必要パッケージを格納します。
以降は格納できたとして、進めます。

## sshpassのインストール

```
# mkdir /tmp/sshpass
# ls -l /tmp/sshpass
-rw-r--r-- 1 root root 28064 12月 21 09:15 sshpass-1.06-9.el8.x86_64.rpm

# rpm -ivh /tmp/sshpass/sshpass-1.06-9.el8.x86_64.rpm
```

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

```
# mkdir /tmp/pip
# ls -l /tmp/pip
-rw-r--r-- 1 root root 1529320 12月 21 09:15 pip-20.3.3.tar.gz

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

## Ansibleのインストール

以下のコマンドでAnsibleをインストールします。

```
# mkdir /tmp/src
# ls -l /tmp/src
-rw-r--r-- 1 root root   257594 12月 21 09:15 Jinja2-2.11.2.tar.gz
-rw-r--r-- 1 root root    19151 12月 21 09:15 MarkupSafe-1.1.1.tar.gz
-rw-r--r-- 1 root root   269377 12月 21 09:15 PyYAML-5.3.1.tar.gz
-rw-r--r-- 1 root root 28622006 12月 21 09:15 ansible-2.10.4.tar.gz
-rw-r--r-- 1 root root  5708083 12月 21 09:15 ansible-base-2.10.4.tar.gz
-rw-r--r-- 1 root root   471302 12月 21 09:15 cffi-1.14.4.tar.gz
-rw-r--r-- 1 root root   539756 12月 21 09:15 cryptography-3.3.1.tar.gz
-rw-r--r-- 1 root root    79359 12月 21 09:15 packaging-20.8.tar.gz
-rw-r--r-- 1 root root   161330 12月 21 09:15 pycparser-2.20.tar.gz
-rw-r--r-- 1 root root   649718 12月 21 09:15 pyparsing-2.4.7.tar.gz
-rw-r--r-- 1 root root  1957464 12月 21 14:11 setuptools-51.0.0.tar.gz
-rw-r--r-- 1 root root    33917 12月 21 09:15 six-1.15.0.tar.gz
-rw-r--r-- 1 root root    65393 12月 21 14:21 wheel-0.36.2.tar.gz

# python3 -m pip install --no-index --find-links /tmp/src/ansible-2.10.4.tar.gz --user ansible
Processing /tmp/src/ansible-2.10.4.tar.gz
Collecting ansible-base<2.11,>=2.10.3
  Using cached ansible-base-2.10.4.tar.gz (5.7 MB)
Requirement already satisfied: jinja2 in /usr/local/lib/python3.6/site-packages (from ansible-base<2.11,>=2.10.3->ansible==2.10.4) (2.11.2)
Requirement already satisfied: PyYAML in /usr/local/lib64/python3.6/site-packages (from ansible-base<2.11,>=2.10.3->ansible==2.10.4) (5.3.1)
Requirement already satisfied: cryptography in /usr/local/lib64/python3.6/site-packages (from ansible-base<2.11,>=2.10.3->ansible==2.10.4) (3.3.1)
Requirement already satisfied: cffi>=1.12 in /usr/local/lib64/python3.6/site-packages (from cryptography->ansible-base<2.11,>=2.10.3->ansible==2.10.4) (1.14.4)
Requirement already satisfied: six>=1.4.1 in /usr/local/lib/python3.6/site-packages (from cryptography->ansible-base<2.11,>=2.10.3->ansible==2.10.4) (1.15.0)
Requirement already satisfied: pycparser in /usr/local/lib/python3.6/site-packages (from cffi>=1.12->cryptography->ansible-base<2.11,>=2.10.3->ansible==2.10.4) (2.20)
Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib64/python3.6/site-packages (from jinja2->ansible-base<2.11,>=2.10.3->ansible==2.10.4) (1.1.1)
Collecting packaging
  Using cached packaging-20.8-py2.py3-none-any.whl (39 kB)
Collecting pyparsing>=2.0.2
  Using cached pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
Using legacy 'setup.py install' for ansible, since package 'wheel' is not installed.
Using legacy 'setup.py install' for ansible-base, since package 'wheel' is not installed.
Installing collected packages: pyparsing, packaging, ansible-base, ansible
    Running setup.py install for ansible-base ... done
    Running setup.py install for ansible ... done
Successfully installed ansible-2.10.4 ansible-base-2.10.4 packaging-20.8 pyparsing-2.4.7
```

```
# ansible --version
ansible 2.10.4
  config file = None
  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, Aug 24 2020, 17:57:11) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
```

インストール後のパッケージのバージョン一覧。

```
# pip list
Package              Version
-------------------- -----------
ansible              2.10.4
ansible-base         2.10.4
bcc                  0.14.0
blivet               3.2.2
Brlapi               0.6.7
cffi                 1.14.4
chardet              3.0.4
chrome-gnome-shell   0.0.0
configobj            5.0.6
cryptography         3.3.1
cupshelpers          1.0
dasbus               1.2
dbus-python          1.2.4
decorator            4.2.1
ethtool              0.14
gpg                  1.13.1
html5lib             0.999999999
idna                 2.5
iniparse             0.4
initial-setup        0.3.81.6
iotop                0.6
isc                  2.0
Jinja2               2.11.2
jsonpointer          1.10
kmod                 0.1
langtable            0.0.51
libvirt-python       6.0.0
lxml                 4.2.3
MarkupSafe           1.1.1
netaddr              0.7.19
nftables             0.1
ntplib               0.3.3
ordered-set          2.0.2
packaging            20.8
pcp                  5.0
perf                 0.1
pid                  2.1.1
pip                  20.3.3
ply                  3.9
productmd            1.11
psycopg2             2.7.5
pwquality            1.4.0
pycairo              1.16.3
pycparser            2.20
pycups               1.9.72
pycurl               7.43.0.2
pydbus               0.6.0
pyenchant            2.0.0
pygobject            3.28.3
pyinotify            0.9.6
pykickstart          3.16.11
pyparsing            2.4.7
pyparted             3.11.0
PySocks              1.6.8
python-dateutil      2.6.1
python-dmidecode     3.12.2
python-linux-procfs  0.6.2
python-meh           0.47.2
pytz                 2017.2
pyudev               0.21.0
pyxdg                0.25
PyYAML               5.3.1
requests             2.20.0
requests-file        1.4.3
requests-ftp         0.3.1
rpm                  4.14.3
rtslib-fb            2.1.73
schedutils           0.6
selinux              2.9
sepolicy             1.1
setools              4.3.0
setroubleshoot       1.1
setuptools           51.0.0
simpleline           1.1.1
six                  1.15.0
slip                 0.6.4
slip.dbus            0.6.4
sos                  3.9
SSSDConfig           2.3.0
subscription-manager 1.27.16
syspurpose   　　　　 1.27.16
systemd-python       234
urllib3              1.24.2
webencodings         0.5.1
```


## 番外編

Ansibleのバージョン指定をした場合。今回は2.9の最新バージョンを選択。
確認すると、2.10では*tar.gzだったが、2.9は*.whlがあることがわかります。

```
【オンラインでやる作業】
# mkdir /tmp/src2
# pip3 download -d /tmp/src2 ansible==2.9.16
# ls -l /tmp/src2
合計 17400
-rw-r--r-- 1 root root   125774 12月 20 18:55 Jinja2-2.11.2-py2.py3-none-any.whl
-rw-r--r-- 1 root root    27520 12月 20 18:55 MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl
-rw-r--r-- 1 root root   269377 12月 20 18:55 PyYAML-5.3.1.tar.gz
-rw-r--r-- 1 r# python3 -m pip install /tmp/src2/ansible-2.9.16.tar.gz oot root 14245156 12月 20 18:55 ansible-2.9.16.tar.gz
-rw-r--r-- 1 root root   401227 12月 20 18:55 cffi-1.14.4-cp36-cp36m-manylinux1_x86_64.whl
-rw-r--r-- 1 root root  2617057 12月 20 18:55 cryptography-3.3.1-cp36-abi3-manylinux2010_x86_64.whl
-rw-r--r-- 1 root root   112041 12月 20 18:55 pycparser-2.20-py2.py3-none-any.whl
-rw-r--r-- 1 root root    10963 12月 20 18:55 six-1.15.0-py2.py3-none-any.whl
```

```
# python3 -m pip install --no-index --find-links /tmp/src2/ansible-2.9.16.tar.gz --user ansible
Processing /tmp/src2/ansible-2.9.16.tar.gz
Collecting cryptography
  Using cached cryptography-3.3.1-cp36-abi3-manylinux2010_x86_64.whl (2.6 MB)
Collecting cffi>=1.12
  Using cached cffi-1.14.4-cp36-cp36m-manylinux1_x86_64.whl (401 kB)
Collecting six>=1.4.1
  Using cached six-1.15.0-py2.py3-none-any.whl (10 kB)
Collecting jinja2
  Using cached Jinja2-2.11.2-py2.py3-none-any.whl (125 kB)
Collecting MarkupSafe>=0.23
  Using cached MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl (27 kB)
Collecting pycparser
  Using cached pycparser-2.20-py2.py3-none-any.whl (112 kB)
Collecting PyYAML
  Using cached PyYAML-5.3.1.tar.gz (269 kB)
Using legacy 'setup.py install' for ansible, since package 'wheel' is not installed.
Using legacy 'setup.py install' for PyYAML, since package 'wheel' is not installed.
Installing collected packages: pycparser, six, MarkupSafe, cffi, PyYAML, jinja2, cryptography, ansible
    Running setup.py install for PyYAML ... done
    Running setup.py install for ansible ... done
Successfully installed MarkupSafe-1.1.1 PyYAML-5.3.1 ansible-2.9.16 cffi-1.14.4 cryptography-3.3.1 jinja2-2.11.2 pycparser-2.20 six-1.15.0
```

```
# pip list
Package              Version
-------------------- -----------
ansible              2.9.16
bcc                  0.14.0
blivet               3.2.2
Brlapi               0.6.7
cffi                 1.14.4
chardet              3.0.4
chrome-gnome-shell   0.0.0
configobj            5.0.6
cryptography         3.3.1
cupshelpers          1.0
dasbus               1.2
dbus-python          1.2.4
decorator            4.2.1
ethtool              0.14
gpg                  1.13.1
html5lib             0.999999999
idna                 2.5
iniparse             0.4
initial-setup        0.3.81.6
iotop                0.6
isc                  2.0
Jinja2               2.11.2
jsonpointer          1.10
kmod                 0.1
langtable            0.0.51
libvirt-python       6.0.0
lxml                 4.2.3
MarkupSafe           1.1.1
netaddr              0.7.19
nftables             0.1
ntplib               0.3.3
ordered-set          2.0.2
pcp                  5.0
perf                 0.1
pid                  2.1.1
pip                  20.3.3
ply                  3.9
productmd            1.11
psycopg2             2.7.5
pwquality            1.4.0
pycairo              1.16.3
pycparser            2.20
pycups               1.9.72
pycurl               7.43.0.2
pydbus               0.6.0
pyenchant            2.0.0
pygobject            3.28.3
pyinotify            0.9.6
pykickstart          3.16.11
pyparted             3.11.0
PySocks              1.6.8
python-dateutil      2.6.1
python-dmidecode     3.12.2
python-linux-procfs  0.6.2
python-meh           0.47.2
pytz                 2017.2
pyudev               0.21.0
pyxdg                0.25
PyYAML               5.3.1
requests             2.20.0
requests-file        1.4.3
requests-ftp         0.3.1
rpm                  4.14.3
rtslib-fb            2.1.73
schedutils           0.6
selinux              2.9
sepolicy             1.1
setools              4.3.0
setroubleshoot       1.1
setuptools           51.0.0
simpleline           1.1.1
six                  1.15.0
slip                 0.6.4
slip.dbus            0.6.4
sos                  3.9
SSSDConfig           2.3.0
subscription-manager 1.27.16
syspurpose           1.27.16
systemd-python       234
urllib3              1.24.2
webencodings         0.5.1
```

```
# ansible --version
ansible 2.9.16
  config file = None
  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, Aug 24 2020, 17:57:11) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
```

### Ansible2.9と2.10のモジュールの差分

| 2.10 | 2.9 |
|:-:|:-:|
|ansible              2.10.4| ansible              2.9.16|
|ansible-base         2.10.4 |   |
|packaging            20.8 |   |
|pyparsing            2.4.7|   |
|webencodings         0.5.1|   |

### path問題

ansibleコマンドで実行できない場合、以下で試してみる。

```
# ./.local/bin/ansible --help
```