Ubuntu 14.04にAnsibleをインストールして設定する方法
Ubuntu 14.04を使用していませんか?別のバージョンまたはディストリビューションを選択してください。
紹介
構成管理システムは、多くのサーバーを管理者や運用チームが簡単に制御できるように設計されています。それらは、中央の1か所から自動化された方法で多くの異なるシステムを制御することを可能にします。
Linuxシステム向けには、ChefやPuppetなど多くの人気のある構成管理システムがありますが、これらは多くの人が望むよりも複雑であることが多いです。 Ansible はこれらのオプションに対する優れた代替案であり、始めるのに必要なオーバーヘッドがはるかに小さいからです。
このガイドでは、Ubuntu 14.04 マシンに Ansible をインストールする方法と、ソフトウェアの基本的な使い方について説明します。
Ansibleはどのように機能しますか?
Ansibleは、Ansibleコンポーネントがインストールされ構成されたコンピュータからクライアントマシンを構成することによって機能します。
リモートマシンから情報を取得し、コマンドを発行し、ファイルをコピーするために、通常のSSHチャネルを介して通信します。このため、Ansibleシステムはクライアントコンピュータに追加のソフトウェアをインストールする必要がありません。
これはAnsibleがサーバーの管理を簡素化する一つの方法です。SSHポートが公開されているサーバーは、ライフサイクルのどの段階にあってもAnsibleの設定の傘下に置かれることができます。
SSHを通じて管理できるコンピュータは、Ansibleを通じても管理できます。
Ansibleはモジュラーアプローチを採用しており、特定のシナリオに対処するために、メインシステムの機能を拡張することが簡単です。モジュールは任意の言語で記述でき、標準のJSONで通信します。
設定ファイルは、その表現力豊かな性質と人気のあるマークアップ言語との類似性から、主にYAMLデータシリアル化フォーマットで記述されます。Ansibleは、コマンドラインツールまたはPlaybookと呼ばれる設定スクリプトを通じてクライアントと対話できます。
Ubuntu 14.04にAnsibleをインストールする
Ansibleをサーバー管理の手段として探求するためには、少なくとも1台のマシンにAnsibleソフトウェアをインストールする必要があります。このセクションでは、Ubuntu 14.04のVPSインスタンスを使用します。
UbuntuにAnsibleをインストールする最良の方法は、プロジェクトのPPA(パーソナルパッケージアーカイブ)をシステムに追加することです。
これを効果的に行うためには、PPAsを簡単に扱う能力を与えるsoftware-properties-commonパッケージをインストールする必要があります。(このパッケージは古いバージョンのUbuntuではpython-software-propertiesと呼ばれていました。)
- sudo apt-get update
- sudo apt-get install software-properties-common
パッケージがインストールされたら、次のコマンドを入力してAnsible PPAを追加できます:
- sudo apt-add-repository ppa:ansible/ansible
Enter を押して PPA の追加を受け入れます。
次に、システムのパッケージインデックスを更新して、PPAで利用可能なパッケージを認識できるようにする必要があります。その後、ソフトウェアをインストールできます:
- sudo apt-get update
- sudo apt-get install ansible
私たちは現在、Ansibleを通じてサーバーを管理するために必要なすべてのソフトウェアを持っています。
SSHキーを設定する
上記で述べたように、Ansible は主に SSH を通じてクライアントコンピュータと通信します。パスワードベースの SSH 認証を扱う能力は確かにありますが、SSH キーを使うことで物事が簡単になります。
SSH鍵は、使用したい鍵がすでにあるかどうかに応じて、2つの異なる方法で設定できます。管理したいサーバーはDigitalOceanのドロップレットであると仮定します。
新しいSSHキー対を作成する
Ansibleの管理に使用したいSSHキーのペアがまだない場合は、今すぐあなたのAnsible VPSで作成できます。
私たちは、AnsibleドロップレットでSSHキーのペアを作成して、管理するホストと認証します。
ユーザーとして、Ansibleを制御するために、次のようにRSAキー対を作成します:
- ssh-keygen
作成されたキーペアのファイルの場所、パスフレーズ、およびパスフレーズの確認を指定するように求められます。すべてのオプションでENTERキーを押してデフォルト値を受け入れてください。
新しいキーは、ユーザーの~/.sshディレクトリ内で利用可能です。公開鍵(共有できる方)はid_rsa.pubと呼ばれ、秘密鍵(安全に保管する方)はid_rsaと呼ばれます。
新しく作成されたドロップレットにSSHキーを埋め込むことを許可するために、これらをDigitalOceanのコントロールパネルに追加できます。これにより、あなたのAnsibleドロップレットは他の認証なしに新しいドロップレットにすぐにSSH接続できるようになります。
これを行うには、左側のナビゲーションメニューの「SSHキー」リンクをクリックします。新しい画面で、右上隅の「SSHキーを追加」ボタンをクリックしてください。
この鍵に関連付けたい名前を上のフィールドに入力してください。あなたのAnsible VPSインスタンスで、次のように入力して公開鍵の内容を取得します:
- cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzmGgsqjSFuOBbjZB1sgquKpp3Ty+FgqoLrzjKbbk9VGOH6kM37aAhyxxmTQfe69lhYi/WCai+mrXOyY9IiQbUfZ4jsfPE9DS3zHhmnGiBWA7pedCTJ/Nhf06dmhAJIbExW3uDghbPbzbSA5Ihn1x0F5FXtSMDoFtyjcwUwJxc2z/kk9TKcFSl8qqf4IYBYE7c+EKaYRBjjDP4AQmiwjTPuipsmub7C0OGF0dTMatIa0lok6rwy91nmhCQV6polG0+Fsk4YrY8Yh5xz6wE0lOvc8BwP9nL0zsnw6Ey0MHV9BbMqtyD6x/fCurpIkMHJK4nv79rToSWA0AwoP/bJXh7 demo@ansible0
返される文字列は、DigitalOceanコントロールパネルの2番目のフィールドに貼り付ける必要があるものです。
「SSHキーを作成」をクリックして、コントロールパネルにキーを追加してください。これで、新しいドロップレットを作成するたびに、公開SSHキーを新しいサーバーに埋め込むことができ、Ansibleインスタンスと通信できるようになります。「オプションのSSHキーを追加」セクションでキーを選択するだけです。
既存の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」ファイルを通じて追跡します。このファイルを最初に設定する必要があります、そうしないと他のコンピュータと通信を始めることができません。
このようにして、ルート権限でファイルを開いてください:
- sudo nano /etc/ansible/hosts
多くの例の設定が含まれるファイルが表示されますが、これらのホストは架空のものであるため、実際にはどれも機能しません。 では、まずこのファイルのすべての行の前に「# 」を追加してコメントアウトしましょう。
将来的により複雑なシナリオを実装したい場合に備えて、これらの例をファイルに保管しておきます。
すべての行がコメントアウトされたら、実際のホストを追加することができます。
hostsファイルは非常に柔軟で、いくつかの異なる方法で構成できます。ただし、私たちが使用する構文は次のようになります:
[group_name]
alias ansible_ssh_host=your_server_ip
group_nameは、その下にリストされている任意のサーバーを1つの言葉で指すことができる組織的なタグです。エイリアスはそのサーバーを指すための単なる名前です。
したがって、私たちのシナリオでは、Ansible で制御する 3 台のサーバーがあると想定しています。これらのサーバーには、Ansible ドロップレットから次のように入力することでアクセスできます:
- ssh root@your_server_ip
正しく設定されていれば、パスワードの入力を求められることはないはずです。私たちは、ドロップレットのIPアドレスを192.0.2.1、192.0.2.2、192.0.2.3として考えます。これらをそれぞれhost1、host2、host3と呼ぶことができるように設定し、全体としてdropletsとも呼ぶことができます。
これが私たちがこれを達成するためにホストファイルに追加すべきブロックです。
[droplets]
host1 ansible_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で各ホストに接続しようとします。このデモユーザーがリモートシステムに存在しない場合、これは機能しません。
「ドロップレット」グループ内のすべてのサーバーにルートユーザーを使用して接続するように指示するファイルを作成できます。
これを行うために、Ansibleの設定構造内にgroup_varsというディレクトリを作成します。このフォルダー内で、設定したい各グループのために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がすべてのホストに接続できることを確認するための基本的なテストです。
「all」はすべてのホストを意味します。グループを指定することも同様に簡単です。
- ansible -m ping droplets
特定のホストを指定することもできます。
- ansible -m ping host1
ホストをコロンで区切ることによって、複数のホストを指定できます:
- ansible -m ping host1:host2
-m pingの部分は、Ansibleに「ping」モジュールを使用するよう指示するコマンドです。これは基本的に、リモートホストで実行できるコマンドです。pingモジュールは、Linuxの通常のpingユーティリティの多くの点で似ていますが、代わりにAnsibleの接続性をチェックします。
pingモジュールは実際には引数を取らないが、他のコマンドを試してその動作を確認することができる。スクリプトに引数を渡すには、-aと入力する。
「shell」モジュールを使用すると、リモートホストに端末コマンドを送信し、その結果を取得することができます。例えば、ホスト1のメモリ使用量を調べるために、次のように使用できます:
- 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の最も強力な機能であるプレイブックについては触れていません。Ansibleを使ってサーバーを操作するための素晴らしい基盤を整えましたが、本格的な作業は今後の記事で行います。その記事では、プレイブックを使用してリモートコンピュータの構成を自動化する方法について説明します。



