前書き
構成管理システムは、管理者と運用チームが多数のサーバーを簡単に制御できるように設計されています。 これらを使用すると、1つの中央ロケーションから多くの異なるシステムを自動化された方法で制御できます。
Linuxシステムで使用できるChefやPuppetなど、多くの一般的な構成管理システムがありますが、多くの人が望むまたは必要とするよりも複雑です。 Ansibleは、開始するのに必要なオーバーヘッドがはるかに少ないため、これらのオプションの優れた代替手段です。
このガイドでは、Ubuntu 18.04サーバーにAnsibleをインストールする方法について説明し、ソフトウェアの使用方法の基本について説明します。
Ansibleの仕組み
Ansibleは、Ansibleコンポーネントがインストールおよび構成されているコンピューターからクライアントマシンを構成することで機能します。
通常のSSHチャネルを介して通信し、リモートマシンから情報を取得し、コマンドを発行し、ファイルをコピーします。 このため、Ansibleシステムでは、追加のソフトウェアをクライアントコンピューターにインストールする必要はありません。
これは、Ansibleがサーバーの管理を簡素化する1つの方法です。 SSHポートが公開されているサーバーは、ライフサイクルのどの段階にあるかにかかわらず、Ansibleの構成傘下に置くことができます。 これは、SSHを介して管理できるコンピューターであれば、Ansibleを介して管理できることを意味します。
Ansibleはモジュール式のアプローチを採用しており、メインシステムの機能を使用して特定のシナリオに対処するための拡張を容易にします。 モジュールは任意の言語で記述でき、標準のJSONで通信できます。
構成ファイルは、その表現力豊かな性質と一般的なマークアップ言語との類似性により、主にYAMLデータシリアル化形式で記述されています。 Ansibleは、Playbookと呼ばれるコマンドラインツールまたはその構成スクリプトを介してホストと対話できます。
前提条件
このチュートリアルを実行するには、次のものが必要です。
-
2つ以上のUbuntu 18.04サーバー。 これらの1つはAnsible serverとして使用され、残りはAnsible hostsとして使用されます。 それぞれに、
sudo
特権を持つroot以外のユーザーがいて、基本的なファイアウォールが構成されている必要があります。 これは、Initial Server Setup Guide for Ubuntu 18.04に従って設定できます。 このガイド全体の例では、3つのAnsibleホストを指定していますが、表示されるコマンドと構成は、任意の数のクライアントに合わせて調整できます。 -
Ansibleサーバー上のroot以外のユーザー用に生成されたSSHキー。 これを行うには、How to Set Up SSH Keys on Ubuntu 18.04に関するガイドのステップ1に従います。 このチュートリアルでは、キーペアをデフォルトの場所(
~/.ssh/id_rsa
)に保存でき、パスワードで保護する必要はありません。
[[step-1 -—- installing-ansible]] ==ステップ1—Ansibleのインストール
さまざまなサーバーを管理する手段としてAnsibleの使用を開始するには、少なくとも1台のマシンにAnsibleソフトウェアをインストールする必要があります。
Ubuntu向けのAnsibleの最新バージョンを入手するには、プロジェクトのPPA(パーソナルパッケージアーカイブ)をシステムに追加できます。 ただし、これを行う前に、まずsoftware-properties-common
パッケージがインストールされていることを確認する必要があります。 このソフトウェアは、これおよび他の独立したソフトウェアリポジトリの管理を容易にします。
sudo apt update
sudo apt install software-properties-common
次に、次のコマンドを入力してAnsible PPAを追加します。
sudo apt-add-repository ppa:ansible/ansible
ENTER
を押して、PPAの追加を受け入れます。
次に、PPAで使用可能なパッケージを認識できるように、システムのパッケージインデックスをもう一度更新します。
sudo apt update
この更新後、Ansibleソフトウェアをインストールできます。
sudo apt install ansible
これで、Ansibleサーバーには、ホストの管理に必要なすべてのソフトウェアが含まれています。
[[step-2 -—- configuring-ssh-access-to-the-ansible-hosts]] ==ステップ2—AnsibleホストへのSSHアクセスの構成
前述のように、Ansibleは主にSSHを介してクライアントコンピューターと通信します。 パスワードベースのSSH認証を処理する機能は確かにありますが、SSHキーを使用すると、物事を簡単に保つことができます。
Ansibleサーバーで、cat
コマンドを使用して、root以外のユーザーのSSH公開鍵ファイルの内容を端末の出力に出力します。
cat ~/.ssh/id_rsa.pub
結果の出力をクリップボードにコピーしてから、新しいターミナルを開き、SSHを使用してAnsibleホストの1つに接続します。
ssh sammy@ansible_host_ip
クライアントマシンのrootユーザーに切り替えます。
su -
rootユーザーとして、~/.ssh
ディレクトリ内のauthorized_keys
を開きます。
nano ~/.ssh/authorized_keys
ファイルに、AnsibleサーバーユーザーのSSHキーを貼り付け、ファイルを保存してエディターを閉じます(CTRL + X
、Y
、ENTER
の順に押します)。 次に、exit
コマンドを実行して、ホストのroot以外のユーザーに戻ります。
exit
最後に、Ansibleは/usr/bin/python
にあるPythonインタープリターを使用してモジュールを実行するため、Ansibleがホストと通信するには、ホストにPython2をインストールする必要があります。 次のコマンドを実行して、ホストのパッケージインデックスを更新し、python
パッケージをインストールします。
sudo apt update
sudo apt install python
これに続いて、exit
コマンドをもう一度実行して、クライアントへの接続を閉じることができます。
exit
Ansibleサーバーで制御するサーバーごとにこのプロセスを繰り返します。 次に、Ansibleのhosts
ファイルを使用してこれらのホストに接続するようにAnsibleサーバーを構成します。
[[step-3 -—- setting-up-ansible-hosts]] ==ステップ3—Ansibleホストの設定
Ansibleは、hosts
ファイルを介して認識しているすべてのサーバーを追跡します。 他のコンピューターとの通信を開始する前に、まずこのファイルをセットアップする必要があります。
次のように、sudo
権限でファイルを開きます。
sudo nano /etc/ansible/hosts
ファイル内には、コメントアウトされた構成例がいくつか表示されます(各行の前に#
が付いています)。 これらの例は、それぞれにリストされているホストが構成されているため、実際には機能しません。 ただし、将来、より複雑なシナリオを実装する場合は、これらの例をファイルに保存して構成に役立てます。
hosts
ファイルはかなり柔軟性があり、いくつかの異なる方法で構成できます。 ただし、使用する構文は次のようになります。
[group_name]
alias ansible_host=your_server_ip
[.note]#Note: Ansibleバージョン2.0のリリースでは、構成変数ansible_host
が元の変数ansible_ssh_host
に置き換わりました。 古いバージョンのAnsibleを使用している場合は、古い、より長い変数を使用する必要があります。
#
この例では、group_name
は、その下にリストされているサーバーを1つの単語で参照できる組織タグですが、alias
は、特定の1つのサーバーを参照するための単なる名前です。
したがって、このシナリオでは、Ansibleで制御する3台のサーバーがあることを想像しています。 この時点で、これらのサーバーは次のように入力することでAnsibleサーバーからアクセスできます。
ssh root@ansible_host_ip
これを正しく設定した場合、パスワードの入力を求められるべきではありません。 デモンストレーションの目的で、ホストのIPアドレスは203.0.113.1
、203.0.113.2
、および203.0.113.3
であると想定します。 これらを個別にhost1
、host2
、およびhost3
として、またはservers
という名前のグループとして参照できるようにこれを設定します。
これは、これを実現するためにhosts
ファイルに追加する必要があるブロックです。
/etc/ansible/hosts
[servers]
host1 ansible_host=203.0.113.1
host2 ansible_host=203.0.113.2
host3 ansible_host=203.0.113.3
ホストは複数のグループに属し、グループはすべてのメンバーのパラメーターを構成できます。 これを試してみましょう。
現在の設定で、Ansibleを使用してこれらのホストのいずれかに接続しようとすると、コマンドは失敗します(rootユーザーとして動作していない場合)。 これは、SSHキーがリモートシステムのrootユーザーに埋め込まれており、Ansibleがデフォルトで現在のユーザーとして接続を試みるためです。 接続を試行すると、次のエラーが発生します。
Outputhost1 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh.",
"unreachable": true
}
Ansibleサーバーでは、sammyというユーザーを使用しています。 Ansibleはssh sammy@server
で各ホストに接続しようとします。 sammyユーザーがリモートシステム上にいない場合、これは機能しません。
「servers」グループ内のすべてのサーバーにrootユーザーとして接続するように指示するファイルを作成できます。
これを行うには、Ansible構成構造にgroup_vars
というディレクトリを作成します。 このフォルダー内で、構成するグループごとにYAML形式のファイルを作成できます。
sudo mkdir /etc/ansible/group_vars
sudo nano /etc/ansible/group_vars/servers
YAMLファイルは「—」で始まるため、その部分を忘れないでください。
/etc/ansible/group_vars/servers
---
ansible_user: root
[.note]#Note:ansible_host
変数と同様に、ansible_user
は変数ansible_ssh_user
をバージョン2.0のリリースに置き換えました。 2.0より古いバージョンのAnsibleを使用している場合は、必ず古い、より長い変数を使用してください。
#
終了したら、このファイルを保存して閉じます。
グループの関連付けに関係なく、すべてのサーバーの構成の詳細を指定する場合は、それらの詳細を/etc/ansible/group_vars/all
のファイルに入れることができます。 個々のホストは、/etc/ansible/host_vars
のディレクトリの下にエイリアスにちなんで名付けられたファイルを作成することで構成できます。
[[step-4 -—- using-simple-ansible-commands]] ==ステップ4— SimpleAnsibleコマンドの使用
ホストがセットアップされ、ホストに正常に接続できるように構成の詳細が十分になったので、最初のコマンドを試すことができます。
次のように入力して、構成したすべてのサーバーにpingを実行します。
ansible -m ping all
ping出力
host1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
host3 | SUCCESS => {
"changed": false,
"ping": "pong"
}
host2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
これは、Ansibleがすべてのホストに接続していることを確認するための基本的なテストです。
all
は、すべてのホストを意味します。 グループを簡単に指定できます。
ansible -m ping servers
また、個々のホストを指定することもできます。
ansible -m ping host1
コロンで区切ることにより、複数のホストを指定できます。
ansible -m ping host1:host2
コマンドの-m ping
部分は、「ping」モジュールを使用するためのAnsibleへの命令です。 これらは基本的に、リモートホストで実行できるコマンドです。 pingモジュールは、Linuxの通常のping
ユーティリティと同じようにさまざまな方法で動作しますが、代わりにAnsible接続をチェックします。
pingモジュールは実際には引数を取りませんが、別のコマンドを試して、その仕組みを確認することができます。 -a
と入力して、引数をスクリプトに渡します。
「シェル」モジュールを使用すると、リモートホストに端末コマンドを送信し、結果を取得できます。 たとえば、host1マシンのメモリ使用量を調べるには、次を使用できます。
ansible -m shell -a 'free -m' host1
シェル出力
host1 | SUCCESS | rc=0 >>
total used free shared buffers cached
Mem: 3954 227 3726 0 14 93
-/+ buffers/cache: 119 3834
Swap: 0 0 0
これにより、Ansibleサーバーが構成され、ホストと正常に通信および制御できます。
結論
このチュートリアルでは、Ansibleを構成し、各ホストと通信できることを確認しました。 また、ansible
コマンドを使用して、単純なタスクをリモートで実行しました。
これは便利ですが、この記事ではAnsibleの最も強力な機能であるPlaybooksを取り上げていません。 Ansible Playbookは、サーバー構成とマルチマシン展開を管理するための強力でシンプルな方法です。 Playbookの概要については、this guideを参照してください。 さらに、ツールの詳細については、official Ansible documentationを確認することをお勧めします。