Ansibleの基礎を勉強しているのですが、初心者向けに内容を整理しました

オライリーの「初めてのAnsible」を読んでます。

初めてのAnsible

初めてのAnsible

途中からプレイブックが複雑になって難しくなってくるのですが、基礎を整理したいので、ブログに書いてみます。

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   

f:id:konosumi:20180218180433p:plain

要点をまとめてみる

詳しい解説は本書に譲りますが、要点だけを要約します。

  • 予め起動してあるサーバに対して「ansible.cfg」や「hosts」に書いてある接続設定を読み取り、SSH接続を行なう。
  • SSH接続でログインしたサーバ内で、プレイブックに書かれたコマンドを実行する。
  • Ansibleには400を超えるモジュールがあり、aptやyumによるパッケージインストールや、apacheやnginxの設定ファイルの書き換えなどを行なうことができる。

さいごに

サーバ構築の自動化は以下のようなメリットがあります。

  • サーバ構築の時間短縮
  • 手作業の混入によるミスの発生の低減
  • 作業手順書にコマンドを記載し忘れるなどの漏れを防止する
  • サーバ環境の秘伝のタレ化を予防する

少し触っただけでも凄さを実感したので、これは活用しない手はなさそうですね。

補足

Vagrantでも自動構築できるし、Dockerでも自動構築できるし、Ansibleでも自動構築できるわけですが、うまく組み合わせるためのベストプラクティスを考える必要がありそうです。

サーバ(開発環境など)そのものはVagrantやDockerで構築して、細かい実行手順はAnsibleで構築するのが良いバランスになりそうですかね?

www.konosumi.net

www.konosumi.net