Ansibleの使い方を調べました。
VirtualBox上に作成した仮想マシンに対して、Ansibleを使ってnginxの構築を自動化してみます。
Ansibleとは
Ansible は、システムの設定やソフトウェアのデプロイなどを自動化するためツールです。
操作対象記述したhosts
ファイルと、操作対象に対する設定を記述したyaml
形式のファイルを作成するだけでインフラ構築作業を自動化し、構築する内容をコードとして管理することができます。
Ansibleで対象を操作するために必要な条件は、AnsibleがインストールされたマシンからSSHでログイン可能である
ことだけなので、ターゲットに対してワーカープログラムなどをインストールするといった設定作業が少ない(pythonのインストールとsshdの設定だけ)というメリットがあります。
確認用の環境
まず、対象となるサーバーを用意する必要があるので、Vagrantを使って作成します。
今回使ったファイルは、githubにプッシュしました。→nnnamani/example-for-ansible
これでmy_site
という仮想マシンが起動します。
ansibleのインストール
ansibleをインストールします。
環境によって違うと思うので、こちら を参考にすると良いと思います。
UbuntuやCentOSが多いと思うので、以下に抜粋したものを記載しておきます。
僕はNixOSを使っていたので以下で入りました。
今回使ったansibleはバージョン2.8
でした。最新は2.9
っぽいですが、今は気にしないでおきます。
ansibleを使ってみる
ここから本題です。
ansibleによる自動化では、対象のサーバーにSSHで入れるようにしておく必要があります。
今回は、Vagrantで対象のサーバーを構築したので、SSHは設定済みになります。
あとは、AnsibleがSSHの設定を使って対象サーバーにログインできれば準備完了です。
vagrant ssh-config
コマンドで、vagrantが作成したSSHの設定をダンプすることができます。
↓の感じで、秘密鍵の場所やホスト名、ポート番号などが、~/.ssh/config
に設定できる形で取れるようです。
余談ですが、VagrantはVMのSSHポートとホストのポートでフォワーディングしているようです。
で、この設定を~/.ssh/config
に追記すると、ansibleが使用できるようになるみたいです。
ansibleの実行に必要な設定を用意する
今回は、対象となる仮想マシン上にnginxをインストールして、適当に作ったhtmlを公開してみます。
ansibleの実行に最低限必要な設定は、以下の2つになります。
- Inventoryファイル
- ansibleで操作する対象ホストを記述したファイル
- Playbookファイル
これらに加えて、今回はnginxで公開するhtmlファイルhtml/index.html
を作成しています。
すべてGithubのリポジトリに格納してあります。
hostsファイルを用意したので、ansibleの接続確認をすると対象のサーバーから応答が返ってきていることがわかります。
今回実行するPlaybookファイルは、以下のようになっています。
tasks
に記述した処理が上から順に対象のサーバーで実行されます。
tasks
はShellスクリプトではなく、用意されたモジュールに対する設定という形になります。
Ansible
では冪等性を担保するために、必要なモジュールを使用することを推奨しているようです。
tasks
でやっていることを一つずつ見ていきます。
yumにepelリポジトリを追加
nginx
をインストールするために、yum
パッケージマネージャがepel
リポジトリを参照できるようにします。
これは、Ansibleのyum
モジュールを使って行います。
yumを使ってnginxをインストール
yum
モジュールを使ってnginxをインストールしています。
state=present
オプションを指定しており、インストール済みであればスキップされます
index.htmlファイルの配置
今回確認用に使うHTMLファイルをnginx
が公開しているディレクトリにコピーします。
これは、copy
モジュールを使うことで可能です。ローカルに用意したhtml/index.html
ファイルが仮想マシン上の/usr/share/nginx/html/index.html
にコピーされます。
nginxの起動と有効化
service
モジュールを使って、nginxの起動を行います。
state=started
がnginxを起動した状態にする指定で、enabled=yes
は仮想マシン起動時に自動起動する設定になります。
servicectl
コマンドに対応しているイメージがわかりやすいです。
Playbookを実行する
実際にPlaybookを実行してみます。
ansible-playbook
コマンドを使ってPlaybookを実行します。
結果がすべてok
となったら、ブラウザでhttp:192.168.33.101
にアクセスすると、Hello Ansible
というメッセージが表示された画面を確認できると思います。
公開するファイルを編集してみる
html/index.html
を編集し、再度Playbookを実行してみます。
index.htmlを編集して、HelloをHappyに書き換えてみます。
以下の状態になっています。
この状態でPlaybookを再実行してみます。
TASK [copy index.html]
がchanged
になりました。copyモジュールがindex.htmlの変更を検知して、コピー処理を実行したようです。
再度ブラウザでhttp:192.168.33.101
にアクセスすると、Happy Ansible
というメッセージが表示され変更を反映できたことが確認できます。
まとめ
Ansibleを最小限の構成で使って、仮想マシンを操作する方法を試してみました。
最小で2ファイル用意すれば簡単に環境構築を自動化できることがわかりました。
AnsibleはShellスクリプトを実行するモジュールなどもあり、より柔軟な設定ができるようです。
しかし、冪等性を担保するためにも適切なモジュールを使うほうが良いので、モジュールを調べて使うための学習コストはそれなりに必要なのかなと思いました。
インフラをコードで管理できるメリットは計り知れないと思うので、ベストプラクティス的なところも勉強したいです。