Ansible is one of the most popular server automation tool (other than Pulumi and Terraform), it's agentless and only need SSH access to run. It also can help you provision server or VM instances using cloud module. You can also provision vagrant/virtualbox/qemu/docker/lxc/containers inside an already running server using Ansible. Other competitor in this category includes Puppet and Chef but they both require an agent to be installed inside the nodes that want to be controlled. To install Ansible in Ubuntu, run:
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
You can put list of servers you want to control in /etc/ansible/hosts
or any other inventory file, something like this:
[DC01]
hostname.or.ip
[DC02]
hostname.or.ip
hostname.or.ip
[DC01:vars]
ansible_user=foo
ansible_pass=bar
# it's preferred to use ssh-keygen ssh-copy-id (passwordless login)
# and sudoers set to ALL=(ALL) NOPASSWD:ALL for the ansible user
# instead of hardcoding the username and password
If you put it on another file, you can use -i inventoryFileName to set the inventory file, also don't forget to check /etc/ansible/ansible.cfg default configs, for example you can set default inventory file to another file there.
Example for checking whether all server on DC02 up:
ansible DC02 -m ping
To run arbitary command on all server on DC01:
ansible DC01 -a "cat /etc/lsb-release"
# add -f N, to run N forks in parallel
To create a set of commands, we can create a playbook file (which contains one or more play, and has one or more tasks), which is just a yaml file that contains specific structure, something like this:
---
- name: make sure all tools installed # a play
hosts: DC01 # or all or "*" or localhost
become: yes # sudo
tasks:
- name: make sure micro installed # a task
apt: # a module
name: micro
state: latest
- name: make sure golang ppa added
ansible.builtin.apt_repository:
repo: deb http://ppa.launchpad.net/longsleep/golang-backports/ubuntu/ focal main
- name: make sure latest golang installed
apt: name=golang-1.18 state=present # absent to uninstall
- name: make sure docker gpg key installed
raw: 'curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o - > /usr/share/keyrings/docker-archive-keyring.gpg'
- name: make sure docker-ce repo added
ansible.builtin.apt_repository:
repo: 'deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu impish stable'
- name: make sure docker-ce installed
apt: name=docker-ce
That playbook, for example if you save it on playbooks/ensure-tools-installed.yml, you can run it using ansible-playbook playbooks/ensure-tools-installed.yml
How to know list of modules and what's their key-value options? visit this site https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html