Ansible で AWS の EC2 インスタンスを管理する方法

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/

AWSの「セキュリティグループ」の設定を変更する

2.セキュリティグループを開く

AWS管理コンソールにログインしたら、「サービス」-「EC2」にアクセスします。

AWSの「セキュリティグループ」の設定を変更する

左側ペインの「セキュリティグループ」をクリックします。

AWSの「セキュリティグループ」の設定を変更する

インスタンスの「説明」タブより対象のセキュリティグループをクリックします。

※ここでは「launch-wizard-2」が対象です。

AWSの「セキュリティグループ」の設定を変更する

3.インバウンドの編集を開く

セキュリティグループの画面を開いたら「インバウンド」タブをクリックして「編集」ボタンをクリックします。

AWSの「セキュリティグループ」の設定を変更する

「インバウンドのルールの編集」画面が表示されたら、以下のように設定をします。

  • タイプ:すべての ICMP - IPv4
  • プロトコル:ICMP
  • ポート範囲:0 - 65535
  • ソース:カスタム 「自宅PCのWAN側のIPアドレス/32」

設定を入れたら「保存」ボタンをクリックします。

AWSの「セキュリティグループ」の設定を変更する

 

自宅PCのWAN側のIPアドレスを確認する方法

以下の「確認くん」のサイトにアクセスします。

http://www.ugtop.com/spill.shtml

自宅PCのWAN側のIPアドレスを確認する方法

「あなたのIPアドレス」に表示されるIPアドレスがWAN側のIPアドレスになります。

4.pingで再度確認

再度 ping で動作確認をします。

[test@cnt07 ~]$ ping 54.xxx.xxx.147
PING 54.xxx.xxx.147 (54.xxx.xxx.147) 56(84) bytes of data.
64 bytes from 54.xxx.xxx.147: icmp_seq=22 ttl=52 time=5.64 ms
64 bytes from 54.xxx.xxx.147: icmp_seq=23 ttl=52 time=5.22 ms
64 bytes from 54.xxx.xxx.147: icmp_seq=24 ttl=52 time=5.24 ms

 

pingコマンドを実行してリプライが返ってきました。

Ansibleを実行するアカウントを決定する

今回はデフォルトの「ec2-user」を利用せずに「ansible_test」アカウントを利用します。

# useradd ansible_test
# passwd ansible_test
Changing password for user ansible_test.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

 

今後、この「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
Last login: Sat Jun 17 00:54:14 EDT 2017 on pts/0
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ansible_test/.ssh/id_rsa):
Created directory '/home/ansible_test/.ssh'.
Enter passphrase (empty for no passphrase): ←パスフレーズを入力する
Enter same passphrase again: ←パスフレーズを入力する
Your identification has been saved in /home/ansible_test/.ssh/id_rsa.
Your public key has been saved in /home/ansible_test/.ssh/id_rsa.pub.
The key fingerprint is:
41:f4:df:eb:98:xx:xx:xx:xx:xx:xx:42:6c:ce:aa:ca:57 ansible_test@cnt07.localdomain

The key's randomart image is:
+--[ RSA 2048]----+
|=%Eoo.           |
|++*o.. o         |
|o o..   +        |
|o. . . . .       |
|o .   . S        |
|..               |
|.                |
|                 |
|                 |
+-----------------+
$

 

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
Last login: Sat Jun 17 01:35:05 EDT 2017 on pts/0
$

 

「~/.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/
$ vi authorized_keys ← authorized_keys を作成して、以下のような公開鍵の中身をコピペします。すでに authorized_keys ファイルが存在する場合は、一番最後の行に追加します。

 

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCoK2yL5OTPHxpzXOgBaxWgzFMasHbSMor4P0bereyGrHhVb9A5GWpBbP6b9wyO3NN8/xvF0/jT+H3xeDBjAGhSjnHgOjqvWEiEc1bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxBTVBR6N3KCpw9lNsWkrwJLbNCtb9FfnUxAcRO4QH9ZSTYQmsxQYFFXvib3p/VwNVQUS0+jNnOQj4jC+1j/xFrv92oQL9i2UTRl3jl9yC9u+Y4AsBXPTa/gDJprX7mxbFUddcwOVFlY5PQpFOBc0IaFTRIdECuLo2JRrBVMQKqL ansible_test@cnt07.localdomain

 

 

$ cat authorized_keys ← cat コマンドで開くとこんな感じになっているはずです(xxxxで若干隠しています)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCoK2yL5OTPHxpzXOgBaxWgzFMasHbSMor4P0bereyGrHhVb9A5GWpBbP6b9wyO3NN8/xvF0/jT+H3xeDBjAGhSjnHgOjqvWEiEcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxPvT1aQZbwF8IYRSUhhQOBTVBR6N3KCpw9lNsWkrwJLbNCtb9FfnUxAcRO4QH9ZSTYQmsxQYFFXvib3p/VwNVQUS0+jNnOQj4jC+1j/xFrv92oQL9i2UTRl3jl9yC9u+Y4AsBXPTa/gDJprX7mxbFUddcwOVFlY5PQpFOBc0IaFTRIdECuLo2JRrBVMQKqL ansible_test@cnt07.localdomain
$

 

 

 

「authorized_keys」ファイルの権限を「600」に設定します。

$ chmod 600 authorized_keys

$ ls -l
total 12
-rw-------. 1 ansible_test ansible_test 412 Jun 17 19:52 authorized_keys ← 600になっています。

 

リモートからsshでログインできるか確認します。

[ansible_test@cnt07 .ssh]$ ssh xx.xx.xx.xx
Enter passphrase for key '/home/ansible_test/.ssh/id_rsa': ←パスフレーズを入力します。
Last login: Sat Jun 17 19:32:41 2017
[ansible_test@ip-172-xx-xx-246 ~]$ ←ログインできました。

 

以上で、リモートログインの設定は完了です。

 

インベントリファイルを作成する

ここからはコントロールノードである cnt7 での作業になります。

コントロールノードとターゲットノードの構成

ansible関連をまとめるために、cnt7のホームディレクトリ配下に「ansible」ディレクトリを作成します。

$ mkdir ansible ← ホームディレクトリ(/home/ansible_test)上で「ansible」ディレクトリを作成します。
$ ls
ansible
$ cd ansible

$ pwd
/home/ansible_test/ansible

 

cnt7 上で、以下のようにインベントリファイルを作成します。

$ vi aws_host

$ cat aws_host
[aws]

54.xx.xx.xx7 ← ip-172-xxx-xxx-246 のグローバルIPアドレス

 

[aws:vars]
ansible_ssh_user=ansible_test ← ログインするアカウントを指定します。
ansible_ssh_private_key_file=~/.ssh/id_rsa ← 先ほど作成した自分の秘密鍵を指定します。

 

[all:vars]
ansible_ssh_port=22

 

 

プレイブック(playbook)を作成する

今回は ping での動作確認だけやってみます。

今後は別のページで更に ansible に関して深く調査&解説していきます。

cnt7 上で、以下のような ping 確認だけするプレイブックを作成します。

※ansibleは、「インデント」が肝です。下のプレイブックのようにスペースを合わせないとエラーになります。

$ vi ping-playbook.yml

$ cat ping-playbook.yml
- hosts: all
  tasks: 
  - name: ping
    ping:

 

以上で事前準備は完了です。

早速 ansible-playbook を実行してみましょう。

 

ansible-playbook を実行してみる

ansible-playbook を実行します。

$ ansible-playbook ping-playbook.yml -i aws_host ← ansible-playbook コマンドを実行します。

 

PLAY [all] *********************************************************************************************

 

TASK [Gathering Facts] *********************************************************************************
Enter passphrase for key '/home/ansible_test/.ssh/id_rsa': ← パスフレーズを入力します。
ok: [54.xx.xx.xx7]

 

TASK [ping] ********************************************************************************************
ok: [54.xx.xx.xx7]

 

PLAY RECAP *********************************************************************************************
54.xx.xx.xx7 : ok=2 changed=0 unreachable=0 failed=0

 

※途中でパスフレーズの入力が表示されたらパスフレーズを入力します。

 

 

ssh-agentに秘密鍵をキャッシュさせる

毎回、パスフレーズを入力するのは面倒だと思います。

その場合は、以下のコマンドで ssh-agent にパスフレーズをキャッシュさせて、パスフレーズの入力を省略できます。

(と言っても、パスフレーズ入力を回避しているわけではありません)

 

$ eval `ssh-agent`
Agent pid 4175
$ ssh-add /home/ansible_test/.ssh/id_rsa
Enter passphrase for /home/ansible_test/.ssh/id_rsa: ← パスフレーズを入力する
Identity added: /home/ansible_test/.ssh/id_rsa (/home/ansible_test/.ssh/id_rsa)

 

ansible-playbook を実行してみます。

$ ansible-playbook -i aws_host ping-playbook.yml

PLAY [all] *********************************************************************************************

 

TASK [Gathering Facts] *********************************************************************************
ok: [54.xx.xx.xx7]

 

TASK [ping] ********************************************************************************************
ok: [54.xx.xx.xx7]

 

PLAY RECAP *********************************************************************************************
54.xx.xx.xx7 : ok=2 changed=0 unreachable=0 failed=0

 

 

ssh-agent の注意点

この ssh-agent は Teraterm からログアウトしても稼働し続けます。

そのため、ansibleを使い終わったら、kill しておくことをお勧めします。

まとめ

AWS EC2 に ansible でアクセスして ping 確認をするだけでも、結構手順があって大変だったと思います。

しかし一度環境を構築したり、設定を入れてしまえば、今後は手間がかからずに構成を管理できます。

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人

コメントを残す

メールアドレスが公開されることはありません。