Ansible 2.7.4でAWSのEC2インスタンスを管理する環境の構築
目次
概要
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 |
vCPU | 1 |
メモリ | 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
環境構築
インストール
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!
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!
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)]
設定
OSグループの作成
環境構築後にAnsibleのPlaybookを実行する際は、rootユーザを使わずにAnsible操作専用の一般ユーザを使います。 このユーザをansibleという名のユーザとし、ユーザが所属するグループもansibleという名前にします。 まずはansibleグループを作成します。GIDは 10000 とします。 ※グループ名もGIDも任意なのでこの通りでなくても動作には影響しません。
# groupadd -g 10000 ansible
# tail -n 1 /etc/group
ansible:x:10000: ←OSグループが追加された
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ユーザが作成された
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.
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
Ansibleの設定ファイル作成
Ansibleの設定ファイルである ansible.cfg ファイルを作成します。 /etc/ansible/ や ホームディレクトリ、カレントディレクトリなど、 設定ファイルを作成する場所によって読み込まれる優先順位が変わりますが、 せっかくansibleユーザを作成したので、ansibleユーザのホームディレクトリに 専用の設定ファイルを作成することにします。それ以外のパスには作成しません。 また、これ以降の操作はansibleユーザで実行します。
# su - ansible $ vi .ansible.cfg
※新規作成※
[defaults]
forks = 15
log_path = $HOME/.ansible/ansible.log
host_key_checking = False
gathering = smart
インベントリファイルの作成
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
※新規作成※
[ansible_servers]
172.31.19.90
[ansible_servers:vars]
ansible_ssh_user=centos
ansible_ssh_private_key_file=/data/ansible/test/inventory/id_rsa
秘密鍵の格納
EC2インスタンス作成時に指定したキーペアの秘密鍵の方をAnsibleをインストールしたサーバに転送します。 TeraTermで転送することができますが、わからない場合は秘密鍵をエディタで開いて同一内容のファイルを 作成しても構いません。秘密鍵はテキストファイルなので。
$ cd /data/ansible/test/inventory/
$ ls -l id_rsa
-rw----r--. 1 centos centos 1692 Jun 3 2017 id_rsa ←格納した秘密鍵
これで動作確認に必要な最低限の設定は完了です。続いて動作確認を行います。
動作確認
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上のサーバを管理していく土台が出来上がりました。