kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

今から Ansible に入門する初学者は読むべし /「Ansible 実践ガイド 第3版」を読んだ

2019年10月に発売された「Ansible 実践ガイド 第3版」を読んだ.実は今年の頭に「第2版」を購入していて,読もう読もうと積読をしていたら「第3版」が発売されたため,すぐに買い直して積読の優先順位を入れ替えた.個人的にプロダクション環境だと Chef の経験が長く,Ansible の経験が少ないこともあり,体系的に知識を整理しておこうという目的で読んだ.

読んだ感想としては,Ansible 初学者を中心に「Ansible で実現できることを知る」ことに適した良い本だと思う.Ansible の基礎から応用(徹底活用)まで幅広く学べる.逆に言うと,仕様を網羅したリファレンス本ではないし,ステップバイステップに写経をしながら試す本でもなく「どう読むと効果的なのか?」は気になるところ.今回は検証環境を Vagrant と Amazon EC2 に構築し,本書をリファレンスのように読みながら,知らなかった機能が出てきたら,実際にプレイブックを実装して試した.試しながら読み進めたことにより,学習効率は高かったと思う.

Ansible実践ガイド 第3版 (impress top gear)

Ansible実践ガイド 第3版 (impress top gear)

目次

  • 第1章 : Ansible の概要
  • 第2章 : Ansible の基礎
  • 第3章 : プレイブックとインベントリ
  • 第4章 : アプリケーションデプロイメント - Orchestration
  • 第5章 : システムの構成管理 - Configuration Management
  • 第6章 : ブートストラッピング - Bootstrapping
  • 第7章 : Ansible の徹底活用
  • 第8章 : 組織で実践する自動化

以下のサイトに正誤表は公開されているけど,特に報告はされていなさそうだった.実際に読むと数点誤植があるため,記事の最後にメモ程度に残しておく.

book.impress.co.jp

with_itemsloop

第3章「プレイブックとインベントリ」では,基本的なプレイブックの構文を学べる.その中に loop の解説があり,前から使える with_items との差を理解できてなく,実際に試しながら理解を整理した.loop は Ansible 2.5 で追加された構文で,ドキュメントを読むと「推奨 (recommend)」と書いてある.ただし,まだ完全に with_ の置き換えになるわけではなく,用途次第であるとも書かれている.

docs.ansible.com

まず,本書を参考に以下のプレイブックを実装した.loop の中にリスト(シーケンス)を実装し,{{ item }} で参照すると,順番に展開されて実行できる.今回は user モジュールを使って Linux にユーザーを3個追加する.

- hosts: all
  tasks:
    - name: Add users
      user:
        name: "{{ item }}"
        state: present
        groups: wheel
      loop:
        - kakakakakku1
        - kakakakakku2
        - kakakakakku3

実際に実行すると,正常に3個追加できた.なお,シーケンスに { name: 'kakakakakku1', groups: 'wheel' } のようなマッピングを設定し,{{ item.name }} とドット区切りにすると,複数の変数の値を展開することもできる.

$ getent passwd | grep kakakakakku | cut -d: -f1
kakakakakku1
kakakakakku2
kakakakakku3

なお,本書には with_itemsloop の差も解説されていた.簡単に言うと,with_items はシーケンスを flatten に展開し,loop は記載通りに展開する.変数の値を debug モジュールで標準出力する以下のプレイブックを実装した.シーケンスを変数にし,さらにリスト形式と文字列形式を混在させている.

- hosts: all
  vars:
    loop_test:
      - [kakakakakku1, kakakakakku2]
      - kakakakakku3
  tasks:
    - name: with_items
      debug:
        msg: "{{ item }}"
      with_items: "{{ loop_test }}"
    - name: loop
      debug:
        msg: "{{ item }}"
      loop: "{{ loop_test }}"

実際に実行すると,以下のようになる.with_items だと,リスト形式は無視されて,3回独立に実行されている.loop だと,2回実行されている.覚えておこう.

TASK [with_items] **************************************************************

ok: [localhost] => (item=kakakakakku1) => {
"msg": "kakakakakku1"
}

ok: [localhost] => (item=kakakakakku2) => {
"msg": "kakakakakku2"
}

ok: [localhost] => (item=kakakakakku3) => {
"msg": "kakakakakku3"
}

TASK [loop] ********************************************************************

ok: [localhost] => (item=[u'kakakakakku1', u'kakakakakku2']) => {
"msg": [
"kakakakakku1",
"kakakakakku2"
]
}

ok: [localhost] => (item=kakakakakku3) => {
"msg": "kakakakakku3"
}

serialmax_fail_percentage

第4章「アプリケーションデプロイメント」では,HAProxy / PHP / MariaDB / Keepalived などを組み合わせたフルスタックな WordPress 環境を Ansible で構築しながら,オーケストレーションに該当する Ansible の機能を学べる.管理するノード数が増えるため,Vagrant などを使って検証環境を作らないと,流し読みをして終わりになってしまう懸念もある.

その中に「nginx をローリングアップデートする」という内容がある.ノードにプレイブックを実行するときに,ミドルウェアの再起動を伴う場合などもあり,ロードバランサからノードを順番に切り離していく場面は多いと思う.ただし,デフォルトだと並列に実行されてしまうため,Ansible では serialmax_fail_percentage を使って,うまくローリングアップデートを実現できる.

docs.ansible.com

まず,プレイブックに serial を設定すると,任意の並行数を設定できる.例えば,以下のようにプレイブックを実装すると,1ノードごとにローリングアップデートとなる.

- name: Rolling Update
  hosts: apps
  serial: 1
  (中略)

ノード数が増えると,1ノードごとだとデプロイ時間が長時間化してしまう可能性もある.serial「割合 (%)」を設定することで,デプロイ時間を短縮しつつ,サービス影響のない範囲でローリングアップデートができる.

- name: Rolling Update
  hosts: apps
  serial: "30%"
  (中略)

さらに serial「並行数と割合 (%) を組み合わせたシーケンス」を設定することで,最初は1ノード,次に5ノード,残りを 20% ずつといったカナリア的なアップデートも実現できる.これは便利!

- name: Rolling Update
  hosts: apps
  serial:
  - 1
  - 5
  - "20%"
  (中略)

最後は max_fail_percentage で,プレイブックの実行を止める失敗率を定義することができる.ローリングアップデートによる全面障害を避けるためにも max_fail_percentage は設定しておくのが良さそう.

- name: Rolling Update
  hosts: apps
  serial: 1
  max_fail_percentage: 30
  (中略)

reboot モジュール

第5章「システムの構成管理」では,Linux と Windows の構成管理を学べる.その中に reboot モジュールの紹介があり,Ansible で再起動が必要なときに,SSH の接続を維持したまま再起動ができるようになる.Ansible 2.7 から使える機能となる.

- hosts: all
  tasks:
    - name: Reboot
      reboot:

docs.ansible.com

徹底活用

第7章「Ansible の徹底活用」は今後の参考になる実践的な内容だった.例えば,インベントリとプレイブックを管理するディレクトリ構成の紹介があったり,Ansible Galaxy の紹介もあった.

galaxy.ansible.com

また,パフォーマンス改善として「ファクト収集を無効化」したり,「ファクトキャッシュを有効化」したり,ansible.cfgforks パラメータを設定して並行数を上げたり,今まで知らなかったアプローチを知ることができた.実際に現場で使うときにもう1度読み直す.

誤植

  • 第1章 P.22 : Amazon Web ServiceAmazon Web Services
  • 第5章 P.202 : 疎結合しておくと疎結合にしておくと
  • 第7章 P.352 : ファクト収集ファクト取得 が表記揺れになっている

なお,誤植ではないけど「第4章」の基本構成で,PHP 実行環境として PHP 5.6 が前提になっている.PHP 5.6 は既に EOL になって1年となり,「第3版」として書き直すなら変えても良さそうだった(執筆の開始時期にもよるから判断は難しいけど).

まとめ

  • 「Ansible 実践ガイド 第3版」を読んだ
  • Ansible 初学者を中心に「Ansible で実現できることを知る」ことに適した1冊だった
  • ブログに載せた機能以外にも Ansible の機能で知らなかった部分を整理することができた

Ansible実践ガイド 第3版 (impress top gear)

Ansible実践ガイド 第3版 (impress top gear)