【Ansible/インフラ構築自動化】Step1:Ansibleのインストール方法(AWS EC2/CentOS7)

 インフラ構築をするにあたり、作業品質の向上および工数の削減を目的にAnsibleやPuppetのようなツールを使って作業を自動化することが一般的になってきました。インフラエンジニアとしては自動構築のスキルを身に着けていないとこれからの時代は苦労することになるかと思います。そこで今回は、Ansibleを適用してWeb3層システム(Apache/Tomcat/Postgres)を自動構築することで、自動構築の基礎を学んでいただければと思っております。まずはStep1としてインフラ構築を自動化するためにCentOS上にAnsibleをインストールして、Ansibleの基本的な動作確認を行う手順をまとめていますのでぜひご覧になって下さい。


1. CentOS環境の構築

学習環境として使えるLinuxサーバが手元にない方は、AWS等のクラウドサービスを利用してLinuxサーバを準備して下さい。手順については下記の記事でご紹介してますのでご参照ください。

Oracle学習環境構築(AWS EC2/CentOS7/Oracle 19c) Step1: AWS EC2構築

2. Ansibleインストール

CentOS7にAnsibleをインストールする手順を記載します。まず、仮想サーバにSSH接続したあとにrootユーザにスイッチして下さい。

[centos@ip-172-31-81-212 ~]$ sudo su - 
Last login: Thu Feb  1 21:09:55 UTC 2024 on pts/1
[root@ip-172-31-81-212 ~]# 

今回はyumコマンドでインストールを行います。まずはyumリポジトリepel-releaseをインストールしてください。ちなみにepelとはExtra Packages for Enterprise Linuxの略となります。

[root@ip-172-31-81-212 ~]# yum install -y epel-release

続いてsshpass( Non-interactive ssh password authentication ) をインストールします。このツールを使うことで、コマンドラインにてssh接続のパスワードを指定することができます。

[root@ip-172-31-81-212 ~]# yum install -y sshpass

最後にAnsibleをインストールします。

[root@ip-172-31-81-212 ~]# yum install -y ansible

下記コマンドでバージョン確認できていれば、インストールは完了しています。

[root@ip-172-31-81-212 ~]# ansible --version
ansible 2.9.27
  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, Jun 28 2022, 15:30:04) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

3. Ansibleユーザ作成

続いてAnsible管理対象のサーバにて、Ansible用のユーザを作成してパスワードを設定します。

[root@ip-172-31-81-212 ~]# adduser ansible
[root@ip-172-31-81-212 ~]# passwd ansible
Changing password for user ansible.
New password:XXXX
Retype new password:XXXX
passwd: all authentication tokens updated successfully.

パスワードなしで管理者権限コマンドを実行できるように、/etc/sudoers.d配下の設定ファイルに下記部の設定を追加します。

[root@ip-172-31-81-212 ~]# vi /etc/sudoers.d/90-cloud-init-users
[root@ip-172-31-81-212 ~]# cat /etc/sudoers.d/90-cloud-init-users
# Created by cloud-init v. 19.4 on Mon, 22 Jan 2024 22:22:23 +0000

# User rules for centos
centos ALL=(ALL) NOPASSWD:ALL
ansible ALL=(ALL) NOPASSWD:ALL

4. SSH公開鍵認証のための設定

続いてAnsibleこコントロールノードがターゲットノードに接続するために、コントロールノード側で秘密鍵と公開鍵を作成し、ターゲット側に公開鍵を登録します。コントロールノード側で下記の通り秘密鍵と公開鍵のペアを作成してください。

[root@ip-172-31-81-212 ~]# su - ansible 
[ansible@ip-172-31-81-212 ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ansible/.ssh/id_rsa): 
Created directory '/home/ansible/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ansible/.ssh/id_rsa.
Your public key has been saved in /home/ansible/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:POHEZldMNP6PilxPigOGv4O4Z0HA5VKL9wZ48CwfVxA ansible@ip-172-31-81-212.ec2.internal
The key's randomart image is:
+---[RSA 2048]----+
|   ...o Eo.+=    |
|    oO o . o..   |
|    =.X B . .    |
|     *.@ o   .   |
|     ...S     .  |
|      o.o.     o |
|     . = .  . o .|
|    . + o..+ =   |
|    .+  .o+.o .  |
+----[SHA256]-----+
[ansible@ip-172-31-81-212 ~]$ 
[ansible@ip-172-31-81-212 ~]$ ls -l /home/ansible/.ssh
total 8
-rw-------. 1 ansible ansible 1675 Feb  9 21:06 id_rsa
-rw-r--r--. 1 ansible ansible  419 Feb  9 21:06 id_rsa.pub

鍵ペアが作成できたら、ssh-copy-idコマンドで公開鍵の名前および権限を変更します。ssh-copy-idコマンドを実行するためにはSSHのパスワード認証を有効にしておく必要があるので、まずはSSHの設定変更を行います。rootユーザにてsshd_configのPasswordAuthenticationの設定をyesに変更し、sshdプロセスを再起動してください。

[ansible@ip-172-31-81-212 ~]$ exit
logout
[root@ip-172-31-81-212 ~]# vi /etc/ssh/sshd_config
[root@ip-172-31-81-212 ~]# cat /etc/ssh/sshd_config |grep PasswordAuthentication
PasswordAuthentication yes
#PasswordAuthentication no
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication, then enable this but set PasswordAuthentication
[root@ip-172-31-81-212 ~]# systemctl restart sshd
[root@ip-172-31-81-212 ~]# systemctl status sshd
 sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2024-02-09 21:22:48 UTC; 11s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 2676 (sshd)
   CGroup: /system.slice/sshd.service
           2676 /usr/sbin/sshd -D

Feb 09 21:22:48 ip-172-31-81-212.ec2.internal systemd[1]: Stopped OpenSSH server daemon.
Feb 09 21:22:48 ip-172-31-81-212.ec2.internal systemd[1]: Starting OpenSSH server daemon...
Feb 09 21:22:48 ip-172-31-81-212.ec2.internal sshd[2676]: Server listening on 0.0.0.0 port 22.
Feb 09 21:22:48 ip-172-31-81-212.ec2.internal sshd[2676]: Server listening on :: port 22.
Feb 09 21:22:48 ip-172-31-81-212.ec2.internal systemd[1]: Started OpenSSH server daemon.

続いてssh-copy-idコマンドを実行して下さい。下記の通りauthorized_keysが作成されていれば成功です。SSHのパスワード認証が不要でしたら元の設定に戻しておいてください。

[ansible@ip-172-31-81-212 ~]$ ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub localhost
exitssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub localhost
ls -l /home/ansible/.ssh/ssh-keygen -t rsals -lassh-keygen -t rsals -l /home/ansible/.ssh/ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub localhost
exitssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub localhost
ls -l /ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub localhost
exitssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.pub localhost
ls -l /home/ansible/.ssh/ssh-keygen -t rsals -lassh-keygen -t rsals -l /home/ansible/.ssh/
total 16
-rw-------. 1 ansible ansible  419 Feb  9 21:23 authorized_keys
-rw-------. 1 ansible ansible 1675 Feb  9 21:06 id_rsa
-rw-r--r--. 1 ansible ansible  419 Feb  9 21:06 id_rsa.pub
-rw-r--r--. 1 ansible ansible  171 Feb  9 21:18 known_hosts

5. Ansible設定

続いてAnsibleの基本設定を行います。設定ファイルansible.cfgの配置場所はいくつか候補がありますが、Ansibleユーザで柔軟に変更ができるようにAnsibleユーザのホームディレクトリに隠しファイルとして配置しておくのが良いでしょう。

[root@ip-172-31-81-212 ~]# mv /etc/ansible/ansible.cfg /home/ansible/.ansible.cfg
[root@ip-172-31-81-212 ~]# chown ansible:ansible /home/ansible/.ansible.cfg
[root@ip-172-31-81-212 ~]#
[root@ip-172-31-81-212 ~]# ll /home/ansible/.ansible.cfg
-rw-r--r--. 1 ansible ansible 19985 Jan 15  2022 /home/ansible/.ansible.cfg


続いて設定ファイルを編集をしていきます。デフォルト設定でも問題なく動きますが、要件に応じて各種設定を行ってください。ここではログファイルの出力場所を変更しておきます。

[root@ip-172-31-81-212 ~]# su - ansible
Last login: Fri Feb  9 21:37:13 UTC 2024 from localhost on pts/2
[ansible@ip-172-31-81-212 ~]$
[ansible@ip-172-31-81-212 ~]$ mkdir .ansible/log
[ansible@ip-172-31-81-212 ~]$ vi .ansible.cfg
[ansible@ip-172-31-81-212 ~]$ cat .ansible.cfg |grep log_path
#log_path = /var/log/ansible.log
log_path = /home/ansible/.ansible/ansible.log

6. ターゲットノード接続確認

Ansibleのコマンドを実行して、ターゲットノードへの接続確認を行います。ここでは簡易的にコントロールノードをターゲットノードとした際の確認方法を記載します。
まず、テスト用のディレクトリを作成して、ターゲットノードの情報を記載したインベントリを作成して下さい。

[root@ip-172-31-81-212 ~]# su - ansible
Last login: Fri Feb  9 21:37:13 UTC 2024 from localhost on pts/2
[ansible@ip-172-31-81-212 ~]$
[ansible@ip-172-31-81-212 ~]$ mkdir -p ~/websystem/inventory
[ansible@ip-172-31-81-212 ~]$ cd  ~/websystem/inventory
[ansible@ip-172-31-81-212 inventory]$ vi inventory.ini
[ansible@ip-172-31-81-212 inventory]$ cat inventory.ini
[websystem]
web1i ansible_host=localhost

続いてAnsibleのpingモジュールを使って疎通確認を行います。下記の通り「SUCCESS」と表示されれば疎通は成功です。

[ansible@ip-172-31-81-212 inventory]$ ansible -i inventory.ini websystem -m ping
web1i | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[ansible@ip-172-31-81-212 inventory]$


7. まとめ

Step1としては以上となります。Ansibleのインストールと疎通確認が割と簡単にできたことを確認いただけたのではないかと思います。引き続きStep2以降でOS、Postgres、Tomcat、Apacheのインストールについてご紹介していきますので、ぜひご参照ください。
【インフラ構築自動化】Step2:OSの基本設定(不要な設定無効化/パッケージ最新化)

8. 参考文献

Ansible実践ガイド

コメント