Using Ansible to update Linux distributions

If you haven’t looked at Ansible yet then I’d suggest either reviewing a book (see bottom of post) or heading over to the website and reading up on it.

Using ansible for mundane tasks makes life as a system administrator/engineer much more livable. Instead of typing the same commands repeatedly let an automation system do that. In this example: ansible is the tool.

First, you need a set of hosts. This is either a file (hosts in my case) or you could get the data from a directory. It is entirely up to you.

Second, you’ll need to write a playbook to work against.

Then you can run up your play to update your servers!

I created multiple groups to show you some of the options available and the example command lines will follow after the hosts file.

# my hosts file

# these 2 groups need a username and password, so you'll need
# to pass in the -k and -K flags to log in and use sudo
[ubuntu1404-password]
server3.geekandi.net
server4.geekandi.net

[ubuntu1204-password]
server1.geekandi.net
server2.geekandi.net

[centos7-password]
server21.geekandi.net
server22.geekandi.net

# create a host group of like systems
[linux-password:children]
ubuntu1404-password
ubuntu1204-password
centos7-password

# and set some variables for this group
[linux-password:vars]
ansible_ssh_user=mike

# these 2 groups use an ssh key to log into the server and
# do not require a password for sudo
[ubuntu1404-sshkey]
server13.geekandi.net
server14.geekandi.net

[ubuntu1204-sshkey]
server15.geekandi.net
server16.geekandi.net

[redhat7-sshkey]
server31.geekandi.net

[linux-sshkey:children]
ubuntu1404-sshkey
ubuntu1204-sshkey
redhat7-sshkey

[linux-sshkey:vars]
ansible_ssh_user=ansible
ansible_ssh_private_key_file=~/.ssh/ansible.pem
# run the play against the host group that requires a password
ansible-playbook -l ubuntu-password update-upgrade.yml -k -K
# run the play against the host group that uses ssh keys
ansible-playbook -l ubuntu-sshkey update-upgrade.yml

And here is the very simple playbook that does the heavy lifting.

---

- hosts: all
  sudo: yes
  tasks:
    # This task updates servers that use 'yum' and RPM packages
    # by looking for CentOS or RedHat as a distribution name. This
    # will may also pick up modern OracleLinux but OL has a lot of
    # different strings.
    - name: .rpm upgrade server
      yum: >
        update_cache=yes
        name=*
        state=latest
        update_cache=yes
      when: >
        ansible_distribution == 'CentOS'
        or
        ansible_distribution == 'RedHat'

    # This task updates servers that use 'apt' and DEB packages
    # by looking for Debian or Ubuntu as a distribution name.
    - name: .deb do dist-upgrade
      apt: >
        update_cache=yes
        cache_valid_time=1200
        upgrade=dist
      when: >
        ansible_distribution == 'Debian'
        or
        ansible_distribution == 'Ubuntu'

I’ll start adding more Ansible plays in the blog that will add some extra complexity.