サーバ構築を自動化する 〜ansible〜
TRANSCRIPT
伊藤 結
サーバ構築を自動化する
〜Ansible〜
Ansibleってなに?
Ansibleとは
あーそーゆーことね。完全に理解した。 (わかってない )
Ansibleは構成管理ツールの一つである。
設定を記述しておけば、以下のようなことを複数のサーバに対して何度
も実行できる。
● サーバの設定(ツールをインストールする、設定の追加など)● デプロイ操作(サーバにファイルをコピーする、再起動するなど)
Ansibleの実行イメージ
①管理ホストPC(操作を行う側)からAnsibleを実行する
②各サーバに対して設定ファイル記述された操作 (ファイルコピー、コマンドなど )が実行される
SSH
Ansibleの設定ファイル(Inventory, Playbook)Ansibleは基本的に以下の2種類のファイルを読み込んで処理を実行します。これらのファイルは、行う操作に応じて各ユーザが作成します。
[app]
192.168.33.11 ansible_ssh_private_key_file=key1
192.168.33.12 ansible_ssh_private_key_file=key2
[balancer]
192.168.33.13 ansible_ssh_private_key_file=key3
---
- hosts: app
sudo: yes
remote_user: foo
tasks:
- name: アプリファイルをコピー
copy: src=./web dest=/home/foo/
- name: nginxをインストール
yum: name=nginx state=latest
Inventoryファイル Playbookファイル
対象のサーバの情報 (IP、sshの鍵情報)を、ini形式で記述
Inventoryファイルに記述されたサーバに行う操作(Ansibleの提供モジュール )をyml形式で記述
実際にAnsibleを使ってみる
デモのイメージ
Ansibleのデモとして、ローカルPCに仮想環境を立て、以下のようなロードバランシング環境を作成します。
ロードバランサ
Webサーバ1
Webサーバ2
ローカル仮想環境
クライアントPC(ブラウザ)
デモプロジェクトのフォルダ構成├── all.yml すべてのPlaybookを含んだ実行用Playbook├── apps_playbook.yml Webサーバ用のPlaybook├── balancers_playbook.yml ロードバランサ用のPlaybook├── config | ├── default.conf ロードバランサ用のconfig | └── nginx.conf ロードバランサ用のconfig | ├── hosts 各サーバの情報をしたInventoryファイル └── web ├── index.html Webサーバにデプロイするhtmlファイル └── simpleserver.py Webサーバ上で動作するHTTPサーバ
コマンドラインから、hosts, all.ymlを指定して、ansible-playbookコマンドを実行すると、各サーバに対して操作が実行されます。
サンプルソース : https://github.com/yuizho/ansible_vagrant_balancer_sample
ansible-playbookコマンドを実行
hosts, all.ymlを指定して、ansible-playbookコマンドを実行
仮想環境のWebサーバ2台に対して実行(ファイルのコピ〜Httpサーバの起動 )
仮想環境のロードバランサに対して実行 (nginxインストール〜nginx再起動)
ロードバランサに対してアクセスしてみると……1回目 2回目
1回目はWebサーバ1の内容が表示、2回目はWebサーバ2の内容が表示され、ロードバランサと各Webサーバの動作が確認できました。このように、Ansibleを使用すれば複数のサーバに対して一度に操作、設定を実行できます。
Ansibleの特徴
冪等性(べきとうせい)がある同じPlaybookを指定してAnsibleを複数回実行した場合、基本的に1回目に実行した時と同じ結果が得られます(何度やっても同じになる)。すでに設定が入っている場合は、操作をスキップしてくれます。
1回目 2回目
サーバ側に特別な設定を入れる必要がない
管理ホストのPCにのみAnsibleをインストールすれば、SSH越しにサーバ側を操作できます。そのため、サーバ側に対して特別な設定を入れる必要がありません。
これらの類似ツールは、設定を加えるサーバ側にあらかじめ設定を加えておく必要があったりする。
一度に複数のサーバを設定できる
デモでもお見せしたように、Inventoryファイルに対して対象となるサーバをすべて記述しておけば、それらのサーバに対して一度に同じ操作を実行できます。
AnsibleのPlaybookファイルは簡単な再帰処理、分岐処理を記述できるので、サーバごとに設定の変更が必要な場合も問題なく操作を実行させることができます。
これらの特徴に加えて……
導入するとこんな利点も
バージョン管理システムの恩恵を受けやすく、アプリケーション開発と同じようなワークフローが構築できます。結果として、オペミスや手順漏れ、更新漏れが軽減されます。
Ansibleを導入すると、サーバへの作業手順そのものをPlaybook上に書くことができ、作業手順の作成を以下のようなワークフローで行うことができます。
1. 既存のPlaybookをバージョン管理システムから取得し、修正を実施2. 修正したPlaybookのレビューを実施3. 更新したPlaybookを、テスト環境に流してテストを実施4. テスト済みのPlaybookをバージョン管理システムへコミット5. テストで使用した、Playbookを本番環境で流す
Infrastructure as Code
"Infrastructure as Code" というのはこういうことで、単
にサーバー構成変更を自動化しましょうという話では
なく、インフラをすべてソフトウェアとして、コードで扱う
ことでアプリケーション開発で行われてきたいろいろな "ワークフロー" をインフラ作業の世界にも導入しましょ
うねと、そういうことであります。
naoyaのはてなダイアリーよりhttp://d.hatena.ne.jp/naoya/20131215/1387090668
Ansibleユースケース
大量のサーバを構築する
同じ操作を複数のサーバに対して一気に実行できることから、大量のサーバをセットアップする必要がある場合は非常に有効です。
サーバ構築作業の効率化
ST/本番環境へ資材をデプロイするデプロイ時のオペミス対策
SSHを介してファイルのコピー、サーバの再起動などを行えるためデプロイ用のツールとしても使用できます。
開発環境を構築する
リポジトリからAnsibleの設定ファイルを各開発PCに取り込み、開発PCの仮想環境などに対してAnsibleを実行すれば開発環境の構築が容易になります。
「俺のPCだと動くよ」問題の解決
WindowsとAnsible
Ansible1.7(現在の最新バージョンは2.0)から、Windowの操作を行えるようになっています。
WindowsにはSSHサーバが備わって居ないため、WinRMを使用して管理ホストからサーバの操作を行います。そのため、Linuxサーバを操作する時と違い、サーバ側(Windows)とAnsibleの管理ホスト両方にあらかじめ設定を加える必要があります。※Windows側の設定はWindos8, Windows2012未満の場合のみ設定必要です。
WindowsをAnsibleから操作する
※詳しい設定方法については、SoftwareDesign 2016 1月号のAnsible特集 をご覧ください(すぐ読みたい方がいれば貸します)。
まだまだ、Linuxサーバ用のモジュールには及びませんが、Windows用の操作モジュールも増えてきています。
基本的なファイル操作、URLからのファイルダウンロード、サービスの管理などをAnsibleの操作モジュールから行えます。
また、scriptモジュールを使用すればWindowsのPowerShellを叩くこともできるので、かなりの範囲の設定を行うことができます。UI Automation PowerShell Extensionなどと組み合わせて使用すれば、GUI操作を自動化することも可能です。
WindowsをAnsibleから操作してできること
今回のオチ
現状ではWindowsをそのまま管理ホスト(操作を行う側)として扱うことはできません。
CygwinなどのUnixライクな環境をWindowsにインストールし、その上でAnsibleを動かすことは可能なようですが、情報をみていると苦労を伴うこともあるようです。
Windowsを管理ホストPCとして使用しながら、構成管理ツールを導入する必要がある場合は、Ansible以外の構成管理ツールも視野に入れて検討してください。
WindowsをAnsible管理ホストにする
安心してください、VMに Linux入れれば大丈夫ですよ
ご静聴ありがとうございました