2019年10月に発売された「Ansible 実践ガイド 第3版」を読んだ.実は今年の頭に「第2版」を購入していて,読もう読もうと積読をしていたら「第3版」が発売されたため,すぐに買い直して積読の優先順位を入れ替えた.個人的にプロダクション環境だと Chef の経験が長く,Ansible の経験が少ないこともあり,体系的に知識を整理しておこうという目的で読んだ.
読んだ感想としては,Ansible 初学者を中心に「Ansible で実現できることを知る」ことに適した良い本だと思う.Ansible の基礎から応用(徹底活用)まで幅広く学べる.逆に言うと,仕様を網羅したリファレンス本ではないし,ステップバイステップに写経をしながら試す本でもなく「どう読むと効果的なのか?」は気になるところ.今回は検証環境を Vagrant と Amazon EC2 に構築し,本書をリファレンスのように読みながら,知らなかった機能が出てきたら,実際にプレイブックを実装して試した.試しながら読み進めたことにより,学習効率は高かったと思う.
目次
- 第1章 : Ansible の概要
- 第2章 : Ansible の基礎
- 第3章 : プレイブックとインベントリ
- 第4章 : アプリケーションデプロイメント - Orchestration
- 第5章 : システムの構成管理 - Configuration Management
- 第6章 : ブートストラッピング - Bootstrapping
- 第7章 : Ansible の徹底活用
- 第8章 : 組織で実践する自動化
以下のサイトに正誤表は公開されているけど,特に報告はされていなさそうだった.実際に読むと数点誤植があるため,記事の最後にメモ程度に残しておく.
with_items
と loop
第3章「プレイブックとインベントリ」では,基本的なプレイブックの構文を学べる.その中に loop
の解説があり,前から使える with_items
との差を理解できてなく,実際に試しながら理解を整理した.loop
は Ansible 2.5 で追加された構文で,ドキュメントを読むと「推奨 (recommend)」と書いてある.ただし,まだ完全に with_
の置き換えになるわけではなく,用途次第であるとも書かれている.
まず,本書を参考に以下のプレイブックを実装した.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_items
と loop
の差も解説されていた.簡単に言うと,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" }
serial
と max_fail_percentage
第4章「アプリケーションデプロイメント」では,HAProxy / PHP / MariaDB / Keepalived などを組み合わせたフルスタックな WordPress 環境を Ansible で構築しながら,オーケストレーションに該当する Ansible の機能を学べる.管理するノード数が増えるため,Vagrant などを使って検証環境を作らないと,流し読みをして終わりになってしまう懸念もある.
その中に「nginx をローリングアップデートする」という内容がある.ノードにプレイブックを実行するときに,ミドルウェアの再起動を伴う場合などもあり,ロードバランサからノードを順番に切り離していく場面は多いと思う.ただし,デフォルトだと並列に実行されてしまうため,Ansible では serial
と max_fail_percentage
を使って,うまくローリングアップデートを実現できる.
まず,プレイブックに 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:
徹底活用
第7章「Ansible の徹底活用」は今後の参考になる実践的な内容だった.例えば,インベントリとプレイブックを管理するディレクトリ構成の紹介があったり,Ansible Galaxy の紹介もあった.
また,パフォーマンス改善として「ファクト収集を無効化」したり,「ファクトキャッシュを有効化」したり,ansible.cfg
で forks
パラメータを設定して並行数を上げたり,今まで知らなかったアプローチを知ることができた.実際に現場で使うときにもう1度読み直す.
誤植
- 第1章 P.22 :
Amazon Web Service
→Amazon 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 の機能で知らなかった部分を整理することができた