とりあえず、手元の Ansible 2.0.0.2 の “service” モジュール(service - Manage services. — Ansible Documentation)では、自動的には全く systemctl daemon-reload
をしてくれないので、Systemd の設定を書き換えた後に、勝手には反映してくれない。
2015 年の暮れくらいでも右記のようなやりとりが。まだ、特に Ansible 側に機能は無い模様。 ∥ make the system module call daemon-reload on systemctl control by oaken-source · Pull Request #2676 · ansible/ansible-modules-core
仕方がないので、下記のようなイディオムで対応します。SysV Init や Upstart では単純にハンドラで “service” に “restart” をさせますが、Systemd では二段構えのハンドラを使い、“daemon-reload“ をしてから “restart” をさせます。
- name: Restart Docker (systemd)
shell: systemctl daemon-reload
notify: Restart Docker
- name: Restart Docker
service: name=docker state=restarted
なお、Ansible では残念ながら、複文というか、一つのハンドラで二つ以上のモジュールは列挙して実行できないみたいなんだな(えー…)。 ∥ How do I write an Ansible handler with multiple tasks? - Stack Overflow
呼び方としては、以下のようになる。Docker サーバのストレージドライバとして、標準の aufs ではなく devicemapper を使わせる設定の、Upstart と Systemd 両対応。
## For SysV Init and Upstart
- lineinfile:
dest: "/etc/default/docker"
regexp: '^DOCKER_OPTS='
line: 'DOCKER_OPTS="--storage-driver=devicemapper"'
notify: "Restart Docker"
## For Systemd
- file:
dest: /etc/systemd/system/docker.service.d/
state: directory
mode: 0755
- copy:
content: |
[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --storage-driver=devicemapper
dest: /etc/systemd/system/docker.service.d/default-file.conf
mode: 0755
notify: "Restart Docker (systemd)"
- meta: flush_handlers
- name: “devicemapper” is being used for storage driver
shell: 'docker info 2>&1 | grep -q "Storage Driver: devicemapper"'
changed_when: false
では。