Originally published at: https://www.cyberciti.biz/faq/ansible-apt-update-all-packages-on-ubuntu-debian-linux/
I have a bunch of servers powered by Ubuntu and Debian Linux. How do I update all of them using the apt module of Ansible? How can I use Ansible for system updates and reboot the box when kernel upgrades took place?
Great playbook. Anyone else getting error on the reboot check module? I’m receiving below:
TASK [Reboot the box if kernel updated] ***************************************************************************************************** fatal: [landscape]: FAILED! => {"msg": "The conditional check 'reboot_required_file.stat.exist' failed. The error was: error while evaluating conditional (reboot_required_file.stat.exist): 'dict object' has no attribute 'exist'\n\nThe error appears to be in '/etc/ansible/update_ubuntu.yaml': line 15, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Reboot the box if kernel updated\n ^ here\n"} fatal: [miab]: FAILED! => {"msg": "The conditional check 'reboot_required_file.stat.exist' failed. The error was: error while evaluating conditional (reboot_required_file.stat.exist): 'dict object' has no attribute 'exist'\n\nThe error appears to be in '/etc/ansible/update_ubuntu.yaml': line 15, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Reboot the box if kernel updated\n ^ here\n"} fatal: [librenms]: FAILED! => {"msg": "The conditional check 'reboot_required_file.stat.exist' failed. The error was: error while evaluating conditional (reboot_required_file.stat.exist): 'dict object' has no attribute 'exist'\n\nThe error appears to be in '/etc/ansible/update_ubuntu.yaml': line 15, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Reboot the box if kernel updated\n ^ here\n"} fatal: [nakivo]: FAILED! => {"msg": "The conditional check 'reboot_required_file.stat.exist' failed. The error was: error while evaluating conditional (reboot_required_file.stat.exist): 'dict object' has no attribute 'exist'\n\nThe error appears to be in '/etc/ansible/update_ubuntu.yaml': line 15, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Reboot the box if kernel updated\n ^ here\n"}
Post your ansible version:
ansible --version
You need at ansible version 2.7 or above to work with reboot module.
ansible 2.9.1
config file = /etc/ansible/ansible.cfg
configured module search path = [u’/root/.ansible/plugins/modules’, u’/usr/share/ansible/plugins/modules’]
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
Seems like version is correct. Try running in dry mode (--dry-run
) and use debugger Debugging tasks — Ansible Documentation. I tested that playbook and it worked perfectly.
What is the proper syntax for the dry run command? I’ve tried below but get unrecognized command error:
ansible-playbook --dry-run update_ubuntu.yaml
Here are the instructions for the test (dry-run)
https://docs.ansible.com/ansible/latest/user_guide/playbooks_checkmode.html
So the right syntax is:
ansible-playbook update_ubuntu.yaml --check
Ok, playbook is running and failed on reboot task. I don’t know how to proceed on the debug question:
TASK [Reboot the box if kernel updated] *****************************************************************************************************
fatal: [landscape]: FAILED! => {“msg”: “The conditional check ‘reboot_required_file.stat.exist’ failed. The error was: error while evaluating conditional (reboot_required_file.stat.exist): ‘dict object’ has no attribute ‘exist’\n\nThe error appears to be in ‘/etc/ansible/update_ubuntu.yaml’: line 15, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: Reboot the box if kernel updated\n ^ here\n”}
[landscape] TASK: Reboot the box if kernel updated (debug)>
Can you post the whole update_ubuntu.yaml here please.
- hosts: ubuntu_servers
become: true
become_user: root
tasks:
- name: Update apt repo and cache on all Debian/Ubuntu boxes
apt: update_cache=yes force_apt_get=yes cache_valid_time=3600
- name: Upgrade all packages on servers
apt: upgrade=dist force_apt_get=yes
- name: Check if a reboot is needed on all servers
register: reboot_required_file
stat: path=/var/run/reboot-required get_md5=no
- name: Reboot the box if kernel updated
reboot:
msg: "Reboot initiated by Ansible for kernel updates"
connect_timeout: 5
reboot_timeout: 300
pre_reboot_delay: 0
post_reboot_delay: 30
test_command: uptime
when: reboot_required_file.stat.exist
Can you please try the following.
- name: Reboot the box if kernel updated
reboot:
msg: "Reboot initiated by Ansible for kernel updates"
connect_timeout: 5
reboot_timeout: 300
pre_reboot_delay: 0
post_reboot_delay: 30
test_command: uptime
when: reboot_required_file.stat.exist == true
When this is not working you can try.
- name: Reboot the server
command: /sbin/reboot
when: reboot_required_file.stat.exists == true
My apologies, just getting back to this. Looks like that did the trick. I did get error on first code, but it seems to have rebooted some of the servers anyway. I put in the second code in place of and didn’t get any errors, but none of the servers needed a reboot, so I’ll have to wait a bit until there are some new updates to confirm.
Thanks!