この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
皆様こんにちは。
今回は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をインストールするのは非常に手間が掛かり大変でしたが、良い経験になりました。
次回もよろしくお願いします。