我正在研究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。
答案 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 -i ... && touch /path-to-lockfile/lockfile"
。