皆様こんにちは。
今回はAnsibleのオフラインインストールの方法についての紹介をさせていただきます。

1.前提条件

・使用するAMIは「RHEL-8.3.0_HVM-20201031-x86_64-0-Hourly2-GP2」
・Pyhon3.9.7インストール済み
・セキュリティグループのインバウンドルールはSSH接続を許可、アウトバウンドルールは外部に接続させないため削除
・それが以外のインスタンスの設定はデフォルト
・今回Ansibleのインストールにはpipコマンドを利用します

2.Ansibleとは

Ansibleは、IT自動化ツールです。システムの設定、ソフトウェアのデプロイ、継続的なデプロイメントやダウンタイムなしのローリングアップデートなど、より高度なITタスクのオーケストレーションが可能です。
Ansibleの主な目的は、シンプルさと使いやすさです。また、セキュリティと信頼性に重点を置いており、最小限の可動部、トランスポートにOpenSSHを使用し(他のトランスポートやプルモードも代替可能)、人間(プログラムに精通していない人でも)が監査できるように設計された言語が特徴である。
引用:公式ドキュメント – Ansible Documentation

また今回重要になる2つの用語を説明します。

コントロールノード

Ansibleをインストールした端末のことで、ansible-playbookコマンドなどを利用して管理対象ノードで操作を実行します。

管理対象(ターゲット)ノード

コントロールノードによって管理される端末のことです。コントロールノードから管理対象ノードはSSHで接続されます。

3.Ansibleのオフラインインストール

前提条件の設定で作成したインスタンスにTeraTermを利用しSSHで接続します。

接続後のカレントディレクトリは/home/ec2-userです。

以下のコマンドを使用して今回Ansibleのオフラインインストールの作業を行うディレクトリを作成し、移動します。

mkdir package
cd package

そしたら今回Ansible導入に必要なパッケージをローカルPCに保存した後、こちらのディレクトリに転送します。

今回Ansible導入に必要なパッケージは以下になります。
全てpypi.python.orgからダウンロードできます。

  • pycparser-2.21-py2.py3-none-any.whl
  • pyparsing-3.0.9-py3-none-any.whl
  • cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
  • MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • resolvelib-0.5.4-py2.py3-none-any.whl
  • packaging-21.3-py3-none-any.whl
  • cryptography-37.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
  • Jinja2-3.1.2-py3-none-any.whl
  • ansible-core-2.12.6.tar.gz
  • ansible-5.9.0.tar.gz(Ansible本体)

パッケージを作成したディレクトリに転送後、以下のコマンドを上から順に実行してAnsibleをインストールしていきます。(依存関係を考慮しているためこの順番になりました)


pip3 install pycparser-2.21-py2.py3-none-any.whl

pip3 install pyparsing-3.0.9-py3-none-any.whl

pip3 install cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl 

pip3 install MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

pip3 install resolvelib-0.5.4-py2.py3-none-any.whl

pip3 install packaging-21.3-py3-none-any.whl

pip3 install cryptography-37.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

pip3 install PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl

pip3 install Jinja2-3.1.2-py3-none-any.whl

pip3 install ansible-core-2.12.6.tar.gz

pip3 install ansible-5.9.0.tar.gz

またパスワード認証によるSSH接続がしたい場合、sshpassが必要になるので追加でダウンロード後、以下のコマンドでインストールしてください。(CentOS用のものですがRHELでも動作しました)

sudo rpm -ivh sshpass-1.09-4.el8.x86_64.rpm

以下のコマンドを使用してAnsibleがインストールできたかを確認します。

ansible --version

出力

ansible [core 2.12.6]
  config file = None
  configured module search path = ['/home/ec2-user/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/ec2-user/.local/lib/python3.9/site-packages/ansible
  ansible collection location = /home/ec2-user/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/ec2-user/.local/bin/ansible
  python version = 3.9.7 (default, Sep 13 2021, 08:18:39) [GCC 8.5.0 20210514 (Red Hat 8.5.0-3)]
  jinja version = 3.1.2
  libyaml = True

Ansibleのインストールを確認できました。

最後に以下のコマンドでホームディレクトリに移動後、不要なったディレクトリを削除しましょう。

cd ~/
rm -r package

これでAnsibleのオフラインインストールの説明を終わります。

4.検証1

インストールしたAnsibleが実際に動作するかの検証をしていきます。
検証はAnsibleをインストールしたインスタンス(コントロールノード)が、他のインスタンス(管理対象ノード)に対しPlaybookを実行できるかを確かめます。

コントロールノードは管理対象ノードにSSHで接続するので、セキュリティグループのアウトバウンドルールにSSHを許可するルールを追加します。

4-1.管理対象ノード設定

セキュリティグループの変更ができたらpythonをインストールしたEC2(管理対象ノード)をもう一台起動させ、同じセキュリティグループを割り当てます。
この時、pemキーを「target-key」という名前で新規作成し、管理対象ノードに使用します。

4-2.コントロールノード設定

次に再度コントロールノードにTeraTermを利用しSSHで接続します。
カレントディレクトリは/home/ec2-userです。

まず管理対象ノードのpemキーをコントロールノードの/home/ec2-user/.sshに転送してください。
転送後、以下のコマンドを使用してコントロールノードがpemキーを使用できるようにします。

chmod 600 .ssh/target-key.pem

次に以下のコマンドを使用してAnsibleの動作検証の作業を行うディレクトリを作成し、移動します。

mkdir ansible-test
cd ansible-test

そしたら、管理対象ノードの情報を記載したインベントリファイルを以下のコマンドで作成します。

vi hosts

以下の内容を記述し保存。

[target]
172.31.28.165

[target:vars]
ansible_user='ec2-user'
ansible_ssh_private_key_file='/home/ec2-user/.ssh/target-key.pem'

また、以下のコマンドを使用して管理対象ノードにテストファイルを作成するplaybookを作成しましょう。

vi testplaybook.yml

以下の内容を記述し保存。

- hosts: target

  tasks:
  - name: touch-test
    shell: touch test.txt

playbookの作成ができたら、以下のコマンドで実際に実行してみましょう。

ansible-playbook -i hosts testplaybook.yml

出力

PLAY [target] ******************************************************************

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

TASK [touch-test] **************************************************************
changed: [172.31.28.165]

PLAY RECAP *********************************************************************
172.31.28.165              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

実行を確認できました。

最後に管理対象ノードにTeraTermを利用しSSHで接続し、lsコマンドでテストファイル作成を確認します。

[ec2-user@ip-172-31-28-165 ~]$ ls
test.txt

管理対象ノードにテストファイルが作成されていることを確認できました。

これで検証を終わります。

4.検証2

こちらではコントロールノードがsshpassを利用してパスワード認証で管理対象ノードに接続できるかの検証をしていきます。

4-1.管理対象ノード設定

まずパスワード認証で管理対象ノードに接続できるようにするために、以下のコマンドで管理対象ノードのユーザー(ec2-user)にパスワードを設定します。

sudo passwd ec2-user

コマンド入力後パスワードの入力を求められるので、設定したいパスワードを入力してください。

またパスワード認証によるSSH接続の許可をするために以下のコマンドを使用し、コンフィグファイルの一部内容を変更します。

sudo vi /etc/ssh/sshd_config

変更前

#PasswordAuthentication yes
PasswordAuthentication no

変更後

PasswordAuthentication yes
#PasswordAuthentication no

変更ができたら最後にsshdを再起動します。

sudo systemctl restart sshd

これで管理対象ノード側の設定は完了です。

4-2.コントロールノード設定

まず管理対象ノードに対し疎通確認をしてみましょう。以下のコマンドならインベントリファイル、playbookなしで疎通確認をすることができます。

ansible all -i [管理対象ノードのIPアドレス], -m ping -u ec2-user --ask-pass

出力

172.31.28.165 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

確認できました。

次に以下のコマンドでインベントリファイルの設定を変更します。

vi hosts

以下の内容に変更します。

[target]
172.31.28.165

[target:vars]
ansible_user='ec2-user'
ansible_password = 'xxxx'

ansible_passwordには管理対象ノードに設定したパスワードを入力します。

またplaybookも以下のコマンドで変更します。

vi testplaybook.yml

以下の内容に変更します。

- hosts: target

  tasks:
  - name: touch-test
    shell: touch test2.txt

playbookの作成ができたら、以下のコマンドで実際に実行してみましょう。

ansible-playbook -i hosts testplaybook.yml

出力

PLAY [target] ******************************************************************************************************************

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

TASK [touch-test] **************************************************************************************************************
changed: [172.31.28.165]

PLAY RECAP *********************************************************************************************************************
172.31.28.165              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

実行を確認できました。

※この時"Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host’s fingerprint to your known_hosts file to manage this host."というエラーが出て実行が失敗した場合、一度sshコマンドでログインして、fingerprintを記録する必要があります。
そのために、以下のコマンドを使用してください。

ssh [管理対象ノードのユーザ名]@[管理対象ノードのIPアドレス]

パスワード入力を求められるので、入力後ログイン出来たらすぐ切断してかまいません。
これでfingerprintをknown_hostsに追加することができます。

最後に管理対象ノードでlsコマンドを利用して2つ目のテストファイルが作成されているかの確認をします

[ec2-user@ip-172.31.28.165 ~]$ ls
test2.txt  test.txt

テストファイルが作成されていることを確認できました。

これで今回の検証は以上です

5.感想

オフラインでAnsibleをインストールするのは非常に手間が掛かり大変でしたが、良い経験になりました。
次回もよろしくお願いします。

Last modified: 2022-06-20

Author