【Ansible入門】Playbookで変数を使い効率化を図ってみましょう

AWS運用自動化サービス「Cloud Automator」

こんにちは、CI部の柿﨑です。
10/16(水)より、beatmania IIDX 27 HEROIC VERSE が稼働し始めました。
最近は1日1クレを日課にしておりまして、5年のブランクを経て皆伝取得を目指しております。(以前は中伝でした。)
どの分野にも限らず、資格の取得には日々の積み重ねが大事だと思っている今日この頃です。

今回は、前回のAnsible入門の続きを題材にしていこうと思います。
Playbook内で変数を使うことで可読性や保守性を高めていきましょうというのが、主題となります。

本記事の対象者

  • 前回のAWS環境を準備できる方
  • AWS環境にてサクッとAnsibleに触りたい方

本記事のコンセプト

  • なるべくシンプルに
  • 最低限使えるディレクトリ構成でAnsibleの動作を理解する

前提条件

  • 前回の前提条件を満たしつつ、前回同様の環境を準備する
    ※AnsibleサーバーでAnsibleを使えればおk!

目次

  1. 変数を使ってみよう
  2. Playbookのタスクを効率的に書いてみよう
  3. Playbookを暗号化してみよう
  4. さいごに

1.変数を使ってみよう

前回のPlaybookでは、tasks/main.ymlファイルを以下のように(一部抜粋)記載していました。

簡単に書くと各パラメーターをそのまま記載していますね。
Playbookの構文がこれだけならまだ良いですが、実案件で使っていくとコードが膨らんでいくものです。
こんなときにパラメーターを変数化しておくことで、コードを管理しやすくしてくれます。
※お急ぎの方用ですが、最終系は以下のコードになります。そうでない方はパスしてください。

では早速、変数を使えるようにPlaybookを修正していきましょう。
※今回、tasks/main.ymlファイル内のsshd_configは触りません。

  1. Ansibleサーバーにec2-userでSSH接続
  2. 前回のPlaybookがある場合はcd ~/hands-on-01を実行
    Playbookがない場合は、以下の手順を実行
  3. 変数格納用のdefaults/main.ymlファイルを作成

    以下の内容で保存

  4. tasks/main.ymlを変数が使えるように修正

    以下の内容で保存

  5. Playbookを実行し、SSH接続

上記手順を実行した先で、以下の状態を確認できればおkです。
※ホスト名がClient01でなく、Clinet01だったらごめんなさい。このブログ更新前のhands-on-01が間違ってました。(Gitコード修正済み)

ひとつずつ説明いたします。

まず、tasks/main.ymlファイルですが、パラメーターを変数化するときは以下の形になります。
※passwordのところだけやや違いますが、そこは公式ドキュメントに記載があります。

変数名をなるべく分かりやすい名称にして、各パラメーターを置き換えていけばおkです!
また、以下の項目を追加しました。

前者はのちの手順で説明します。
後者の変数に関しては次のdefaults/main.ymlファイルと一緒に説明します。

次にdefaults/main.ymlファイルですが、tasks/main.ymlファイルで指定されている変数と変数の値が記載されております。

このdefaultsディレクトリをhands-onロール配下に作成することで、当該ロールで使用される変数のデフォルト値を定義することができます。
これと似た機能を持つvarsディレクトリというものがあり、どちらも変数を定義することができます。
今回はガッツリAnsibleを触る段階ではありませんので、変数の上書きが容易にできて扱いやすいdefaultsディレクトリを使う方がベターだと考えておkです。

ここでお気づきの方もいるかもしれないですが、defaults/main.ymlファイルに"{{ inventory_hostname }}"のパラメーターが記載されていません。
しかし、Client01サーバーのホスト名がClient01に設定されていました。
これは何かといいますと、マジック変数と呼ばれる機能になります。
こちらに分かりやすく記載されています。
以下画像の赤丸部分の値を引っ張ってきたわけですね!ありがとうAnsible。わざわざ変数のパラメーターを書く必要がありませんので、とても楽ですね♪

2.Playbookのタスクを効率的に書いてみよう

ここまでで変数を使えるようになりました。
ただし、このままの状態でOSのユーザーをいくつも作ってくれえ!
と、頼まれたらどうするのでしょうか。
タスクをコピペして以下のようにしてみたりするかもしれません。

こうするとdefaults/main.ymlファイルも変数のパラメーターを記述していかないといけません。
想像するだけでもしんどいですよね。
そこでwith_itemsと呼ばれるものを使ってみます。

with_itemsをざっくり説明すると、リスト型や辞書型などのパラメーターの数だけタスク処理をループしてくれるものです。
つまり1つのタスクだけ準備して、パラメーターを複数設定すればおkです。
早速、作成するユーザーを3つに増やして書いてみましょう!

  1. tasks/main.ymlファイルにwith_itemsを追記

    以下の内容で保存
  2. defaults/main.ymlファイルの変数の書き方を修正

    以下の内容で保存
  3. Playbookを実行し、SSH接続、ユーザー確認

こちらもひとつずつ説明していきます。

今回はwith_itemsのパラメーターを変数化していますので、その前提で説明します。
tasks/main.ymlファイルとdefaults/main.ymlファイルの関係は以下の画像のとおりです。
with_itemsuserモジュールと同じインデントになっていることに注意してください。
これはuserモジュールの機能でないことを意味しています。
もし共通の設定があるようでしたら、そこだけwith_itemsとは別の変数として定義すれば、defaults/main.ymlファイルのハッシュの数が減ります。

ではここで、user-ikaだけ削除してみましょう。

  1. defaults/main.ymlファイルを変更

    以下の内容で保存

    # ikastate:remove:の値だけ変更しています。
    ※ここのために今回のハンズオンにてremove:を追加しました。
    詳しくはこちらのremoveの説明を参照ください。
  2. Playbookを実行し、SSH接続確認、ユーザー確認

このようにして1つのタスクで複数のユーザーを同時に作成したり、特定のユーザーだけ削除したりということができました!

3.Playbookを暗号化してみよう

最後はPlaybookを暗号化してみましょう!

ときに平文で載せたくない情報もあると思われます。
例えば、OSユーザーのパスワードですね。
主な暗号化のパターンとしては、Playbookのファイル内全てを暗号化するもの、
ファイル内の一部を暗号化するものの2パターンになります。
今回はファイル内の一部を暗号化するansible-vault encrypt_stringを使っていきます。

  1. パラメーターを暗号化する

    以下の文字列が出力されるため、Encryption successfulの上の行までコピー
  2. defaults/main.ymlファイルを変更する

    以下のように前の手順でコピーした値で、# hands-onpassword:を上書きする

     
  3. Playbookを実行

    エラーがなければ完了

実行結果には以下のように暗号化されていたパラメーターが平文で出力されてしまいます。
ここからの情報流出には注意が必要ですね!

ansible-vault encrypt_stringで暗号化するときは、以下のような構文となります。
ansible-vault encrypt_string '暗号化する値' --name '変数名'
このようにピンポイントで暗号化をしておくと、暗号化されたファイルをいちいち複合化して編集、という手間が減ります。
そして、Playbookが暗号化されている場合は、ansible-playbookコマンドに--ask-vault-passオプションを付与する必要があることにもご注意ください。
オプションなしで実行しますと、当然のようにエラーになるだけですので大きな問題はないです。

ほかにも方法はございますが、今回はおまけ程度ということでサラッと暗号化に触れてみました。

さいごに

今回の内容だけでも、それなりにAnsibleを触れるようになると思われます。
ここからは、複数台のサーバーを管理するイメージを持ちつつ、Playbookをどのように書けば効率的か、保守性が高いかを意識していくことで、
オレ流のベストプラクティスが生まれてくるものと思います。
私もまだまだ知らないことばかりですので、ここはこうした方がいいよ!などの情報がありましたら、教えていただけますとうれしいです。

本記事が、皆様のお役に立てれば幸いでございます。
AWS運用自動化サービス「Cloud Automator」