对于 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
无论如何,这两个命令都会执行。这意味着当 Ansible 针对同一目标运行两次时,changed=2
结果摘要中仍会显示:
default : ok=41 changed=2 unreachable=0 failed=0
理想情况下,一切都应该ok
在第二次运行中进行。
虽然我猜测应该对update timezone
有某种依赖set timezone
,但我不太确定如何最好地实现这一点。
答案1
您可以使用register
和来实现这一点when changed
。
通过使用登记命令的结果copy
被保存到一个变量中。然后可以利用这个变量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
handler
但您也可以通过为dpkg-reconfigure
命令创建如这里所述:
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
答案2
您只需为剧本注册一个变量copy
,然后检查它是否具有changed
。
例如:
- name: make a file
copy: ...
register: whatever
- name: run a command
command: ...
when: whatever.changed
答案3
根据所使用的 Ubuntu 版本,使用 systemd 功能也可能有用:
- name: Set timezone
command: timedatectl set-timezone Europe/Berlin
changed_when: false
答案4
要在 Ubuntu 上使用 Ansible(>=1.6)设置时区,请使用命令locale_gen
。
- name: set timezone
locale_gen: name=Europe/Berlin state=present
注意:locale_gen
是当前随 Ansible 附带的附加模块。它可能在未来版本中将被删除。