How to check if a file exists in Ansible?

后端 未结 11 1855
旧巷少年郎
旧巷少年郎 2020-12-23 02:35

I have to check whether a file exists in /etc/. If the file exists then I have to skip the task. Here is the code I am using:

- name: checking th         


        
11条回答
  •  南笙
    南笙 (楼主)
    2020-12-23 03:03

    I find it can be annoying and error prone to do a lot of these .stat.exists type checks. For example they require extra care to get check mode (--check) working.

    Many answers here suggest

    • get and register
    • apply when register expression is true

    However, sometimes this is a code smell so always look for better ways to use Ansible, specifically there are many advantages to using the correct module. e.g.

    - name: install ntpdate
      package:
        name: ntpdate
    

    or

    - file:
        path: /etc/file.txt
        owner: root
        group: root
        mode: 0644
    

    But when it is not possible use one module, also investigate if you can register and check the result of a previous task. e.g.

    # jmeter_version: 4.0 
    - name: Download Jmeter archive
      get_url:
        url: "http://archive.apache.org/dist/jmeter/binaries/apache-jmeter-{{ jmeter_version }}.tgz"
        dest: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}.tgz"
        checksum: sha512:eee7d68bd1f7e7b269fabaf8f09821697165518b112a979a25c5f128c4de8ca6ad12d3b20cd9380a2b53ca52762b4c4979e564a8c2ff37196692fbd217f1e343
      register: download_result
    
    - name: Extract apache-jmeter
      unarchive:
        src: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}.tgz"
        dest: "/opt/jmeter/"
        remote_src: yes
        creates: "/opt/jmeter/apache-jmeter-{{ jmeter_version }}"
      when: download_result.state == 'file'
    

    Note the when: but also the creates: so --check doesn't error out

    I mention this because often these less-than-ideal practices come in pairs i.e. no apt/yum package so we have to 1) download and 2) unzip

    Hope this helps

提交回复
热议问题