このエントリーをはてなブックマークに追加

概要

 AWSのEC2インスタンス(OSはCentOS)にAnsibleをインストールして、他のEC2インスタンスを管理できる環境を構築します。 とは言っても、SSH接続で使うキーペアをAWSの事情に合わせているだけで、基本的な手順は他のクラウドやベアメタルの環境と同じです。 今回の手順ではPlaybookを使った実践的なサーバの管理は行いませんが、AnsibleをインストールしてEC2インスタンスに接続し、 ansibleのモジュールを実行できるところまでを確認します。

構成

検証環境

 サーバにはAmazonのEC2インスタンスを利用しました。 AmazonマシンイメージはAWS標準のものではなく、AWS Marketplaceから取得しています。 サーバのスペックは以下のとおりです。

■サーバスペック
項目内容
AmazonマシンイメージCentOS 7 (x86_64) - with Updates HVM
インスタンスタイプt2.micro
vCPU1
メモリ1GiB
ディスクSSD 8GiB
リージョンアジアパシフィック (東京)

 この1台にAnsibleをインストールして動作確認します。

サーバ構成

OSバージョン

CentOS 7.5.1804 x86_64

ソフトウェア・パッケージ一覧

  • epel-release-7-11.noarch.rpm
  • ansible-2.7.4-1.el7.noarch.rpm

環境構築

(1) EPELリポジトリの追加

 yumでAnsibleをインストールするためにEPELリポジトリを追加します。

$ sudo su -
# yum -y install epel-release
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
base                                                                                                                 | 3.6 kB  00:00:00
extras                                                                                                               | 3.4 kB  00:00:00
updates                                                                                                              | 3.4 kB  00:00:00
(1/4): base/7/x86_64/group_gz                                                                                        | 166 kB  00:00:00
(2/4): extras/7/x86_64/primary_db                                                                                    | 154 kB  00:00:00
(3/4): updates/7/x86_64/primary_db                                                                                   | 1.3 MB  00:00:00
(4/4): base/7/x86_64/primary_db                                                                                      | 6.0 MB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package epel-release.noarch 0:7-11 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

============================================================================================================================================
 Package                               Arch                            Version                        Repository                       Size
============================================================================================================================================
Installing:
 epel-release                          noarch                          7-11                           extras                           15 k

Transaction Summary
============================================================================================================================================
Install  1 Package

Total download size: 15 k
Installed size: 24 k
Downloading packages:
warning: /var/cache/yum/x86_64/7/extras/packages/epel-release-7-11.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for epel-release-7-11.noarch.rpm is not installed
epel-release-7-11.noarch.rpm                                                                                         |  15 kB  00:00:00
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-5.1804.el7.centos.2.x86_64 (installed)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : epel-release-7-11.noarch                                                                                                 1/1
  Verifying  : epel-release-7-11.noarch                                                                                                 1/1

Installed:
  epel-release.noarch 0:7-11

Complete!

(2) Ansibleのインストール

 yumでAnsibleをインストールします。

# yum -y install ansible
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
epel/x86_64/metalink                                                                                                 | 7.7 kB  00:00:00
 * base: ftp.iij.ad.jp
 * epel: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
epel                                                                                                                 | 3.2 kB  00:00:00
(1/3): epel/x86_64/group_gz                                                                                          |  88 kB  00:00:00
(2/3): epel/x86_64/updateinfo                                                                                        | 937 kB  00:00:00
(3/3): epel/x86_64/primary                                                                                           | 3.6 MB  00:00:00
epel                                                                                                                            12735/12735
Resolving Dependencies
--> Running transaction check
---> Package ansible.noarch 0:2.7.4-1.el7 will be installed
--> Processing Dependency: sshpass for package: ansible-2.7.4-1.el7.noarch
--> Processing Dependency: python2-jmespath for package: ansible-2.7.4-1.el7.noarch
--> Processing Dependency: python-paramiko for package: ansible-2.7.4-1.el7.noarch
--> Processing Dependency: python-keyczar for package: ansible-2.7.4-1.el7.noarch
--> Processing Dependency: python-httplib2 for package: ansible-2.7.4-1.el7.noarch
--> Processing Dependency: python-crypto for package: ansible-2.7.4-1.el7.noarch
--> Running transaction check
---> Package python-httplib2.noarch 0:0.9.2-1.el7 will be installed
---> Package python-keyczar.noarch 0:0.71c-2.el7 will be installed
--> Processing Dependency: python-pyasn1 for package: python-keyczar-0.71c-2.el7.noarch
---> Package python-paramiko.noarch 0:2.1.1-9.el7 will be installed
--> Processing Dependency: python-cryptography for package: python-paramiko-2.1.1-9.el7.noarch
---> Package python2-crypto.x86_64 0:2.6.1-15.el7 will be installed
--> Processing Dependency: libtomcrypt.so.0()(64bit) for package: python2-crypto-2.6.1-15.el7.x86_64
---> Package python2-jmespath.noarch 0:0.9.0-3.el7 will be installed
---> Package sshpass.x86_64 0:1.06-2.el7 will be installed
--> Running transaction check
---> Package libtomcrypt.x86_64 0:1.17-26.el7 will be installed
--> Processing Dependency: libtommath >= 0.42.0 for package: libtomcrypt-1.17-26.el7.x86_64
--> Processing Dependency: libtommath.so.0()(64bit) for package: libtomcrypt-1.17-26.el7.x86_64
---> Package python2-cryptography.x86_64 0:1.7.2-2.el7 will be installed
--> Processing Dependency: python-idna >= 2.0 for package: python2-cryptography-1.7.2-2.el7.x86_64
--> Processing Dependency: python-cffi >= 1.4.1 for package: python2-cryptography-1.7.2-2.el7.x86_64
--> Processing Dependency: python-enum34 for package: python2-cryptography-1.7.2-2.el7.x86_64
---> Package python2-pyasn1.noarch 0:0.1.9-7.el7 will be installed
--> Running transaction check
---> Package libtommath.x86_64 0:0.42.0-6.el7 will be installed
---> Package python-cffi.x86_64 0:1.6.0-5.el7 will be installed
--> Processing Dependency: python-pycparser for package: python-cffi-1.6.0-5.el7.x86_64
---> Package python-enum34.noarch 0:1.0.4-1.el7 will be installed
---> Package python-idna.noarch 0:2.4-1.el7 will be installed
--> Running transaction check
---> Package python-pycparser.noarch 0:2.14-1.el7 will be installed
--> Processing Dependency: python-ply for package: python-pycparser-2.14-1.el7.noarch
--> Running transaction check
---> Package python-ply.noarch 0:3.4-11.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

============================================================================================================================================
 Package                                   Arch                        Version                           Repository                    Size
============================================================================================================================================
Installing:
 ansible                                   noarch                      2.7.4-1.el7                       epel                          11 M
Installing for dependencies:
 libtomcrypt                               x86_64                      1.17-26.el7                       extras                       224 k
 libtommath                                x86_64                      0.42.0-6.el7                      extras                        36 k
 python-cffi                               x86_64                      1.6.0-5.el7                       base                         218 k
 python-enum34                             noarch                      1.0.4-1.el7                       base                          52 k
 python-httplib2                           noarch                      0.9.2-1.el7                       extras                       115 k
 python-idna                               noarch                      2.4-1.el7                         base                          94 k
 python-keyczar                            noarch                      0.71c-2.el7                       epel                         218 k
 python-paramiko                           noarch                      2.1.1-9.el7                       updates                      269 k
 python-ply                                noarch                      3.4-11.el7                        base                         123 k
 python-pycparser                          noarch                      2.14-1.el7                        base                         104 k
 python2-crypto                            x86_64                      2.6.1-15.el7                      extras                       477 k
 python2-cryptography                      x86_64                      1.7.2-2.el7                       base                         502 k
 python2-jmespath                          noarch                      0.9.0-3.el7                       extras                        39 k
 python2-pyasn1                            noarch                      0.1.9-7.el7                       base                         100 k
 sshpass                                   x86_64                      1.06-2.el7                        extras                        21 k

Transaction Summary
============================================================================================================================================
Install  1 Package (+15 Dependent packages)

Total download size: 14 M
Installed size: 71 M
Downloading packages:
(1/16): libtommath-0.42.0-6.el7.x86_64.rpm                                                                           |  36 kB  00:00:00
(2/16): python-enum34-1.0.4-1.el7.noarch.rpm                                                                         |  52 kB  00:00:00
(3/16): python-httplib2-0.9.2-1.el7.noarch.rpm                                                                       | 115 kB  00:00:00
(4/16): libtomcrypt-1.17-26.el7.x86_64.rpm                                                                           | 224 kB  00:00:00
(5/16): python-idna-2.4-1.el7.noarch.rpm                                                                             |  94 kB  00:00:00
(6/16): python-cffi-1.6.0-5.el7.x86_64.rpm                                                                           | 218 kB  00:00:00
(7/16): python-ply-3.4-11.el7.noarch.rpm                                                                             | 123 kB  00:00:00
(8/16): python-pycparser-2.14-1.el7.noarch.rpm                                                                       | 104 kB  00:00:00
(9/16): python-paramiko-2.1.1-9.el7.noarch.rpm                                                                       | 269 kB  00:00:00
warning: /var/cache/yum/x86_64/7/epel/packages/python-keyczar-0.71c-2.el7.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
Public key for python-keyczar-0.71c-2.el7.noarch.rpm is not installed
(10/16): python-keyczar-0.71c-2.el7.noarch.rpm                                                                       | 218 kB  00:00:00
(11/16): python2-jmespath-0.9.0-3.el7.noarch.rpm                                                                     |  39 kB  00:00:00
(12/16): python2-cryptography-1.7.2-2.el7.x86_64.rpm                                                                 | 502 kB  00:00:00
(13/16): python2-pyasn1-0.1.9-7.el7.noarch.rpm                                                                       | 100 kB  00:00:00
(14/16): sshpass-1.06-2.el7.x86_64.rpm                                                                               |  21 kB  00:00:00
(15/16): python2-crypto-2.6.1-15.el7.x86_64.rpm                                                                      | 477 kB  00:00:00
(16/16): ansible-2.7.4-1.el7.noarch.rpm                                                                              |  11 MB  00:00:00
--------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                        20 MB/s |  14 MB  00:00:00
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Importing GPG key 0x352C64E5:
 Userid     : "Fedora EPEL (7) <epel@fedoraproject.org>"
 Fingerprint: 91e9 7d7c 4a5e 96f1 7f3e 888f 6a2f aea2 352c 64e5
 Package    : epel-release-7-11.noarch (@extras)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : python2-pyasn1-0.1.9-7.el7.noarch                                                                                       1/16
  Installing : python-enum34-1.0.4-1.el7.noarch                                                                                        2/16
  Installing : python-httplib2-0.9.2-1.el7.noarch                                                                                      3/16
  Installing : sshpass-1.06-2.el7.x86_64                                                                                               4/16
  Installing : libtommath-0.42.0-6.el7.x86_64                                                                                          5/16
  Installing : libtomcrypt-1.17-26.el7.x86_64                                                                                          6/16
  Installing : python2-crypto-2.6.1-15.el7.x86_64                                                                                      7/16
  Installing : python-keyczar-0.71c-2.el7.noarch                                                                                       8/16
  Installing : python2-jmespath-0.9.0-3.el7.noarch                                                                                     9/16
  Installing : python-ply-3.4-11.el7.noarch                                                                                           10/16
  Installing : python-pycparser-2.14-1.el7.noarch                                                                                     11/16
  Installing : python-cffi-1.6.0-5.el7.x86_64                                                                                         12/16
  Installing : python-idna-2.4-1.el7.noarch                                                                                           13/16
  Installing : python2-cryptography-1.7.2-2.el7.x86_64                                                                                14/16
  Installing : python-paramiko-2.1.1-9.el7.noarch                                                                                     15/16
  Installing : ansible-2.7.4-1.el7.noarch                                                                                             16/16
  Verifying  : python-keyczar-0.71c-2.el7.noarch                                                                                       1/16
  Verifying  : python-idna-2.4-1.el7.noarch                                                                                            2/16
  Verifying  : python-ply-3.4-11.el7.noarch                                                                                            3/16
  Verifying  : python2-jmespath-0.9.0-3.el7.noarch                                                                                     4/16
  Verifying  : python-paramiko-2.1.1-9.el7.noarch                                                                                      5/16
  Verifying  : ansible-2.7.4-1.el7.noarch                                                                                              6/16
  Verifying  : python2-crypto-2.6.1-15.el7.x86_64                                                                                      7/16
  Verifying  : libtomcrypt-1.17-26.el7.x86_64                                                                                          8/16
  Verifying  : python-cffi-1.6.0-5.el7.x86_64                                                                                          9/16
  Verifying  : libtommath-0.42.0-6.el7.x86_64                                                                                         10/16
  Verifying  : sshpass-1.06-2.el7.x86_64                                                                                              11/16
  Verifying  : python-httplib2-0.9.2-1.el7.noarch                                                                                     12/16
  Verifying  : python2-pyasn1-0.1.9-7.el7.noarch                                                                                      13/16
  Verifying  : python-enum34-1.0.4-1.el7.noarch                                                                                       14/16
  Verifying  : python-pycparser-2.14-1.el7.noarch                                                                                     15/16
  Verifying  : python2-cryptography-1.7.2-2.el7.x86_64                                                                                16/16

Installed:
  ansible.noarch 0:2.7.4-1.el7

Dependency Installed:
  libtomcrypt.x86_64 0:1.17-26.el7             libtommath.x86_64 0:0.42.0-6.el7            python-cffi.x86_64 0:1.6.0-5.el7
  python-enum34.noarch 0:1.0.4-1.el7           python-httplib2.noarch 0:0.9.2-1.el7        python-idna.noarch 0:2.4-1.el7
  python-keyczar.noarch 0:0.71c-2.el7          python-paramiko.noarch 0:2.1.1-9.el7        python-ply.noarch 0:3.4-11.el7
  python-pycparser.noarch 0:2.14-1.el7         python2-crypto.x86_64 0:2.6.1-15.el7        python2-cryptography.x86_64 0:1.7.2-2.el7
  python2-jmespath.noarch 0:0.9.0-3.el7        python2-pyasn1.noarch 0:0.1.9-7.el7         sshpass.x86_64 0:1.06-2.el7

Complete!

(3) Ansibleのインストール確認

 Ansibleがインストールされて、ansibleコマンドを実行できるようになったことを確認します。

# ansible --version
ansible 2.7.4
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]

(4) OSグループの作成

 環境構築後にAnsibleのPlaybookを実行する際は、rootユーザを使わずにAnsible操作専用の一般ユーザを使います。 このユーザをansibleという名のユーザとし、ユーザが所属するグループもansibleという名前にします。 まずはansibleグループを作成します。GIDは 10000 とします。 ※グループ名もGIDも任意なのでこの通りでなくても動作には影響しません。

# groupadd -g 10000 ansible
# tail -n 1 /etc/group
ansible:x:10000: ←OSグループが追加された

(5) OSユーザの作成

 続いてansibleという名のユーザを作成します。UIDは 10000 とします。 また、直前で作成したansibleグループ(GID:10000)に所属させます。 ※ユーザ名もUEIも任意なのでこの通りでなくても動作には影響しません。

# useradd -u 10000 -g 10000 ansible
# tail -n 1 /etc/passwd
ansible:x:10000:10000::/home/ansible:/bin/bash ←OSユーザが作成された

(6) OSユーザのパスワード設定

 必須ではないかもしれませんが、ログインして使うためansibleユーザにパスワードを設定しておきます。 私はいつもrootユーザからsuしてしまうので不要ですが、運用者がrootを使えないとなると必要になります。 今回のAWSの環境の場合は、始めにcentosユーザでOSにログインして、ansibleユーザにsuする運用になるかと思います。

# passwd ansible
Changing password for user ansible.
New password: ←設定するパスワードを入力
Retype new password: ←設定するパスワードを再入力
passwd: all authentication tokens updated successfully.

(7) Playbook用のディレクトリ作成

 AnsibleのPlaybookを作成するディレクトリパスは任意に設定可能ですが、ここでは /data/ansible/ とします。 /data/ansible/ ディレクトリはいずれもrootユーザが所有者でパーミッションを 777 としておきます。 /data/ansible/ ディレクトリ以下はPlaybook毎のディレクトリを作成し、ansibleユーザが所有者で書き込み可能なパーミッションとします。

# mkdir -m 777 /data
# ls -ld /data
drwxrwxrwx. 3 root root 21 Dec  6 15:11 /data
# mkdir -m 777 /data/ansible
# ls -ld /data/ansible
drwxrwxrwx. 2 root root 6 Dec  6 15:11 /data/ansible

(8) Ansibleの設定ファイル作成

 Ansibleの設定ファイルである ansible.cfg ファイルを作成します。 /etc/ansible/ や ホームディレクトリ、カレントディレクトリなど、 設定ファイルを作成する場所によって読み込まれる優先順位が変わりますが、 せっかくansibleユーザを作成したので、ansibleユーザのホームディレクトリに 専用の設定ファイルを作成することにします。それ以外のパスには作成しません。 また、これ以降の操作はansibleユーザで実行します。

# su - ansible
$ vi .ansible.cfg
ファイル名:/home/ansible/.ansible.cfg
※新規作成※
[defaults]
forks = 15
log_path = $HOME/.ansible/ansible.log
host_key_checking = False
gathering = smart

(9) インベントリファイルの作成

 ansibleコマンドでモジュールを実行するテストを行います。 そのためにターゲットノードの情報を記載したインベントリファイルを作成します。 まだ動作確認レベルなので、自ノードのIPアドレスを指定することにします。

 Ansibleではターゲットノードで指定したモジュールの機能を実行するために、 ターゲットノードに対して事前にSSH接続します。 少し話がずれますが、AWSのEC2インスタンス作成時には必ずSSH接続のためのキーペアを指定することになっています。 このキーペアを使ってEC2インスタンスで稼働しているOSにSSH接続してメンテナンスします。 AnsibleがターゲットノードにSSH接続するときにもこれと同一のキーペアを作成するものとします(準備が楽なので)。 今回はCentOSのEC2インスタンスを使用していますので、EC2インスタンスを作成するとデフォルトのcentosユーザの authorized_keysに指定したキーペアの公開鍵が登録されています。 そこで、Ansibleは登録された公開鍵のペアになる秘密鍵を使ってターゲットノードを操作することができます。 インベントリファイルにはSSH接続するユーザと秘密鍵を指定しておきます。

$ cd /data/ansible/
$ mkdir -p test/inventory
$ cd test/inventory/
$ vi inventory.ini
ファイル名:/data/ansible/test/inventory/inventory.ini
※新規作成※
[ansible_servers]
172.31.19.90

[ansible_servers:vars]
ansible_ssh_user=centos
ansible_ssh_private_key_file=/data/ansible/test/inventory/id_rsa

(10) 秘密鍵の格納

 EC2インスタンス作成時に指定したキーペアの秘密鍵の方をAnsibleをインストールしたサーバに転送します。 TeraTermで転送することができますが、わからない場合は秘密鍵をエディタで開いて同一内容のファイルを 作成しても構いません。秘密鍵はテキストファイルなので。

$ cd /data/ansible/test/inventory/
$ ls -l id_rsa
-rw----r--. 1 centos centos 1692 Jun  3  2017 id_rsa ←格納した秘密鍵

 これで動作確認に必要な最低限の設定は完了です。続いて動作確認を行います。

動作確認

(1) pingモジュールでの動作確認

 先ほど作成したインベントリファイルとAnsibleのpingモジュールを使って動作確認します。

$ ansible -i inventory/inventory.ini ansible_servers -m ping
172.31.19.90 | SUCCESS => {
    "changed": false, ←pingモジュールを実行してサーバの状態は変化しないのでfalse
    "ping": "pong" ←pongと表示されれば成功
}

 これが成功すればAnsible実行の第一歩を踏み出したことになります。 今後Playbookを作成してAWS上のサーバを管理していく土台が出来上がりました。

参考書籍