Ansible:仅在目标文件不存在时复制模板


47

我正在Ansible 1.6.6配置我的机器。

我的剧本中有一个模板任务,可通过Jinja2模板创建目标文件:

tasks:
    - template: src=somefile.j2 dest=/etc/somefile.conf

somefile.conf如果它已经存在,我不想替换。Ansible有可能吗?如果是这样,怎么办?

Answers:


61

您可以使用stat检查文件是否存在,然后仅在文件不存在时才使用模板。

tasks:
  - stat: path=/etc/somefile.conf
    register: st
  - template: src=somefile.j2 dest=/etc/somefile.conf
    when: not st.stat.exists

42

您可以只使用模板模块的force参数:

tasks:
    - template: src=somefile.j2 dest=/etc/somefile.conf force=no

或命名任务;-)

tasks:
    - name: Create file from template if it doesn't exist already.
      template: 
        src: somefile.j2
        dest:/etc/somefile.conf
        force: no

Ansible模板模块文档中:

强制:默认为是,当内容与源文件不同时,它将替换远程文件。如果否,则仅在目标不存在的情况下才传输文件。

使用其他答案stat是因为在写入后添加了force参数。


2
我的答案使用了stat,因为在提出问题时,模板没有可用的强制论点
Teftin

10

您可以首先检查目标文件是否存在,然后根据其结果输出做出决定。

tasks:
  - name: Check that the somefile.conf exists
    stat:
      path: /etc/somefile.conf
    register: stat_result

  - name: Copy the template, if it doesnt exist already
    template:
      src: somefile.j2
      dest: /etc/somefile.conf
    when: stat_result.stat.exists == False   

1
我喜欢这个答案,因为它把任务命名为:)
Asfand Qazi

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.