Ansible/Yeti
From charlesreid1
Walkthrough of creating an Ansible playbook for yeti.
a) found pyenv playbook online. use this.
b) flailing with vagrant.
Contents
Setup
Before we start, we want to have the following:
- repository where our playbook will go (https://github.com/charlesreid1/dahak-yeti)
- Vagrantfile for running vagrant machines for testing our playbook
Vagrantfile
Here we give a Vagrantfile that will start three separate nodes. This is important to test yeti's ability to handle multiple machines.
Vagrantfile
:
VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # Use the same key for each machine config.ssh.insert_key = false config.vm.define "vagrant1" do |vagrant1| vagrant1.vm.box = "ubuntu/xenial64" vagrant1.vm.network "forwarded_port", guest: 80, host: 8877 vagrant1.vm.network "forwarded_port", guest: 443, host: 7443 end config.vm.define "vagrant2" do |vagrant2| vagrant2.vm.box = "ubuntu/xenial64" vagrant2.vm.network "forwarded_port", guest: 80, host: 8878 vagrant2.vm.network "forwarded_port", guest: 443, host: 7444 end config.vm.define "vagrant3" do |vagrant3| vagrant3.vm.box = "ubuntu/xenial64" vagrant3.vm.network "forwarded_port", guest: 80, host: 8879 vagrant3.vm.network "forwarded_port", guest: 443, host: 7445 end end
Also see Ansible/Vagrant.
Inventory file: hosts
Info for the inventory file (port numbers) can be obtained with:
vagrant ssh-config
The corresponding inventory file looks like this:
$ cat hosts [servers] v1 ansible_host=127.0.0.1 ansible_port=2222 v2 ansible_host=127.0.0.1 ansible_port=2201 v3 ansible_host=127.0.0.1 ansible_port=2202
Roles
Galaxy playbook: Python and pyenv install
The Linux Foundation IT org (lfit) on Github maintains an Ansible script for installing different versions of Python using pyenv or using a system python. We use this role to prepare yeti worker nodes.
Link to the Ansible playbook: https://github.com/lfit/ansible-roles-python-install.git
Tasks
The tasks defined by the lfit org in their ansible playbook can be shown by running the ansible-playbook
command with the --list-tasks
flag:
$ ansible-playbook --list-tasks playbook.yml [WARNING]: Unable to parse /etc/ansible/hosts as an inventory source [WARNING]: No inventory was parsed, only implicit localhost is available [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' [WARNING]: Could not match supplied host pattern, ignoring: servers playbook: playbook.yml play #1 (servers): prepare yeti worker nodes to run tasks TAGS: [] tasks: lfit.python-install : Include distro specific variables TAGS: [] lfit.python-install : Install Python TAGS: [] lfit.python-install : Install pyenv {{pyenv_version}} TAGS: [] lfit.python-install : Install Python {{python34_version}} TAGS: [] lfit.python-install : Install Python {{python35_version}} TAGS: [] lfit.python-install : Install Python {{python36_version}} TAGS: [] lfit.python-install : Set pyenv global TAGS: []
We can see the two major choices are, install pyenv, or install python.
Playbook
Provisioning Playbook: Pre-Install Python 2
We need to make sure that Python 2 is installed so that Ansible can do its thing and use the various modules.
Unfortunately, on Ubuntu Xenial, Python 2 is not available by default, so we need to shim it in before we do anything else.
We use two playbooks, a provision playbook provision.yml
(to be run once on each machine before running the main playbook) and a main playbook main.yml
.
The provision playbook needs to have a pre task, which we set up as follows:
$ cat provision.yml --- # - name: provision the yeti worker nodes and prepare them for Ansible hosts: servers gather_facts: no pre_tasks: - name: install python2 raw: sudo apt-get -y install python
Now we can apply this playbook to each of the nodes. This example shows applying it to three virtual boxes:
$ ansible-playbook -i hosts provision.yml _______________________________________________ < PLAY [provision the yeti worker nodes and prepare them for Ansible] > ----------------------------------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || ________________________ < TASK [install python2] > ------------------------ \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || changed: [v2] changed: [v3] changed: [v1] ____________ < PLAY RECAP > ------------ \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || v1 : ok=1 changed=1 unreachable=0 failed=0 v2 : ok=1 changed=1 unreachable=0 failed=0 v3 : ok=1 changed=1 unreachable=0 failed=0
Regular Playbook
The playbook
$ cat main.yml --- # - name: prepare yeti worker nodes to run tasks hosts: servers roles: - { role: lfit.python-install }
We can list each of the tasks available (as shown above):
$ ansible-playbook --list-tasks main.yml
Now we can run this playbook:
$ ansible-playbook -i hosts main.yml
Flags