オライリーの「初めてのAnsible」を読んでます。
- 作者: Lorin Hochstein,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/04/16
- メディア: 大型本
- この商品を含むブログ (2件) を見る
途中からプレイブックが複雑になって難しくなってくるのですが、基礎を整理したいので、ブログに書いてみます。
Ansibleとは何か
私が整理した限り、Ansibleは以下のような事を実現するツールとして知られています。
- デプロイメントツール
- オーケストレーションツール
- プロビジョニングツール
- 構成管理ツール
最も重要な点として、手作業で打ち込んでいたLinuxコマンドを自動化するための、デプロイメントツールとしての側面があげられます。AnsibleはYAML形式で管理するため、サーバの構築をまるで設定ファイルのように扱う事ができます。これは凄い便利!
オーケストレーションツールとしては、Ansibleは複数台のサーバを扱うことができます。本書いわく、数千台のサーバを管理している実績もあるようです。
私が最も感銘をうけたのは、Ansibleの冪等性(べきとうせい)です。冪等性によって、何回実行してもサーバの状態は維持されます。これはプレイブック内で実行しようとしているコマンドが、既に実行済み(適応済み)であれば何もしないという判断を、Ansibleが行ってくれているからです。
つまり、初回だけ実行する必要がある手順書のコマンドを、何回も実行されることをAnsibleが防いでくれるのです。
Andsibleの単純なサンプル
初めてのAnsible、第二章(ch02/playbooks)のサンプルが、良い事例となるでしょう。
https://github.com/ansiblebook/ansiblebook
Vagrantfile
Ansibleによるサーバ構築を適用するためのテストサーバです。
VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "ubuntu/trusty64" config.vm.network "forwarded_port", guest: 80, host: 8080 config.vm.network "forwarded_port", guest: 443, host: 8443 end
ansible.cfg
主にサーバへのSSH接続設定を記述しています。各種サーバを横断した共通設定のファイルです。
[defaults] inventory = hosts remote_user = vagrant private_key_file = .vagrant/machines/default/virtualbox/private_key host_key_checking = False
hosts
Ansibleを実行する対象サーバを記述しています。
[webservers] testserver ansible_host=127.0.0.1 ansible_port=2222
web-notls.yml
tasks内に書いてあるコマンドを実行していき、サーバを構築します
--- - name: Configure webserver with nginx hosts: webservers become: True tasks: - name: install nginx apt: name=nginx update_cache=yes - name: copy nginx config file copy: src=files/nginx.conf dest=/etc/nginx/sites-available/default - name: enable configuration file: > dest=/etc/nginx/sites-enabled/default src=/etc/nginx/sites-available/default state=link - name: copy index.html template: src=templates/index.html.j2 dest=/usr/share/nginx/html/index.html mode=0644 - name: restart nginx service: name=nginx state=restarted
最低限として「Ansibleの実行によって構築されるサーバ」「構築するサーバの一覧とSSHの接続設定」「実行するタスク」の3つがあれば良いわけですね。
実行してみる
ansible-playbook web-notls.yml
で実行します。
タスクの実行結果に「ok」と「changed」があります。「ok」は実行する必要がなかったため、実行しなかったコマンドです。「changed」は、コマンドの実行によってサーバの状態が変更されたことを意味します。
PLAY [Configure webserver with nginx] ****************************************************************** TASK [Gathering Facts] ********************************************************************************* ok: [testserver] TASK [install nginx] *********************************************************************************** changed: [testserver] TASK [copy nginx config file] ************************************************************************** changed: [testserver] TASK [enable configuration] **************************************************************************** ok: [testserver] TASK [copy index.html] ********************************************************************************* changed: [testserver] TASK [restart nginx] *********************************************************************************** changed: [testserver] PLAY RECAP ********************************************************************************************* testserver : ok=6 changed=4 unreachable=0 failed=0
要点をまとめてみる
詳しい解説は本書に譲りますが、要点だけを要約します。
- 予め起動してあるサーバに対して「ansible.cfg」や「hosts」に書いてある接続設定を読み取り、SSH接続を行なう。
- SSH接続でログインしたサーバ内で、プレイブックに書かれたコマンドを実行する。
- Ansibleには400を超えるモジュールがあり、aptやyumによるパッケージインストールや、apacheやnginxの設定ファイルの書き換えなどを行なうことができる。
さいごに
サーバ構築の自動化は以下のようなメリットがあります。
- サーバ構築の時間短縮
- 手作業の混入によるミスの発生の低減
- 作業手順書にコマンドを記載し忘れるなどの漏れを防止する
- サーバ環境の秘伝のタレ化を予防する
少し触っただけでも凄さを実感したので、これは活用しない手はなさそうですね。
補足
Vagrantでも自動構築できるし、Dockerでも自動構築できるし、Ansibleでも自動構築できるわけですが、うまく組み合わせるためのベストプラクティスを考える必要がありそうです。
サーバ(開発環境など)そのものはVagrantやDockerで構築して、細かい実行手順はAnsibleで構築するのが良いバランスになりそうですかね?