Ansible 2.0 にアップグレードした
Ansible 2.0 がようやくリリースされましたね。さっそく、既存の Playbook をアップグレードしてみました。公式の移行ガイドは、こちらにあります。
まず、実行してみると、次のような警告が表示されました。
[DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is 'sudo' (default). This feature will be removed in a future release. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
今まで、実行ユーザを指定するとき sudo と sudo_user を使っていましたが、1.9 の頃にはすでに become / become_user になっていたので、sudo / sudo_user から、例えば centos というユーザで実行したいとき、次のように置き換える必要があります。
become: yes become_user: centos
Ansible 2.0 では、数多くのモジュールが追加されていますが、この中で AWS ELB に SSL 証明書を追加するためのモジュール iam_cert を手動で組み込んでいましたが、これも自分のリポジトリからは削除することができてさっぱりしました。
AWS S3 モジュールをけっこう使っていますが、この中で mode=list というバケットの一覧表示するモードが追加されたのは便利です。ローカルファイルをまとめて同期するための mode=sync もほしいところです。余裕があったらフィードバックしてみたいと思います。
1.9 では、lookup(‘file’) に不具合があって実質使えない状態になっていましたが、2.0 になって無事直って使えるようになりました。
公式移行ガイドにあったエスケープ問題に遭遇しました。僕の場合は、Supervisor の設定ファイルを生成しているところで問題がありました。
具体的には、次のように Supervisor の設定ファイルを生成していました。
# supervisor.yml - name: Configure program ini_file: dest={{ supervisor.config.dir }}/{{ program_name }}.ini section=program:{{ program_name }} option={{ item.option }} value={{ item.value }} owner=root group=supervisor mode=0644 notify: - reload supervisord with_items: - { option: "command", value: "\"{{ program_command }}\"" }
使う側は、次のような感じです。
- name: install supervisor configuration - foo include: supervisor.yml vars: program_command: "foo bar"
1.9 のときは、この状態だと、program_command = foo bar という内容で出力されていましたが、2.0 になると program_command = “foo bar” という内容で出力されて Supervisor が動作しませんでした。
次のように書き換えました。
# supervisor.yml - name: Configure program ini_file: dest={{ supervisor.config.dir }}/{{ program_name }}.ini section=program:{{ program_name }} option={{ item.option }} value={{ item.value }} owner=root group=supervisor mode=0644 notify: - reload supervisord with_items: - { option: "command", value: "{{ program_command }}" }
使う側も次のように書き換えました。
- name: install supervisor configuration - foo include: supervisor.yml vars: program_command: foo "bar"
これで、program_command = foo “bar” と出力されて、Supervisor が無事動かすことができました。エスケープまわりは、2.0 になると要注意なところの1つです。
あと、ある playbook から相対パスで他の playbook を include していて template を include 側で指定している場合、include 元からの相対パスを指定しないといけなくなりました。
例えば、次のような Datadog agent の設定ファイルを生成している task conf.yml があります。
# roles/datadog/tasks/conf.yml - name: copy agent configuration - {{ name }} template: src={{ template }}.yaml.j2 dest=/etc/dd-agent/conf.d/{{ name }}.yaml mode=0640 owner=dd-agent group=root notify: - restart datadog-agent tags: datadog
これを別の playbook から、次のように読み込んでいます。
# roles/foo/tasks/main.yml - name: install datadog-agent - postfix include: ../datadog/tasks/conf.yml vars: name: postfix template: postfix
1.9 のときは、このときは、roles/datadog/templates/postfix.yaml.j2 が conf.yml で参照されますが、2.0 では正しく参照されませんでした。次のように書き換える必要があります。(この変更が一番個人的には大きかったです)
# roles/foo/tasks/main.yml - name: install datadog-agent - postfix include: ../datadog/tasks/conf.yml vars: name: postfix template: ../datadog/templates/postfix
あと、うれしい点としては、今まで name に次のように変数で書いた場合、出力内容に変数名のまま出力されていましたが、2.0 になって変数は正しく展開されて表示されるようになりました。
- name: set javactl_heap by {{ ansible_ec2_instance_type }} - {{ app_name }}
最後に human_log.py という Ansible の出力結果を見やすくするプラグインを愛用していますが、2.0 になってプラグイン API の仕様が変更されて動作しなくなりました。human_log.py は、実際にはいくつか不具合が直っているこちらのものを使っています。
human_log.py を使うと、次のように出力が見やすくなるので、おすすめのプラグインです。
TASK: [command echo "TEST"] *************************************************** changed: [127.0.0.1] => {"changed": true, "cmd": ["echo", "TEST"], "delta": "0:00:00.067706", "end": "2016-01-19 17:50:37.486635", "rc": 0, "start": "2016-01-19 17:50:37.418929", "stderr": "", "stdout": "TEST", "warnings": []} cmd: echo TEST start: 2016-01-25 07:50:37.418929 end: 2016-01-25 07:50:37.486635 delta: 0:00:00.067706 stdout: TEST
Ansible 2.0 プラグインの変更点はドキュメントで見つからなかったので、ソースコードを参照してみました。
human_log.py を Ansible 2.0 に対応したバージョンは、こちらにおいておきました。
human_log.py は、次のようにインストールします。CentOS 7 で Ansible 1.9 の RPM をインストールした上で、pip install -U ansible している環境上が前提になります。
$ wget -N \ https://raw.githubusercontent.com/n0ts/ansible-human_log/master/human_log.py \ -P /usr/share/ansible_plugins/callback_plugins/ $ sudo sed -i 's/#library = \/usr\/share\/my_modules\//library = \/usr\/share\/ansible\/modules/g' /etc/ansible/ansible.cfg
こんな感じで無事 Ansible 1.9 から、2.0 へアップグレードすることができました。
参考