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、ssh pipelining、追加された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} という形式でのパラメータ参照が 完全に削除されることが予告されています。今から書くことに注意しましょう。

Comments

comments powered by Disqus