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)
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
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.