この連載では、Ansibleとはどういったものなのかを理解し、実際に使えるようになるまでを説明します。
第二回では環境構築を行います。ノードを用意し、Ansibleのインストールを行い、構成管理を実行できるところまで準備します。
- Ansibleとは
- 環境構築編
ノード準備
実際にAnsibleを使って構成管理を行いたい場合、構成管理を行うノードが元々存在することと思います。しかし、検証を行う場合はノードを自身で用意しなければなりません。
ノードを用意する方法はいくつか考えられます。
- 実機
- 仮想マシン
- コンテナ
などでしょうか。
今回は準備の手間をかけたくないのでコンテナでターゲットノードとコントロールノードを用意します。Windows 10でWSL2を動かし、その上でコンテナを立ち上げるという環境を想定します。「コンテナ使うならDockerfileで構成管理すればいいじゃん」というツッコミはご遠慮ください。
Docker環境が無い場合はこちらの記事を参考にしてください。
【連載】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のインストールを行います。
# 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を記述し構成管理を行います。
最後までお読みいただきありがとうございます。