Ansible は ssh 接続をしてターゲットノードを管理します。
今回は AWS の EC2 を管理する手順を解説します。
Ansible のインストールや初期設定に関しては以下の記事を参照ください。
ansible-playbookの作成方法&使い方については以下の記事を参照ください。
コントロールノードとターゲットノードの構成
- コントロールノード:cnt07(CentOS7)
- ターゲットノード:ip-172-xxx-xxx-246(AWS)
Ansibleで管理するための準備
AnsibleでEC2を管理する場合はいくつか事前準備が必要です。
準備概要
- AWSの「セキュリティグループ」の設定を変更する
- Ansibleを実行するアカウントを決定する
- 秘密鍵を作る
- インベントリファイルを作成する
- ssh-agentに秘密鍵をキャッシュさせる
AWSの「セキュリティグループ」の設定を変更する
EC2 に ping で疎通確認できるように設定します。
デフォルトでは AWS の EC2 インスタンスは「セキュリティグループ」で ssh 以外をブロックしています。
Ansible は ssh プロトコルを利用してターゲットノードを管理するため、実はこの「セキュリティグループ」の設定変更は「不要」です。
しかしトラブルシューティング用に自宅PCからのみ「ping」を受け付けるように設定します。
1.AWSにログインする
AWSの管理コンソールにログインします。
https://console.aws.amazon.com/
2.セキュリティグループを開く
AWS管理コンソールにログインしたら、「サービス」-「EC2」にアクセスします。
左側ペインの「セキュリティグループ」をクリックします。
インスタンスの「説明」タブより対象のセキュリティグループをクリックします。
※ここでは「launch-wizard-2」が対象です。
3.インバウンドの編集を開く
セキュリティグループの画面を開いたら「インバウンド」タブをクリックして「編集」ボタンをクリックします。
「インバウンドのルールの編集」画面が表示されたら、以下のように設定をします。
- タイプ:すべての ICMP – IPv4
- プロトコル:ICMP
- ポート範囲:0 – 65535
- ソース:カスタム 「自宅PCのWAN側のIPアドレス/32」
設定を入れたら「保存」ボタンをクリックします。
自宅PCのWAN側のIPアドレスを確認する方法
以下の「確認くん」のサイトにアクセスします。
http://www.ugtop.com/spill.shtml
「あなたのIPアドレス」に表示されるIPアドレスがWAN側のIPアドレスになります。
4.pingで再度確認
再度 ping で動作確認をします。
[test@cnt07 ~]$ ping 54.xxx.xxx.147 |
pingコマンドを実行してリプライが返ってきました。
Ansibleを実行するアカウントを決定する
今回はデフォルトの「ec2-user」を利用せずに「ansible_test」アカウントを利用します。
# useradd ansible_test |
今後、この「ansible_test」アカウントを使って処理を実行するために「sudo」の権限を割り当てておきます。
# visudo
ansible_test ALL=(ALL) NOPASSWD: ALL ←この1行を追加する。 |
公開鍵・秘密鍵を作る
公開鍵認証用の鍵ペア(公開鍵・秘密鍵)を作成します。
もう一度構成を確認すると、以下の図のようになります。
- コントロールノード:cnt07(CentOS7)
- ターゲットノード:ip-172-xxx-xxx-246(AWS)
くどいようですが、再度整理すると
- sshコマンドを実行してリモートにアクセスする方:cnt7(CentOS7)
- cnt7からリモート経由でログインされる方:ip-172-xxx-xxx-246(AWS)
です。
上図の構成の場合、鍵は「sshコマンドを実行する方のcnt7」上で「ssh-keygen」コマンドを実行します。
ここで迷う方が結構います。
sshサーバー上でxx、sshクライアント側でxxという書き方だと迷う場合があるので、分かりやすく説明してみました。
1.cnt7にログインして鍵を作成する
くどくてすみませんが、「sshコマンドを実行する側」つまり「sshコマンドでリモートのawsにログインする側である cnt7」にログインします。
cnt7 にログインしたら、ansible を実行するアカウント「ansible_test」にスイッチして「ssh-keygen」コマンドを実行しします。
パスフレーズは入れなくてもいいという意見もありますが、鍵を流出した時の事を考慮してパスフレーズを入力します。
# su – ansible_test The key’s randomart image is: |
2.cnt7 の公開鍵を ip-172-xxx-xxx-246(AWS) の authorized_keys に追加する
cnt7 で作成した公開鍵「id_rsa.pub」を ip-172-xxx-xxx-246(AWS) の「authorized_keys」ファイルに追加します。
「authorized_keys」ファイルへの追加方法ですが、通常は scp コマンドでファイルを転送してから authorized_keys へ追加するケースが多いですが、今回は teraterm 上からコピペして追加します。
その理由は、
- 簡単&分かりやすい
- scpコマンドでawsから自宅サーバーへアクセスできない
- id_rsa.pubは公開鍵で外部に知られても秘密鍵がバレなければOK
- そもそも aws へは ssh でログインしているからコピペしても暗号化された状態で通信されている
- コピペをしても aws のセキュリティには何ら影響がない
などです。
ip-172-xxx-xxx-246(AWS) にログインして「ansible_test」アカウントにスイッチします。
$ sudo su – ansible_test |
「~/.ssh」ディレクトリを作成して権限を「700」に設定します。
$ mkdir .ssh $ chmod 700 .ssh $ ls -la drwx——. 2 ansible_test ansible_test 61 Jun 17 19:52 .ssh |
「authorized_keys」を作成して、cnt7で作成した公開鍵「id_rsa.pub」をコピペします。
$ cd .ssh/
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCoK2yL5OTPHxpzXOgBaxWgzFMasHbSMor4P0bereyGrHhVb9A5GWpBbP6b9wyO3NN8/xvF0/jT+H3xeDBjAGhSjnHgOjqvWEiEc1bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxBTVBR6N3KCpw9lNsWkrwJLbNCtb9FfnUxAcRO4QH9ZSTYQmsxQYFFXvib3p/VwNVQUS0+jNnOQj4jC+1j/xFrv92oQL9i2UTRl3jl9yC9u+Y4AsBXPTa/gDJprX7mxbFUddcwOVFlY5PQpFOBc0IaFTRIdECuLo2JRrBVMQKqL ansible_test@cnt07.localdomain
$ cat authorized_keys ← cat コマンドで開くとこんな感じになっているはずです(xxxxで若干隠しています)
|
「authorized_keys」ファイルの権限を「600」に設定します。
$ chmod 600 authorized_keys $ ls -l |
リモートからsshでログインできるか確認します。
[ansible_test@cnt07 .ssh]$ ssh xx.xx.xx.xx |
以上で、リモートログインの設定は完了です。
インベントリファイルを作成する
ここからはコントロールノードである cnt7 での作業になります。
ansible関連をまとめるために、cnt7のホームディレクトリ配下に「ansible」ディレクトリを作成します。
$ mkdir ansible ← ホームディレクトリ(/home/ansible_test)上で「ansible」ディレクトリを作成します。 $ pwd |
cnt7 上で、以下のようにインベントリファイルを作成します。
$ vi aws_host $ cat aws_host 54.xx.xx.xx7 ← ip-172-xxx-xxx-246 のグローバルIPアドレス
[aws:vars]
[all:vars]
|
プレイブック(playbook)を作成する
今回は ping での動作確認だけやってみます。
今後は別のページで更に ansible に関して深く調査&解説していきます。
cnt7 上で、以下のような ping 確認だけするプレイブックを作成します。
※ansibleは、「インデント」が肝です。下のプレイブックのようにスペースを合わせないとエラーになります。
$ vi ping-playbook.yml $ cat ping-playbook.yml |
以上で事前準備は完了です。
早速 ansible-playbook を実行してみましょう。
ansible-playbook を実行してみる
ansible-playbook を実行します。
$ ansible-playbook ping-playbook.yml -i aws_host ← ansible-playbook コマンドを実行します。
PLAY [all] *********************************************************************************************
TASK [Gathering Facts] *********************************************************************************
TASK [ping] ********************************************************************************************
PLAY RECAP *********************************************************************************************
|
※途中でパスフレーズの入力が表示されたらパスフレーズを入力します。
ssh-agentに秘密鍵をキャッシュさせる
毎回、パスフレーズを入力するのは面倒だと思います。
その場合は、以下のコマンドで ssh-agent にパスフレーズをキャッシュさせて、パスフレーズの入力を省略できます。
(と言っても、パスフレーズ入力を回避しているわけではありません)
$ eval `ssh-agent` |
ansible-playbook を実行してみます。
$ ansible-playbook -i aws_host ping-playbook.yml PLAY [all] *********************************************************************************************
TASK [Gathering Facts] *********************************************************************************
TASK [ping] ********************************************************************************************
PLAY RECAP *********************************************************************************************
|
ssh-agent の注意点
この ssh-agent は Teraterm からログアウトしても稼働し続けます。
そのため、ansibleを使い終わったら、kill しておくことをお勧めします。
まとめ
AWS EC2 に ansible でアクセスして ping 確認をするだけでも、結構手順があって大変だったと思います。
しかし一度環境を構築したり、設定を入れてしまえば、今後は手間がかからずに構成を管理できます。
コメント