compound conditional at when clause using stat module not working.

Hello,

I am using the stat module to check if a file exist, if not, copy from src to destination. I also want to setup a flag in order to overwrite destination, to achieve this, i am using a conditional like the one on the when clause:

  • stat: path=/path/to/file
    register: nameoffile
  • copy: src=/home/user/source.tar.gz dest=/destination/path/file owner=root group=root
    when: flag_to_overwrite == true or (nameoffile.stat.isreg is undefined and nameoffile.stat.isreg == false)

In vars/main.yml:
flag_to_overwrite: true

If the destination does exist and flag_to_overwrite is set to true, when i run the playbook, ansible-playbook doesn’t show any error, but the file is not overwritten.

If i use only the variable flag_to_overwrite, the value it’s been evaluated and works ok (true copies the file, false does not do anything).
when: flag_to_overwrite == true

I have used:
when: flag_to_overwrite or (nameoffile.stat.isreg is undefined and nameoffile.stat.isreg == false)

when: (flag_to_overwrite == true) or (nameoffile.stat.isreg is undefined and nameoffile.stat.isreg == false)

but the compound conditional does not work.

Any hint?

Thanks in advance!

Ansible 1.7

Hi Adam, the logic you have there is the problem. “(nameoffile.stat.isreg is undefined and nameoffile.stat.isreg == false)” will never evaluate to true, as “isreg” cannot be both undefined and false. I think you want to change the and to an or, as follows (also simplified a little):

when: flag_to_overwrite or nameoffile.stat.isreg is undefined or not nameoffile.stat.isreg

Hope that helps!

Hello James,

nameoffile.stat.isreg is undefined and nameoffile.stat.isreg == false, evaluates to true when the file does not exists. I just deleted the target file, ran the playbook and this one copies the src to target. If the destination exists does not do anything.

I tried with the statement that you suggested:

flag_to_overwrite or nameoffile.stat.isreg is undefined or not nameoffile.stat.isreg

but also does not matter what value flag_to_overwrite has, if the destination exists, the src it isn’t copied.

The contents of vars/main.yml is:

Is the checksum of the file different when it exists? If not, the file will not be replaced.

Hello James,

No, the checksum of the file is the same when it exists.

i tried using:

  • stat: path=/path/to/file get_checksum=no get_md5=no

without success.

Thanks for your help!

Any other tip is welcome.

Adam