如果文件已被修改,如何跳过任务

时间:2019-10-11 00:36:14

标签: ansible

我正在研究ansible-playbook,因为我对此很陌生。无论如何,在ansible剧本中,我修改了一个文件,当我重新运行该剧本时,我不想再次修改该文件。

- name: Check if the domain config.xml has been edited
  stat: path={{ domainshome }}/{{ domain_name }}/config/config.xml
  register: config

- name: Config.xml modified
  debug: msg="The Config.xml has been modified"
  when: config.changed

- name: Edit the config.xml - remove extra file-store bad tag
  shell: "sed -i '776,780d' {{ domainshome }}/{{ domain_name }}/config/config.xml"
  when: config.changed

当我第一次跑步时,它会跳过此步骤。

我需要执行此步骤一次,如果重新运行剧本,则跳过该步骤。

我正在尝试编写ansible-playbook,并且仅在首次执行配置文件时才从配置文件中删除条目,以便它可以运行jvm。

1 个答案:

答案 0 :(得分:0)

  

Q:“仅在首次执行时从配置文件中删除条目。”

A:可以使用shell模块的 creates 参数来确保仅对配置文件进行了一次编辑。例如

- name: Edit the config.xml - remove extra file-store bad tag
  shell: "sed -i '776,780d' {{ domainshome }}/{{ domain_name }}/config/config.xml"
  args:
    creates: "{{ domainshome }}/{{ domain_name }}/config/config.xml.lock"
- name: Create lock file
  file:
    state: touch
    path: "{{ domainshome }}/{{ domain_name }}/config/config.xml.lock"


笔记

  • 报价: creates: A filename, when it already exists, this step will not be run.
  • 根据需要调整锁文件的路径和名称
  • stat 模块仅返回有关文件的信息,而从不更改文件。在此任务中注册的变量 register: config 永远不会报告文件已更改。
  • file 模块和 state: touch 不是幂等的。引用: an existing file or directory will receive updated file access and modification times (similar to the way touch works from the command line)
  • 更好的解决方案是修改命令并与sed一起创建锁定文件。例如 {"sed -i ... && touch /path-to-lockfile/lockfile"