2018年8月8日水曜日

超初級Ansible! ~Ansibleのインストールから簡単なPlaybookの実行まで~

インフラエンジニアを何年も続けていれば、サーバ構築、単体テスト、運用・保守作業の手順をスクリプト化して効率化することはよくやる話となる。このように、IT機器の構成情報をコード化・自動化することを「構成管理」と呼ぶ。

ちなみに、ITILでいう「構成管理」とは意味が異なる
  • ITILでいう構成管理:ITサービスに含まれる資産とその構成情報を一元管理すること
  • ここでいう構成管理:IT機器の構成情報をコード化・自動化すること
構成管理ツールとしては、以前はChefやPuppetといったツールが著名であったが、近年は「Ansible」というツールが非常に注目されている。Ansibleでは、YAML(ヤムル)という記述フォーマットで処理内容を記述するのだが、可読性に優れており容易に記載できることが特徴となる。

本記事では、Ansibleのインストールから、実際に簡単なPlaybookを作成して処理を実行する手順について記載することにする。実際にやってみればわかるが、1時間もあればできてしまう

環境

Ansibleをインストールするサーバー、Ansibleにて処理を実行するサーバーともに、CentOS 7.5を用いる。念のためバージョン情報を以下に記載する。

[root@t1000cent ~]# cat /etc/redhat-release
------------------------------
CentOS Linux release 7.5.1804 (Core)
------------------------------

IPアドレスは以下の通りとなる。
  • Ansibleサーバー:192.168.11.221 (ホスト名:t1000cent)
  • 処理対象サーバー:192.168.11.223

Ansibleインストール

Ansibleはyumを使ってインストールするのが一番手っ取り早い。依存関係のあるパッケージとして、複数のPythonのライブラリが合わせてインストールされる。

[root@t1000cent ~]# yum install ansible
------------------------------
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.usonyx.net
 * extras: ftp-srv2.kddilabs.jp
 * updates: centos.usonyx.net
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ ansible.noarch 0:2.4.2.0-2.el7 を インストール
--> 依存性の処理をしています: sshpass のパッケージ: ansible-2.4.2.0-2.el7.noarch
--> 依存性の処理をしています: python2-jmespath のパッケージ: ansible-2.4.2.0-2.el7.noarch
--> 依存性の処理をしています: python-six のパッケージ: ansible-2.4.2.0-2.el7.noarch

~(中略)~

  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

完了しました!
------------------------------

Ansibleのバージョンを確認しておく。2.4.2というバージョンとなる。

[root@t1000cent ~]# ansible --version
------------------------------
ansible 2.4.2.0
  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, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
------------------------------

Ansibleから接続するための初期設定

Ansibleでは、処理対象のサーバーとの接続性を確認するコマンドが用意されており、構文は以下となる。

------------------------------
ansible <接続先ホスト名 or IPアドレス> -m ping -k

 -m : モジュールを指定。今回は「ping」モジュールを使う
 -k : 実行時に接続先サーバーのパスワードの入力を求める
------------------------------

しかし、上記を実行してみたが、そのままではエラーとなってしまう。

[root@t1000cent ~]# ansible 192.168.11.223 -m ping -k
------------------------------
SSH password:
 [WARNING]: Could not match supplied host pattern, ignoring: all

 [WARNING]: provided hosts list is empty, only localhost is available

 [WARNING]: Could not match supplied host pattern, ignoring: 192.168.11.223

 [WARNING]: No hosts matched, nothing to do
------------------------------

Ansibleの処理対象とするサーバーは、/etc/ansible/hostsに記載する必要があるらしいので、記載して再度実行してみることにする。

[root@t1000cent ~]# cat /etc/ansible/hosts
------------------------------
192.168.11.102
------------------------------

再実行するとエラーが変わったが失敗してしまった。

[root@t1000cent ~]# ansible 192.168.11.223 -m ping -k
------------------------------
SSH password:
192.168.11.223 | FAILED! => {
    "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host."
}
------------------------------

メッセージを見ると~/.ssh/known_hostsに処理対象サーバーの署名を登録する必要がある旨書いてあるようなので、手動でssh接続して登録してみる。

[root@t1000cent ~]# ssh 192.168.11.223
------------------------------
The authenticity of host '192.168.11.223 (192.168.11.223)' can't be established.
ECDSA key fingerprint is SHA256:4sEF5Y1AsG3y4ywjkd9KOdILXIKTmcUDosmKGqJcrbA.
ECDSA key fingerprint is MD5:26:7c:6a:01:e5:a4:61:58:54:43:28:2c:18:cb:41:67.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.11.223' (ECDSA) to the list of known hosts.   ←★署名が登録される
root@192.168.11.223's password:
Last login: Wed Aug  1 18:47:58 2018
------------------------------

すると、ようやく接続に成功した!

[root@t1000cent ~]# ansible 192.168.11.223 -m ping -k
------------------------------
SSH password:
192.168.11.223 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
------------------------------

ssh接続時にパスワード入力を求められないようにする

とりあえず接続には成功するのだが、毎回パスワードを入力する必要があり面倒となる。そこで、Ansibleサーバー側にてssh接続用の秘密鍵と公開鍵のペアを作成し、公開鍵を処理対象サーバーに登録することで、パスワード入力なしでログインできるようにしておく。

まずはAnsibleサーバーにて秘密鍵と公開鍵のペアを作成する。

[root@t1000cent ansible]# ssh-keygen
------------------------------
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):   ←★そのままエンター
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.

~(以下略)~
------------------------------

公開鍵を処理対象サーバーにコピーする。ssh-copy-idコマンドを使うことで、処理対象サーバーの~/.ssh/authorized_keysに公開鍵情報が登録される。

[root@t1000cent ~]# ssh-copy-id 192.168.11.223
------------------------------
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.11.223's password:   ←★処理対象サーバーのパスワードを入力

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.11.223'"
and check to make sure that only the key(s) you wanted were added.
------------------------------

-kオプションを抜いて接続確認をすると、パスワード入力をすることなく接続に成功した。

[root@t1000cent ~]# ansible 192.168.11.223 -m ping
------------------------------
192.168.11.223 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
------------------------------

Playbookを実行 (yumでパッケージをインストールする)

それでは、実際にAnsibleから処理を実行してみよう。今回は処理対象サーバーにyumを使ってtelnetをインストールさせてみる。
※処理対象サーバーはインターネット接続ができる必要あり

Playbookは以下のように超シンプルなものになる。

[root@t1000cent ~]# cat install_telnet.yml
------------------------------
---
- hosts: all
  tasks:
    - name: install telnet
      yum: name=telnet state=latest
------------------------------

それではPlaybookを実行してみよう。コマンドはansible-playbookとなる。

[root@t1000cent ~]# ansible-playbook install_telnet.yml
------------------------------
PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.11.223]

TASK [install telnet] **********************************************************
changed: [192.168.11.223]

PLAY RECAP *********************************************************************
192.168.11.223             : ok=2    changed=1    unreachable=0    failed=0
------------------------------

処理対象サーバーにてインストール結果を確認してみる。

[root@localhost ~]# cat /var/log/yum.log
------------------------------
Aug 03 21:47:29 Installed: 1:telnet-0.17-64.el7.x86_64 ←★インストールされている
------------------------------

このように、Ansibleでは簡単な処理であれば、たった4行のコードを書くだけで実行できてしまう。コードの内容もわかりやすいし、公式マニュアルも充実しているので、少ない学習時間で使えるようになるのがAnsibleの特徴と言えるだろう。

参考

yum - Manages packages with the yum package manager
https://docs.ansible.com/ansible/latest/modules/yum_module.html


0 件のコメント:

コメントを投稿

人気の投稿