【連載】Ansible入門 その2:環境構築編

この連載では、Ansibleとはどういったものなのかを理解し、実際に使えるようになるまでを説明します。

第二回では環境構築を行います。ノードを用意し、Ansibleのインストールを行い、構成管理を実行できるところまで準備します。

  1. Ansibleとは
  2. 環境構築編

ノード準備

実際にAnsibleを使って構成管理を行いたい場合、構成管理を行うノードが元々存在することと思います。しかし、検証を行う場合はノードを自身で用意しなければなりません。

ノードを用意する方法はいくつか考えられます。

  • 実機
  • 仮想マシン
  • コンテナ

などでしょうか。

今回は準備の手間をかけたくないのでコンテナでターゲットノードとコントロールノードを用意します。Windows 10でWSL2を動かし、その上でコンテナを立ち上げるという環境を想定します。「コンテナ使うならDockerfileで構成管理すればいいじゃん」というツッコミはご遠慮ください。

Docker環境が無い場合はこちらの記事を参考にしてください。

【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その1:コンテナってなに? 〜

【連載】WSL2、Visual Studio Code、DockerでグッとよくなるWindows開発環境 〜 その1:まずは概要 〜

今回検証環境として使用する構成は以下のようになります。ターゲットノードとコントロールノードが直接つながる構成です。ターゲットノードが1台だけだと構成管理を行う意味も薄いのですが、今回は検証環境なので1台だけにしています。実際にはターゲットノードが複数存在することが多いでしょう。

WSL2上でDockerでコンテナを立ち上げます。ターゲットノードを「ansible_target」、コントロールノードを「ansible_control」としました。今回はCentOS7で作成しました。pythonはデフォルトでインストールされています。

# docker run --detach --name ansible_target --privileged centos:centos7 /sbin/init
# docker run --detach --name ansible_control --privileged centos:centos7 /sbin/init

 

Dockerの公式イメージは最低限の機能しか含まれていないので必要な機能をインストールします。SSH接続をするのでopenssh-serverとopenssh-clients、コントロールノードでは設定ファイルを編集するのでvimもインストールします。

# yum install openssh-server -y
# yum install openssh-clients -y
# yum install vim -y
# yum install openssh-server -y
# yum install openssh-clients -y
# systemctl start sshd

 

Dockerコンテナは起動時にrootパスワードが設定されていないので設定します。SSH接続時にターゲットノード側のパスワードが必要になります。

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

 

ターゲットノードのIPアドレスかドメイン名を確認しておきます。こちらもSSH接続時に必要になります。筆者の環境では「172.17.0.4」だったので以降のコマンドではこのアドレスを使いますが、お使いの環境に合わせて変更してください。

# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4      37db0ad110b3

 

以上でノードの用意は完了です。コンテナではなく実機や仮想マシンでも必要なものは同じになります。IPアドレスの確認とパスワードの設定は必要ですが、上記のインストールしたパッケージはほとんどの場合デフォルトでインストールされているでしょう。

ちなみにですが、ここまでの作業を行ったDockerイメージを作れば、次回以降はこの設定は不要になります。

Ansible検証環境用にDockerを利用した話

インストール

コントロールノードでAnsibleのインストールを行います。

# yum install epel-release -y
# yum install ansible -y
# ansible --version
ansible 2.9.16
  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 = /usr/bin/ansible
  python version = 2.7.5 (default, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

 

yumの場合は最新バージョンがインストールされますが、pipを使えばバージョンを指定してインストールすることができます。

SSH設定

ノード間の通信に使用するSSHの設定を行います。

まずはコントロールノードで公開鍵認証用の鍵を生成します。いくつか入力を求められますが、すべて何も入力せずにエンターで問題ありません。.sshディレクトリにid_rsaとid_rsa.pubが生成されていることを確認します。

# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:msTQal6Bu3jC5ymlz3ByWQxR7qss4PXXbNQ/Q/gB4EM root@b4d7c596753e
The key's randomart image is:
+---[RSA 2048]----+
|    ...          |
|     =   E       |
|    + + o .      |
|     O . o .     |
|    + B S o o    |
|.. =.* + . o o   |
|..BoX + +   + .  |
| .+% + . +   =   |
|   +B . .     o  |
+----[SHA256]-----+
# cd
# ls .ssh
id_rsa  id_rsa.pub

 

authorized_keysを作成し、パーミッションを変更します。

# cd .ssh
# cat id_rsa.pub >> authorized_keys
# chmod 600 authorized_keys
# ls -l
total 12
-rw------- 1 root root  399 Jan 29 05:43 authorized_keys
-rw------- 1 root root 1675 Jan 29 05:40 id_rsa
-rw-r--r-- 1 root root  399 Jan 29 05:40 id_rsa.pub

 

scpでターゲットノードに鍵を転送します。初回実行時にはAre you sure you want to continue connecting (yes/no)?と聞かれるので、yesと入力してください。ターゲットノードのパスワードを求められるので、先程設定したパスワードを入力してください。

# scp -pr .ssh/ root@172.17.0.4:~/
The authenticity of host '172.17.0.4 (172.17.0.4)' can't be established.
ECDSA key fingerprint is SHA256:CtxMxchN3BQ3aMLMKU30IPzium3597MZnM9Jy8MZH6U.
ECDSA key fingerprint is MD5:82:d2:85:6c:f2:68:47:05:be:fe:d5:9a:27:15:d1:7d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.4' (ECDSA) to the list of known hosts.
root@172.17.0.4's password:
authorized_keys                               100%  399   649.3KB/s   00:00
id_rsa.pub                                    100%  399   630.8KB/s   00:00
id_rsa                                        100% 1675     3.5MB/s   00:00
known_hosts                                   100%  172   330.8KB/s   00:00

 

ターゲットノード側に鍵がコピーされていることを確認します。

# ls .ssh/
authorized_keys  id_rsa  id_rsa.pub  known_hosts

 

コントロールノードからターゲットノードにSSH接続を試みます。接続できれば設定は完了です。

# ssh root@172.17.0.4
# logout
Connection to 172.17.0.4 closed.

 

インベントリファイルの設定

インベントリファイル(hosts)に接続するターゲットノードの情報を書き込みます。IPアドレスはお使いの環境に合わせて変更してください。

# cd /etc/ansible/
# vi hosts
[target]
172.17.0.4

 

このファイルに登録したノードに対して処理を実行することができます。インベントリファイルはini形式で記載されます。

[]の中に記載した名前によってグルーピングすることができます。IPアドレスやドメイン名を並べて、グループ単位で構成管理を行います。以下のような使い方ができます。
[target1]
172.17.0.1
172.17.0.2

[target2]
172.17.0.3
172.17.0.4

 

playbook実行時にtarget1を指定すると172.17.0.1と172.17.0.2、target2を指定すると172.17.0.3と172.17.0.4に対して処理を実行できます。

以下のように書くことで、各ノード単位での接続も可能です。

[target]
node1 ansible_host=172.17.0.4
node2 ansible_host=172.17.0.5

 

疎通テスト

最後にAnsibleによる処理の実行ができているかを確認します。以下のように表示されれば成功です。

# ansible all -m ping
targetnode | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

 

うまく通信ができていないと以下のように表示されます。原因はIPアドレスの指定が間違っている、sshdが動いていないなどが考えられます。

# ansible all -m ping
targetnode | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 172.17.0.4 port 22: Connection refused",
    "unreachable": true
}

 

ansibleコマンドは単一のモジュール(命令)を実行するコマンドです。引数には対象となるターゲットノードを指定します。オプションは以下の通りです

オプション 説明
-i インベントリファイルの指定(デフォルトは/etc/ansible/hosts)
-m 実行するモジュールの指定

 

上記の例はインベントリファイル内のすべてのノードに対しpingモジュールを実行するコマンドになります。グループもしくはノード単位での指定も可能です。

# ansible target -m ping
# ansible node1 -m ping

 

モジュールは以下のページで調べることができます。

https://docs.ansible.com/ansible/2.9_ja/modules/modules_by_category.html#modules-by-category

まとめ

この記事ではAnsibleの検証環境を導入する方法についてまとめました。

次回はplaybookを記述し構成管理を行います。

最後までお読みいただきありがとうございます。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です