このエントリーをはてなブックマークに追加

Ansible 1.5リリース

Ansibleの1.5がリリースされました。

1.5ではたくさんの変更があり、そのうちの一部だけでもこれだけあります。

  • ansible vaultによるパラメータの暗号化
  • ssh pipelineingによる高速化
  • 1.4から廃止予定で警告が出ていたwhen_XXX が完全に削除。かわりにwhenを使うこと。
  • only_if も廃止予定に。
  • ログを出さなくするno_logオプションの追加
  • git moduleにパラメータの追加(accept_hostkey, key_file, ssh_opts)
  • 各種moduleの追加

これらたくさんの変更のうち、今回の記事ではansible vault、sshpipelining、追加されたassert moduleについてご説明します。

ansible vault

パスワードやAPI keyなど秘密にしておきたい情報を使ってplaybookを書きたいことは多々あります。Chefにはdatabagを暗号化する機能があります。Ansibleに今回ansible vaultという機能が追加されました。

ansible-vaultコマンドを使い、vars_fileで指定しているファイルを暗号化します。

  • 暗号化ファイルを作成

    なにも無ければcreateで作成できます。

    % ansible-vault create vars.yml
    Vault password:
    Confirm Vault password:
    (ここでEDITORで定義されたエディタが開くので入力)
    
  • 暗号化

    • ansible-vault encrypt vars.yml

    とすると、平文のファイルを暗号化します。ちなみにansible-vaultで暗号化済みのファイルをもう一度暗号化するとちゃんと怒られますので安心してください。

  • 復号化

    • ansible-vault decrypt vars.yml

    でvars.ymlを復号できます。vars.ymlファイルそのものが置き換わる点に注意してください

  • 編集

    • ansible-vault edit vars.yml

    createの時と同じくエディタが立ち上がります。

  • パスワードの変更

    • ansible-vault rekey vars.yml

    パスワードを変更できます

これらのコマンドで暗号化しておいたファイルをこう使います。

---
- hosts: localhost
  vars_files:
      - vars.yml
  tasks:
    - debug: msg="{{ spam }}"

こうしておいて、実行時に--ask-vault-passをつけると、パスワードを聞いてきます。付けないと暗号化されてるとエラーが出ます。

% ansible-playbook -i ansible_hosts  vault.yml --ask-vault-pass
Vault password:

あるいは、以下のようにパスワードのファイルを指定することもできます。

% ansible-playbook -i ansible_hosts  vault.yml --vault-password-file ~/.ssh/pass.txt

-–vault-password-fileはansible-pullでも指定できますので、cronでansible-pullを起動している人には便利です。

vaultのドキュメントはここにあります。

ただ、このブログで言及されていますが、ansible vaultはまるごと暗号化します。そのため、例えば変数名でgrepしたり、ということができないわけです。

将来的には改善されていく可能性がありますが、現状ではこういう問題があるということを覚えておくといいかもしれません。

SSH Pipelining

ansibleはmoduleをスクリプトファイルとして書き出し、リモートに転送してから実行します。SSH Pipeliningはsshの実行回数と実際のファイル転送を少なくして実行を高速化します。(すいません、詳細まで追ってないです)

この効果はかなり高く、1分かかっていた実行時間が30秒になったりしています。

pipeliningは初期設定は無効化されていますが、以下のようにansible.cfgを設定すると有効化されます。

[defaults]
pipelining=True

警告

sudo使用時の注意

sudoを使用する場合リモート側の/etc/sudoersrequirettyを無効化しておく必要があります。

assert module

毎回のリリースで各種moduleが追加されていますが、今回個人的に一番良いんじゃないかと思ったのがこのassert moduleです。

assert moduleは以下のように使います。

  • assert: { that: "ansible_os_family != 'RedHat'" }

あるいは、複数チェックすることも可能です。

assert:
   that:
     - "'foo' in some_command_result.stdout"
     - "number_of_the_counting == 3"

実はこれはfail moduleにwhenをつけると同じことができるんですが、assertを使うと、より分かりやすく書けます。ただ、"that"が必要なのがちょっといけてない感じですね。あと、"で囲まなければならないところも。(つまり思ったよりもいけてなかったという)

ちなみに実行結果です。

_____________________________________________________
< TASK: assert that="ansible_os_family == \"Ubuntu\"" >
 -----------------------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

failed: [localhost] => {"assertion": "ansible_os_family == \"Ubuntu\"", "evaluated_to": false, "failed": true}

assertモジュールをうまく使うと、サーバーの状態をチェックするserverspecenvassertなどの別の仕組みが必要なくなるかもしれませんね。(ポート番号のチェックとかできるかどうかこれから調べます…)

まとめ

Ansible 1.5がリリースされ、そのうちの重要な機能のいくつかをご紹介しました。

なお、1.6のリリースでは、 $foo や ${foo} という形式でのパラメータ参照が完全に削除されることが予告されています。今から書くことに注意しましょう。