When running a self-written Ansible playbook, I came across the following error:
TASK [DNS 18.04 - Delete symlink /etc/resolv.conf] **************************************************************************************
fatal: [target]: FAILED! => {"msg": "The conditional check 'resolvconf.stat.islnk == true' failed. The error was: error while evaluating conditional (resolvconf.stat.islnk == true): 'dict object' has no attribute 'islnk'\n\nThe error appears to be in '/srv/ansible/playbooks/allgemein/ubuntu1804-dns.yaml': line 13, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: DNS 18.04 - Delete symlink /etc/resolv.conf\n ^ here\n"}
The relevant part of the playbook first uses stat to find out whether or not /etc/resolv.conf exists. In the task after, /etc/resolv.conf is deleted if this is a symbolic link:
- name: DNS 18.04 - Check if /etc/resolv.conf exists
stat: path=/etc/resolv.conf
ignore_errors: true
register: resolvconf
- name: DNS 18.04 - Delete symlink /etc/resolv.conf
file: path=/etc/resolv.conf state=absent
when: resolvconf.stat.islnk == true
register: resolvconfdelete
This has worked well in the past, but since Ansible was upgraded (currently at 2.9.x) this doesn't seem to work anymore. Issue #24296 in Ansible's GitHub repository mentions this behaviour, too.
In this particular situation, the file actually does not exist on the target server:
root@target:~# stat /etc/resolv.conf
stat: cannot stat '/etc/resolv.conf': No such file or directory
Although this has (somehow) worked in a past Ansible version, Ansible now falls on its nose trying to see whether this file is a symbolic link (resolvconf.stat.islnk) because the file actually does not exist.
To fix this, make sure that the islnk check is only executed if the file exists:
- name: DNS 18.04 - Delete symlink /etc/resolv.conf
file: path=/etc/resolv.conf state=absent
when: resolvconf.stat.exists and resolvconf.stat.islnk == true
register: resolvconfdelete
The playbook now skipped this task:
TASK [DNS 18.04 - Delete symlink /etc/resolv.conf] **************************************************************************************
skipping: [target]
No comments yet.
AWS Android Ansible Apache Apple Atlassian BSD Backup Bash Bluecoat CMS Chef Cloud Coding Consul Containers CouchDB DB DNS Database Databases Docker ELK Elasticsearch Filebeat FreeBSD Galera Git GlusterFS Grafana Graphics HAProxy HTML Hacks Hardware Icinga Influx Internet Java KVM Kibana Kodi Kubernetes LVM LXC Linux Logstash Mac Macintosh Mail MariaDB Minio MongoDB Monitoring Multimedia MySQL NFS Nagios Network Nginx OSSEC OTRS Office OpenSearch PGSQL PHP Perl Personal PostgreSQL Postgres PowerDNS Proxmox Proxy Python Rancher Rant Redis Roundcube SSL Samba Seafile Security Shell SmartOS Solaris Surveillance Systemd TLS Tomcat Ubuntu Unix VMWare VMware Varnish Virtualization Windows Wireless Wordpress Wyse ZFS Zoneminder