TT Lab
はじめる
学ぶ 学習パス コース

Ansible基礎

最初のプレイブックを書きチェックモードで回す

TT Labで続きを見る

目標

プレイブックでサーバーの望ましい状態を宣言し、実行前にチェックモードで影響範囲を確認できるようになります。

なぜ重要なのか

シェルスクリプトは「何をするか」を書きますが、プレイブックは「終わったときにどのような状態になっているべきか」を書きます。この違いのために、同じプレイブックを何回実行しても、結果が同じになります。その性質を生み出すのは、文法ではなくモジュールです。fileモジュールは、ディレクトリがすでにあれば何もせず、パーミッションだけが違えば、パーミッションだけを直します。逆に、command/shellは、今の状態を知らないので、常に変更したと報告します。そのため、「専用のモジュールがあるなら、シェルを使わない」という原則が、スタイルの好みではなく、正確性の問題になります。最後に、--check --diffは、本番サーバーに初めて手を付ける前の、最後の安全装置です。

ステップ

  1. /root/ans/play/site.ymlを作成してください。プレイは1つで、nameがあり、hostsはwebです。ansible-playbook -i /root/ans/inventory/hosts.ini --syntax-checkを通過する必要があります。
  2. fileモジュールで、/root/ans/artifacts/appディレクトリをパーミッション0755で作成するタスクを追加して、実行してください。
  3. copyモジュールで/root/ans/artifacts/app/app.confを作成してください。内容に、listen_port=8080とenv=labの2行が、それぞれ1行ずつ含まれている必要があります。このとき、envの値はハードコードせず、app_env変数に切り出して、デフォルト値をlabにしてください(ステップ6でこの値を変えてみます)。
  4. タスクを3つ以上にして、すべてのタスクにnameを付けてください。
  5. 設定を扱うタスクにconfigタグを付けて、--tags configで実行した出力を/root/ans/out/tags.txtに保存してください。
  6. プレイブックを--check --diff -e app_env=stageで実行し、出力を/root/ans/out/check.txtに保存してください。出力のdiffにはenv=stageが見えている必要がありますが、実際の/root/ans/artifacts/app/app.confは依然としてenv=labである必要があります。このステップでは、絶対に実際に適用しないでください。
  7. /opt/lab/fixtures/ansible/motd.seedを/root/ans/artifacts/motdにコピーしたあと、lineinfileで、Welcome=labhubとOwner=platform-teamになるように修正してください。Banner=unsetの行はそのままにしておく必要があり、Welcome=で始まる行は1つだけ残る必要があります。
  8. /opt/lab/fixtures/ansible/broken-play.ymlを/root/ans/play/fixed.ymlにコピーして、エラー4か所を修正し、実行してください。結果として、/root/ans/artifacts/fixed/report.txtにfixed by studentが含まれ、ハンドラーの定義とnotifyが生きている必要があります。

参考

プレイブックの骨組みを作って文法チェックを通過する

/root/ans/play/site.ymlを作成してください。プレイは1つで、nameがあり、hostsはwebです。ansible-playbook -i /root/ans/inventory/hosts.ini --syntax-checkを通過する必要があります。

プレイブックの最上位はリストです。各プレイにname、hosts、tasksを入れて、--syntax-checkで確認してください。

fileモジュールでディレクトリを作成する

fileモジュールで、/root/ans/artifacts/appディレクトリをパーミッション0755で作成するタスクを追加して、実行してください。

シェルコマンドの代わりに、fileモジュールを使ってください。stateの値と、modeの表記(引用符)を確認してください。

copyモジュールで設定ファイルを配置する

copyモジュールで/root/ans/artifacts/app/app.confを作成してください。内容に、listen_port=8080とenv=labの2行が、それぞれ1行ずつ含まれている必要があります。このとき、envの値はハードコードせず、app_env変数に切り出して、デフォルト値をlabにしてください(ステップ6でこの値を変えてみます)。

copyモジュールは、srcの代わりにcontentで、内容を直接渡すこともできます。複数行は、YAMLのブロックスカラーで書きます。環境の値は、あとで変えてみられるように、変数に切り出しておいてください。

すべてのタスクに名前を付ける

タスクを3つ以上にして、すべてのタスクにnameを付けてください。

タスクが3つ以上必要で、nameがないタスクが1つでもあってはいけません。

タグを付けて一部だけを実行する

設定を扱うタスクにconfigタグを付けて、--tags configで実行した出力を/root/ans/out/tags.txtに保存してください。

設定関連のタスクにtags: [config]を付けて、--tags configで実行してください。タグのないタスクも、必ず1つは残しておいてください。そうしないと、絞り込んだことが見えません。

1つ誤解しやすい点があります。--tagsで絞り込まれたタスクは、skippingと表示されません。出力からまったく消え、skipped=も0です。when:で絞り込まれたものとは異なります。そちらは、タスクが実行対象には入ったうえで条件に引っかかるので、痕跡が残ります。

チェックモードでプレビューする

プレイブックを--check --diff -e app_env=stageで実行し、出力を/root/ans/out/check.txtに保存してください。出力のdiffにはenv=stageが見えている必要がありますが、実際の/root/ans/artifacts/app/app.confは依然としてenv=labである必要があります。このステップでは、絶対に実際に適用しないでください。

--check --diffに、-eで別の値を渡してみてください。出力には変更される内容が見えますが、実際のファイルはそのままである必要があります。

既存ファイルの特定の行だけを変更する

/opt/lab/fixtures/ansible/motd.seedを/root/ans/artifacts/motdにコピーしたあと、lineinfileで、Welcome=labhubとOwner=platform-teamになるように修正してください。Banner=unsetの行はそのままにしておく必要があり、Welcome=で始まる行は1つだけ残る必要があります。

フィクスチャを/root/ans/artifacts/motdにコピーしたあと、lineinfileで修正してください。regexpで既存の行を見つけないと、行が増えてしまいます。

壊れたプレイブックを直す

/opt/lab/fixtures/ansible/broken-play.ymlを/root/ans/play/fixed.ymlにコピーして、エラー4か所を修正し、実行してください。結果として、/root/ans/artifacts/fixed/report.txtにfixed by studentが含まれ、ハンドラーの定義とnotifyが生きている必要があります。

モジュールの引数名が2つ、stateの値が1つ、最上位のキー名が1つ、間違っています。エラーメッセージがどの行を指しているかを見てください。