Ansibleの場合、タイムゾーンを設定し、(Ubuntu)ベースシステムの設定を入力する役割があります。
- name: set timezone
copy: content='Europe/Berlin'
dest=/etc/timezone
owner=root
group=root
mode=0644
backup=yes
- name: update timezone
command: dpkg-reconfigure --frontend noninteractive tzdata
これら2つのコマンドは、何があっても実行されます。これは、同じターゲットに対してAnsibleを2回実行しても、結果の概要にchanged=2
が表示されることを意味します。
default : ok=41 changed=2 unreachable=0 failed=0
理想的には、2回目の実行ではすべてがok
である必要があります。
私はupdate timezone
がset timezone
に何らかの依存関係を持っているはずだと思いますが、これを実現する最善の方法がよくわかりません。
これは、register
およびwhen changed
を使用して行うことができます。
register を使用すると、copy
コマンドの結果が変数に保存されます。次に、この変数を使用して、update timezoneタスクでwhen
条件を作成できます。
また、タイムゾーンコンテンツの最後に改行\n
を必ず追加してください それ以外の場合、Ansibleは常にコピーを実行します 。
- name: set timezone
copy: content='Europe/Berlin\n'
dest=/etc/timezone
owner=root
group=root
mode=0644
backup=yes
register: timezone
- name: update timezone
command: dpkg-reconfigure --frontend noninteractive tzdata
when: timezone.changed
ただし、dpkg-reconfigure
コマンド用にhandler
を作成することでこの問題を解決することもできます ここで説明 :
tasks:
- name: Set timezone variables
copy: content='Europe/Berlin\n'
dest=/etc/timezone
owner=root
group=root
mode=0644
backup=yes
notify:
- update timezone
handlers:
- name: update timezone
command: dpkg-reconfigure --frontend noninteractive tzdata
copy
プレイ用の変数を登録し、changed
があるかどうかを確認するだけです。
例えば:
- name: make a file
copy: ...
register: whatever
- name: run a command
command: ...
when: whatever.changed
Systemd機能を使用して使用されているUbuntuのバージョンによっては、次の情報も役立つ場合があります。
- name: Set timezone
command: timedatectl set-timezone Europe/Berlin
changed_when: false
UbuntuでタイムゾーンをAnsible(> = 1.6)に設定するには、locale_gen
コマンドを使用します。
- name: set timezone
locale_gen: name=Europe/Berlin state=present
注:locale_gen
は、現在Ansibleに同梱されている追加モジュールです。 may将来のバージョンで削除される予定です。