仅当发生更改时才执行复制和设置

仅当发生更改时才执行复制和设置

对于 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 附带的附加模块。它可能在未来版本中将被删除。

相关内容