ステータス:非推奨

この記事では、サポートされなくなったバージョンのUbuntuについて説明します。 現在Ubuntu12.04を実行しているサーバーを運用している場合は、サポートされているバージョンのUbuntuにアップグレードまたは移行することを強くお勧めします。

理由:
Ubuntu 12.04は2017年4月28日に保守終了(EOL)に達しました and no longer receives security patches or updates. This guide is no longer maintained.

代わりに参照してください:このガイドは参照として役立つ場合がありますが、他のUbuntuリリースでは機能しない場合があります。 可能な場合は、使用しているUbuntuのバージョン用に作成されたガイドを使用することを強くお勧めします。 ページ上部の検索機能を使用して、より新しいバージョンを見つけることができます。

序章


構成管理システムは、管理者や運用チームが多数のサーバーを簡単に制御できるように設計されています。 これらを使用すると、1つの中央の場所から自動化された方法で多くの異なるシステムを制御できます。

Linuxシステムで利用できるChefやPuppetなどの一般的な構成管理システムは数多くありますが、これらは多くの場合、多くの人が望んでいる、または必要としているよりも複雑です。 Ansible は、開始するためのオーバーヘッドがはるかに小さいため、これらのオプションの優れた代替手段です。

このガイドでは、Ubuntu 12.04マシンにAnsibleをインストールする方法について説明し、ソフトウェアの使用方法の基本について説明します。

Ansibleはどのように機能しますか?


Ansibleは、Ansibleコンポーネントがインストールおよび構成されたコンピューターからクライアントマシンを構成することで機能します。

リモートマシンから情報を取得し、コマンドを発行し、ファイルをコピーするために、通常のSSHチャネルを介して通信します。 このため、Ansibleシステムでは、クライアントコンピューターに追加のソフトウェアをインストールする必要はありません。

これは、Ansibleがサーバーの管理を簡素化する1つの方法です。 SSHポートが公開されているサーバーは、ライフサイクルのどの段階にあるかに関係なく、Ansibleの構成の傘下に置くことができます。

SSHを介して管理できるすべてのコンピューターは、Ansibleを介して管理することもできます。

Ansibleはモジュラーアプローチを採用しているため、メインシステムの機能を使用して特定のシナリオを処理するように簡単に拡張できます。 モジュールは任意の言語で記述でき、標準のJSONで通信できます。

構成ファイルは、その表現力と一般的なマークアップ言語との類似性により、主にYAMLデータシリアル化形式で記述されます。 Ansibleは、コマンドラインツールまたはPlaybooksと呼ばれる構成スクリプトを介してクライアントと対話できます。

Ubuntu12.04VPSにAnsibleをインストールします


さまざまなサーバーを管理する手段としてAnsibleの調査を開始するには、少なくとも1台のマシンにAnsibleソフトウェアをインストールする必要があります。 このセクションでは、Ubuntu12.04VPSインスタンスを使用します。

Ansible for Ubuntuを入手する最良の方法は、プロジェクトのPPA(パーソナルパッケージアーカイブ)をシステムに追加することです。

これを効果的に行うには、python-software-propertiesパッケージをインストールする必要があります。これにより、PPAを簡単に操作できるようになります。

sudo apt-get update
sudo apt-get install python-software-properties

パッケージがインストールされたら、次のコマンドを入力してAnsiblePPAを追加できます。

sudo add-apt-repository ppa:rquillo/ansible

ENTERを押して、PPAの追加を受け入れます。

次に、システムのパッケージインデックスを更新して、PPAで使用可能なパッケージを認識できるようにする必要があります。 その後、ソフトウェアをインストールできます。

sudo apt-get update
sudo apt-get install ansible

これで、Ansibleを介してサーバーを管理するために必要なすべてのソフトウェアが揃いました。

SSHキーを設定する


前述のように、Ansibleは主にSSHを介してクライアントコンピューターと通信します。 確かにパスワードベースのSSH認証を処理する機能がありますが、SSHキーは物事をシンプルに保つのに役立ちます。

使用するキーがすでにあるかどうかに応じて、2つの異なる方法でSSHキーを設定できます。 管理するサーバーはDigitalOceanドロップレットであると想定します。

新しいSSHキーペアを作成する


Ansible管理に使用するSSHキーペアがまだない場合は、AnsibleVPSで作成できます。

AnsibleドロップレットにSSHキーペアを作成して、管理するホストで認証します。

Ansibleを制御するユーザーとして、次のように入力してRSAキーペアを作成します。

ssh-keygen

作成されたキーペアのファイルの場所、パスフレーズ、およびパスフレーズの確認を指定するように求められます。 これらすべてを介してEnterキーを押し、デフォルト値を受け入れます。

新しいキーは、ユーザーの~/.sshディレクトリにあります。 公開鍵(共有できるもの)はid_rsa.pubと呼ばれます。 秘密鍵(安全に保管するもの)はid_rsaと呼ばれます。

それらをDigitalOceanコントロールパネルに追加して、SSHキーを新しく作成されたドロップレットに埋め込むことができます。 これにより、Ansibleドロップレットを他の認証なしですぐに新しいドロップレットにSSHで接続できるようになります。

これを行うには、左側のナビゲーションメニューの[SSHキー]リンクをクリックします。 新しい画面で、右上隅にある[SSHキーの追加]ボタンをクリックします。

DigitalOcean add key

このキーに関連付ける名前を上部のフィールドに入力します。 Ansible VPSインスタンスで、次のように入力して公開鍵の内容を取得します。

cat ~/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0

返される文字列は、DigitalOceanコントロールパネルの2番目のフィールドに貼り付ける必要があるものです。

DigitalOcean Ansible key

「SSHキーの作成」をクリックして、コントロールパネルにキーを追加します。 これで、新しいドロップレットを作成するたびに、公開SSHキーを新しいサーバーに埋め込んで、Ansibleインスタンスと通信できるようになります。 ドロップレット作成プロセスの「オプションのSSHキーの追加」セクションでキーを選択する必要があります。

DigitalOcean embed key

既存のSSHキーペアをAnsibleに転送する


ドロップレットでの認証に使用しているSSHキーペアがすでにある場合は、新しいペアを作成する代わりに、資格情報を新しいAnsibleドロップレットに転送できます。 これには、キーを使用するように構成済みのサーバーで自動的に機能するという利点があります。

ドロップレットのSSHキー認証を構成したコンピューターで、次のように入力して公開キーを取得します。

cat ~/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0

Ansibleサーバーで、キーを保存するための隠しディレクトリを作成する必要があります。 これを.sshと呼び、SSHプログラムがそれを見つける場所を認識できるようにします。

mkdir ~/.ssh

このディレクトリへのアクセスをロックして、自分だけがそのディレクトリに入力または書き込みできるようにする必要があります。

chmod 700 ~/.ssh

次に、ディレクトリに移動して、テキストエディタでid_rsa.pubというファイルを開きます。

cd ~/.ssh
nano id_rsa.pub

公開鍵の出力を自宅のコンピューターから次のファイルに貼り付けます。

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0

ファイルを保存して閉じます。 次のように入力して、このファイルに正しい権限があることを確認します。

chmod 644 id_rsa.pub

ここで、SSHキーアクセス用に構成されているローカルコンピューターに戻り、次のように入力します。

cat ~/.ssh/id_rsa

-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEA85hoLKo0hbjgW42QdbIKriqad08vhYKqC684ym25PVRjh+pD
N+2gIcl8Zk0H3uvZYWIv1gmsfpq1zsmPSIkG1H2eI7HzxPQ0qMx4ZpxogVgO6XnQ
kyfzYX9OnZoQCSGxMVt7g4IWz2820gOSIZ9cdBeRV7UjA6Bbco3MFMCcXNs/5JPU
ynBUpfKqn+CGAWBO3PhCmmEQY4wz+AEJosI0z7oqbJrm/AtDhhdHUzGrSGtJaJOq
. . .
. . .
cqsqOEzXAoGBAPMJJ8RrKUBuSjVNkzebst9sBgNadmaoQUoMHUDr8KpCZhWAoHB7
1VKmq7VSphQSruI31qy2M88Uue1knC/nQr1bE1DITZgezETSsDqsAMBo8bqDN6TT
qVJgG+TS9BRC+IowuzMVV5mzrfJjkrb+GG+xWSXrTLZMbeeTf+D0SfVo
-----END RSA PRIVATE KEY-----

出力はかなり長くなります。

Ansibleドロップレットに戻り、~/.sshディレクトリに新しいファイルを作成する必要があります。

nano id_rsa

内部に、前のコマンドの結果をローカルコンピューターに貼り付けます。

-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEA85hoLKo0hbjgW42QdbIKriqad08vhYKqC684ym25PVRjh+pD
N+2gIcl8Zk0H3uvZYWIv1gmsfpq1zsmPSIkG1H2eI7HzxPQ0qMx4ZpxogVgO6XnQ
kyfzYX9OnZoQCSGxMVt7g4IWz2820gOSIZ9cdBeRV7UjA6Bbco3MFMCcXNs/5JPU
ynBUpfKqn+CGAWBO3PhCmmEQY4wz+AEJosI0z7oqbJrm/AtDhhdHUzGrSGtJaJOq
. . .
. . .
cqsqOEzXAoGBAPMJJ8RrKUBuSjVNkzebst9sBgNadmaoQUoMHUDr8KpCZhWAoHB7
1VKmq7VSphQSruI31qy2M88Uue1knC/nQr1bE1DITZgezETSsDqsAMBo8bqDN6TT
qVJgG+TS9BRC+IowuzMVV5mzrfJjkrb+GG+xWSXrTLZMbeeTf+D0SfVo
-----END RSA PRIVATE KEY-----

最初と最後のマーカー行が含まれていることを確認してください。 キーファイルを有効にするために必要です。 ファイルを保存して閉じます。

このファイルを安全に保つために、アクセス許可を変更する必要があります。

chmod 600 id_rsa

この時点で、AnsibleはこれらのSSHキーを使用して、キーが埋め込まれているサーバーと通信できるようになります。

Ansibleホストの構成


Ansibleは、「hosts」ファイルを介して認識しているすべてのサーバーを追跡します。 他のコンピューターとの通信を開始する前に、まずこのファイルを設定する必要があります。

次のようなroot権限でファイルを開きます。

sudo nano /etc/ansible/hosts

多くの設定例を含むファイルが表示されますが、これらのホストが構成されているため、実際にはどれも機能しません。 まず、各行の前に「#」を追加して、このファイルのすべての行をコメントアウトしましょう。

将来、より複雑なシナリオを実装する場合に備えて、これらの例をファイルに保存します。

すべての行がコメント化されたら、実際のホストの追加を開始できます。

hostsファイルはかなり柔軟性があり、いくつかの異なる方法で構成できます。 使用する構文は次のようになります。

[ group_name ]エイリアスansible_ssh_host= server_ip_address

group_nameは、その下にリストされているサーバーを1つの単語で参照できるようにする組織タグです。 エイリアスは、そのサーバーを参照するための単なる名前です。

したがって、このシナリオでは、Ansibleで制御するサーバーが3つあると想像しています。 これらのサーバーには、次のように入力することでAnsibleドロップレットからアクセスできます。

ssh root @ server_ip_address

これを正しく設定した場合、パスワードの入力を求められることはありません。 ドロップレットのIPアドレスは192.0.2.1192.0.2.2、および192.0.2.3であると想定します。 これらを個別にhost1host2host3として参照できるように、またはグループとしてdropletsとして参照できるように設定します。

これを実現するためにhostsファイルに追加する必要があるブロックは次のとおりです。

[ドロップレット]host1ansible_ssh_host = 192.0.2.1 host2 ansible_ssh_host = 192.0.2.2 host3 ansible_ssh_host = 192.0.2.3

ホストは複数のグループに属することができ、グループはすべてのメンバーのパラメーターを構成できます。 これを試してみましょう。

現在の設定では、Ansibleを使用してこれらのホストのいずれかに接続しようとすると、コマンドは失敗します(rootユーザーとして操作していない場合)。 これは、SSHキーがリモートシステムのrootユーザーに埋め込まれており、Ansibleがデフォルトで現在のユーザーとして接続しようとするためです。 接続しようとすると、次のエラーが発生します。

host1 | FAILED => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue

私のAnsibleコンピューターでは、demoというユーザーを使用しています。 Ansibleはssh demo@serverで各ホストに接続しようとします。 デモユーザーがリモートシステムを使用していない場合、これは機能しません。

「droplets」グループ内のすべてのサーバーにrootユーザーを使用して接続するように指示するファイルを作成できます。

これを行うには、group_varsという名前のディレクトリをAnsible構成構造に作成します。 このフォルダー内で、構成するグループごとにYAML形式のファイルを作成できます。

sudo mkdir /etc/ansible/group_vars
sudo nano /etc/ansible/group_vars/droplets

ここに構成を入れることができます。 YAMLファイルは「—」で始まるので、その部分を忘れないようにしてください。

---
ansible_ssh_user: root

終了したら、このファイルを保存して閉じます。

グループの関連付けに関係なく、すべてのサーバーの構成の詳細を指定する場合は、それらの詳細を/etc/ansible/group_vars/allのファイルに入れることができます。 /etc/ansible/host_varsのディレクトリの下にファイルを作成することにより、個々のホストを構成できます。

単純なAnsibleコマンドの使用


ホストがセットアップされ、ホストに正常に接続できるように十分な構成の詳細が設定されたので、最初のコマンドを試すことができます。

次のように入力して、構成したすべてのサーバーにpingを実行します。

ansible -m ping all

host1 | success >> {
    "changed": false,
    "ping": "pong"
}

host3 | success >> {
    "changed": false,
    "ping": "pong"
}

host2 | success >> {
    "changed": false,
    "ping": "pong"
}

これは、Ansibleがすべてのホストに接続していることを確認するための基本的なテストです。

「すべて」とは、すべてのホストを意味します。 グループを簡単に指定することもできます。

ansible -m ping droplets

個々のホストを指定することもできます。

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を使用してリモートコンピューターの構成を自動化する方法については、今後の記事で説明します。

ジャスティン・エリングウッド