Ansible Advent Calendar 2013 のネタとして書こうとした残骸があったので、書いてみる。 Ansible は task の実行結果を register という設定で変数に保存できます。 rc でコマンドの exit code に、stdout / stderr で標準出力/標準エラーにアクセスできます。
# mod_passenger.so のインストールされているべきパスを取得する
- name: get mod_passenger.so path
shell: /opt/ruby-{{ ruby_version }}/bin/passenger-install-apache2-module --snippet | grep passenger_module | awk '{print $3}'
register: mod_passenger_path
changed_when: False
# 先の結果を利用して mod_passenger.so の存在確認を行う
- name: check mod_passenger.so installed
command: test -f {{ mod_passenger_path.stdout }}
register: mod_passenger_installed
failed_when: mod_passenger_installed.rc not in [0, 1]
changed_when: False
# mod_passenger.so がまだ存在しなかったら build する
- name: build mod_passenger.so
environment:
PATH: "/opt/apache_{{ httpd_version }}/bin/:/bin:/usr/bin:/usr/local/bin"
command: >
/opt/ruby-{{ ruby_version }}/bin/passenger-install-apache2-module
--apxs2-path /opt/apache_{{ httpd_version }}/bin/apxs --auto
creates={{ mod_passenger_path.stdout }}
when: mod_passenger_installed.rc == 1
# httpd.conf に書く passenger の設定を取得する
- name: get passenger snippet
command: >
/opt/ruby-{{ ruby_version }}/bin/passenger-install-apache2-module
--snippet
changed_when: False
register: passenger_snippet
# template で先の snippet を使う
- name: httpd.conf
template: >
src=httpd.conf.j2
dest=/opt/apache_{{ httpd_version }}/conf/httpd.conf
owner=root group=root mode=0644
notify: restart httpd
httpd.conf.j2 の中で次の様に register で保存した値を使うことができます。
{{ passenger_snippet.stdout }}
{% if passenger_snippet.stdout %}
PassengerPoolIdleTime 1200
PassengerMaxPoolSize 5
#PassengerPreStart http://localhost/
{% endif %}
changed_when: False
はコマンドが exit code = 0 で終了すると changed として扱われて、「えっなんか変更された?」ってちょっとビビるのを回避するためです。 failed_when: mod_passenger_installed.rc not in [0, 1]
は test コマンドでファイルが存在しなかった場合に failed として扱われて「ドキッ」としないためです。ignore_errors: True
としても赤字で表示されちゃうので。