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

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

一点問題があって、yum で http 経由の場合、なぜか “found available, installed or updated” エラーが発生するので ignore_errors を追加しています。
次のような感じのとき、パッケージは正しくエラーになります。

- name: install packages
  yum: name="https://packages.exameple.com/{{ item }}.el7.x86_64.rpm" state=present
  with_items:
    - foo-1.1.1-1
    - bar-1.2.1-1
  ignore_errors: yes

こんな感じで無事 Ansible 1.9 から、2.0 へアップグレードすることができました。

参考