This is an old revision of the document!
Table of Contents
Test the First Ubuntu VM on Ansible
In this step we will test the basic connectivity to our new server.
Test SSH Access
- Log in to your host machine and become the user
ansible
- Option 1 - ssh to your host machine as the user
ansible
- Option 2 - log in as usual and run
su - ansible
- SSH to the IP address of the new server
ssh <ip_address>
- The IP address is displayed on the VM's console screen when it starts up
- Another option is to look at your router's DHCP clients list
- Yet another another option is nmap
- The login succeeds without entering a password (you do need accept the fingerprint to add to the list of known hosts)
- Will use the user
ansible
to manage the server
Test Ansible to the New Server
Create the Inventory File
- Become user ansible (i.e.,
su - ansible
) - Create a simple inventory file named hosts in the ansible user's home directory
- Put the VM's IP address in the file, following the template below
[servers] <ip_address_of_VM>
- Confirm the inventory by listing it to the screen
ansible -i hosts all --list-hosts
Confirm the Server is Up
Still as user ansible, run some ad hoc commands to test:
ansible -i hosts all -m ping
ansible -i hosts servers -m ping
ansible -i hosts servers -a “sudo /sbin/reboot”
Update Ubuntu
Next we will use a playbook to update the software packages on the new server.
- update_servers.yml
--- - hosts: 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.exists
Run the playbook: ansible-playbook -i hosts update_servers.yml
Disable DNS Stub Resolver
Even though each node receives its DNS information via DHCP, Ubuntu 22.04 will at times fail to resolve names. Rebooting solves the problem temporarily, but it will come back. The following playbook will disable the DNS Stub listener to prevent the problem.
- disable_dns_stub.yml
--- - name: Disable DNS stub listener hosts: servers remote_user: ansible become: true tasks: - name: Disable DNS stub listener ini_file: dest=/etc/systemd/resolved.conf section=Resolve option=DNSStubListener value=no backup=yes tags: configuration - name: Restart NetworkManager systemd: name: NetworkManager state: restarted - name: Restart systemd-resolved systemd: name: systemd-resolved state: restarted - name: daemon-reload systemd: daemon_reload: true
Run the playbook: ansible-playbook -i hosts disable-dns-stub.yml
Next Step
Congratulations on your first VM deployed using Ansible on Virtualbox! Move on to the next where we Delete the first Ubuntu VM using Ansible.
Or, back to Deploy Ubuntu unattended install to Oracle Virtualbox using Ansible
Optional
Here is an example of a playbook to reboot the servers in the group [servers].
- reboot_servers.yml
--- - name: Reboot servers hosts: servers remote_user: ansible become: true tasks: - name: Reboot the box reboot: msg: "Reboot initiated by Ansible" connect_timeout: 5 reboot_timeout: 300 pre_reboot_delay: 0 post_reboot_delay: 30 test_command: uptime - name: Check if server is up ping:
What do you think this playbook will do? Open the VM's console and watch what happens when you run ansible-playbook -i hosts reboot_servers.yml
. When does the reboot task complete?
What if you had 5 servers to reboot, but you want to be sure they reboot one after another. How would you do it?
What if you wanted to reboot all the servers simultaneously? How does the following playbook accomplish that?
- reboot_simulaneous.yml
--- - hosts: servers become: true tasks: - name: Reboot servers reboot: post_reboot_delay: 30 handlers: - name: Fail if a server doesn't come back online wait_for: host={{ item }} port: 22 delay: 10 timeout: 180 failed: msg: "Server {{ item }} failed to come back online after reboot." retries: 3 delay: 10 loop: "{{ groups['servers'] }}" groups: servers: - server1.example.com - server2.example.com - server3.example.com # ... Include the remaining 7 server names ... - server10.example.com