added ansible section of the guide

This commit is contained in:
ahmza
2021-12-19 16:59:34 +00:00
parent 6ae44a02e9
commit f9e7af9635
@@ -182,7 +182,7 @@ thats totally optional.
### **Provision with** ***Ansible***
you want to **create an _Ansible_ control node** and that is as simple as
installing a package onto your machine. Ansible is built using python
installing a package onto your machine. _Ansible_ is built using python
which makes it easy to install as **we can use the python pip package
manger.** To check you have it installed do ```pip --version``` if
it's not installed do the following
@@ -198,8 +198,8 @@ it's not installed do the following
```pip install ansible```
Now that ansible is installed we can create a runbok that defines the
steps ansible needs to take on the remote machine to correctly
Now that _Ansible_ is installed we can create a runbok that defines the
steps _Ansible_ needs to take on the remote machine to correctly
provision it. This playbook is written in yaml so get ready to make
sure your indents are correct 😬
@@ -209,6 +209,155 @@ thing or two - which is fine however I encourage you to copy what I
have, read the [Docs](https://docs.ansible.com/ansible/latest/user_guide/index.html)
and make any changes you feel are necessary.
```yaml
> Check the [git repo](https://gitlab.com/AHMZA/pi-docker-swarm-ansible-deploy/-/tree/main) for the most up to date yaml file im using.
**Create the deploy.yml**
```yaml
---
- hosts: piCluster
become: yes
tasks:
- name: Auth local SSH Keys
ansible.posix.authorized_key:
user: <pi_user>
state: present
key: "{{ item }}"
with_file:
- /home/<local_user>/.ssh/id_rsa.pub
- ./pi_rsa.pub
- name: Copy SSH Pi Intercoms Private Key
copy:
src: ./pi_rsa
dest: /home/<pi_user>/.ssh/id_rsa
mode: '0600'
- name: Copy SSH Pi Intercoms Public Key
copy:
src: ./pi_rsa.pub
dest: /home/<pi_user>/.ssh/id_rsa.pub
mode: '0644'
- name: Check for any updates and install them
apt:
update_cache: true
upgrade: dist
- name: Install Required build dependencies
apt:
update_cache: true
pkg:
- python3
- python3-pip
- vim
- curl
- name: Check Docker is installed
shell: "docker --version"
register: docker_version
- name: check Docker compose is installed
shell: "docker-compose --version"
register: dc_version
- name: Download Docker script
command: curl -fsSL https://get.docker.com -o get-docker.sh
when: docker_version.stdout.find('Docker version')
- name: Run Docker install script
command: sudo sh get-docker.sh
when: docker_version.stdout.find('Docker version')
- name: Install docker compose
command: sudo pip3 -v install docker-compose
when: dc_version.stdout.find('docker-compose version')
- name: Enable docker service
service:
name: "{{ item }}"
enabled: true
state: started
loop:
- docker
- containerd
when: docker_version.stdout.find('Docker version')
- name: Add user to docker group
user:
name: <pi_user>
groups: docker
append: yes
when: docker_version.stdout.find('Docker version')
- name: wait for network on boot
command: raspi-config nonint do_boot_wait 0
- name: Reboot
reboot:
```
The steps this playbook takes are as follows:
1. Copy your SSH keys to the pi authorized_keys
2. Copy same Pi ssh key between the Pis for intercommunication
3. Check for and Install updates
4. Install any build dependancies
5. Check if Docker is Installed
6. Check if docker-compose is installed
* Check this because if they are already installed we can skip these steps and save time
7. Download the Docker Script
8. Install Docker from script
9. Install docker-compose (This will take a while on each pi so be patient, grab a coffee)
10. Enable the Docker service
11. Add user to Docker group
12. Change raspi config to wait for network before boot
13. Reboot
take some time to read through the playbook, read the docs and try to
understand whats going on. Change the usernames to your username.
Make the hosts file in the same directory as the deploy.yml
``` yaml
[piCluster]
10.10.10.20
10.10.10.21
10.10.10.22
```
* `[piCluster]` - specifies a group of hosts
* `10.10.10.xx` - specifies the Pis IP
heres the command to run the playbook.
`ansible-playbook -i hosts -kK deploy.yml -c paramiko`
* `ansible-playbook` - the command to run the playbook
* `-i hosts` - specifies the host/inventory file
* `-kK` - asks you for password for the SSH connection(-k) and the sudo password(-K)
* `deploy.yml` - the _Ansible_ playbook
* `-c paramiko` - Use the paramiko connection method, I found this works best with ssh keys
You can do so much with _Ansible_, for example mount network shares etc,
if you can do it in the cli you can do it in _Ansible_ !!
Now that the ansible script is done we can go ahead and actually
configure all the Pis into the cluster.
### **Creating/Joining the swarm **
Creating and joining the cluster is easy - It is a bit manual so this
is something you could impliment into the ansible playbook using
multiple host groups. Keep an eye out on the git repo as I may
implement this myself.
**Follow the steps below to create the swarm:**
1. ssh to the main swarm node, this will be the manager node.
2. run `docker swarm init`
* This will return a command and token. Make sure to copy this token to your clipboard
3. exit the main swarm node
4. ssh to one of the worker nodes
5. paste and run the copied command
6. do the same on the remaining worker nodes
You should now have a correctly configured cluster !!