Commit 78c85514 authored by Thierry Fenasse's avatar Thierry Fenasse

ansible.cfg, playbook, role, etc pour installer un disque

parent 4657da48
...@@ -17,7 +17,6 @@ J'ai créé un dossier Ansible dans ~/Documents pour y mettre mes futurs borls A ...@@ -17,7 +17,6 @@ J'ai créé un dossier Ansible dans ~/Documents pour y mettre mes futurs borls A
``` ```
mkdir -p ~/Documents/Ansible && cd "$_" mkdir -p ~/Documents/Ansible && cd "$_"
``` ```
> $_ is a special parameter that holds the last argument of the previous command. The quote around $_ make sure it works even if the folder name contains spaces. ([source](https://unix.stackexchange.com/questions/125385/combined-mkdir-and-cd) ) > $_ is a special parameter that holds the last argument of the previous command. The quote around $_ make sure it works even if the folder name contains spaces. ([source](https://unix.stackexchange.com/questions/125385/combined-mkdir-and-cd) )
...@@ -109,7 +108,7 @@ ls -1 .env/bin/ansible* ...@@ -109,7 +108,7 @@ ls -1 .env/bin/ansible*
Ajouter un .gitignore Ajouter un .gitignore
-------------------- --------------------
Pour éviter de pousser des trucs inutiles vers le dépôt en ligne, un fichier `.gitignore` sera nécessaire. Il est possible d'en créer un avec, par exemple [Gitignore.io](https://www.gitignore.io/) ou le faire soi-même. Pour éviter de pousser des trucs inutiles vers le dépôt en ligne, un fichier `.gitignore` sera nécessaire. Il est possible d'en créer un avec, par exemple, [Gitignore.io](https://www.gitignore.io/) ou le faire soi-même.
``` ```
echo ".env" > .gitignore echo ".env" > .gitignore
...@@ -124,10 +123,133 @@ git commit -m "virtualenv, requirements et gitignore" ...@@ -124,10 +123,133 @@ git commit -m "virtualenv, requirements et gitignore"
git push -u origin master git push -u origin master
``` ```
La suite bientôt mais en attendant… Un tutoriel en anglais pour Ansible
-----------------------------------
Pour une découverte pas à pas voici [ansible-tuto](https://github.com/leucos/ansible-tuto) qui propose une introduction intéressante à condition de disposer de [virtualbox](https://www.virtualbox.org/) et 3 x 200Mb pour les trois VMs qui seront créées.
Mettre en place un labo
-----------------------
### Physique ###
Souhaitant voir ce que ça donne sur des machines physiques peu performantes, je vais utiliser 3 vieux machin de 2006.
* 1Gb de RAM
* 1 CPU Pentium D avec 2 cœurs
* 1 disque SATA de 80Gb
* 1 carte 100Mb (j'aurais quand même préféré des 1Gb mais bon)
### Virtuel ###
C'est au choix, sur Internet quelque part, sur un PC avec un peu de RAM et VirtualBox ou un autre outil de [virtualisation](https://fr.wikipedia.org/wiki/Virtualisation)
### Physique ou virtule ###
Il faudra y installer une distribution GNU/Linux comme Debian 9 ou autre avec le serveur openssh puisque c'est en utilisant [ssh](https://fr.wikipedia.org/wiki/Secure_Shell) qu'Ansible va se connecter et appliquer nos **recettes**.
Il y aura donc 3 ordinateurs sur lesquels se connecter avec `ssh` sur lesquels;
* se connecter sans mot de passe grâce à l'utilisation d'une paire de clés _(ssh-key-gen, ssh-copy-id)_,
* cette connection se fera avec un utilisateur faisant partie des sudoers _(adduser xxxx sudo)_,
* l'escalade des privilèges se fera sans mot de passe _(sudo su -> visudo -> NOPASSWD(ALL))_,
Inventaire ansible
------------------
Un fichiers devra contenir des informations sur les ordinateurs faisant partie l'**inventaire**.
Par exemple voici le contenu du fichier `hosts`.
```
[premier]
hpc01.home ansible_host=192.168.1.121 ansible_become=yes
[autres]
hpc02.home ansible_host=192.168.1.122 ansible_become=yes
hpc03.home ansible_host=192.168.1.123 ansible_become=yes
```
> ansible_become=yes voulant dire « devient root une fois connecté». Voir [la doc](https://docs.ansible.com/ansible/latest/user_guide/become.html)
Ce fichier `hosts` (qui pourrait s'appeler inventaire.txt ou autre) se trouve à la racine de notre projet.
```
ls -a -1
.
..
.env
.git
.gitignore
hosts
README.md
requirements.txt
```
Aller, faisons un premier test avec Ansible sur notre [premier] hôte.
```
.env/bin/ansible -i hosts -m shell -a 'uname -a' premier
hpc01.home | SUCCESS | rc=0 >>
Linux hpc01 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) x86_64 GNU/Linux
```
Et sur les deux [autres].
```
.env/bin/ansible -i hosts -m shell -a 'uname -a' autres
hpc03.home | SUCCESS | rc=0 >>
Linux hpc03 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Linux
hpc02.home | SUCCESS | rc=0 >>
Linux hpc02 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Linux
```
Ajouter un disque dur dans chaque machine
-----------------------------------------
Souhaitant peut-être parvenir à installer [GlusterFS](https://docs.gluster.org/en/latest/Quick-Start-Guide/Quickstart/) sur mon petit labo-pourri j'ai contaté qu'il ma faudrait un deuxième disque dans les machines.
* 1 second disque SATA de 500Gb sur chaque PC.
Un tutoriel en anglais Utiliser un playbook pour formater et monter ce nouveau disque
---------------------- --------------------------------------------------------------
Voici [ansible-tuto](https://github.com/leucos/ansible-tuto) qui propose une introduction intéressante à condition de disposer de [virtualbox](https://www.virtualbox.org/). Je me suis inspiré de [ansible-disk](https://github.com/AerisCloud/ansible-disk) pour pouvoir formater et monter ce disque comme demandé dans la doc de GlusterFS et réaliser les tâche suivantes, non pas à la main, mais avec Ansible.
```
mkfs.xfs -i size=512 /dev/sdb1
mkdir -p /data/brick1
echo '/dev/sdb1 /data/brick1 xfs defaults 1 2' >> /etc/fstab
mount -a && mount
```
Commencer tout de suite avec un dossier pour contenir les **playbooks**, les **roles** et les **group_vars** c'est pas nécessaire, mais c'est probablement ce vers quoi il faudra aller pour gérer une infrastructure informatique.
```
tree # voici le contenu de notre projet decouverte-ansible
.
├── ansible.cfg
├── group_vars
│   └── all
├── hosts
├── playbooks
│   └── disks.yml
├── README.md
├── requirements.txt
└── roles
└── disks
└── tasks
└── main.yml
5 directories, 7 files
```
Le contenu des fichiers listés ci-dessus devraient fonctionner et c'est ce qu'on verra en exécutant le playbook `disks.yml`.
```
.env/bin/ansible-playbook -i hosts playbooks/disks.yml
```
Et pour rappel, ma découverte d'Ansible est passée par [ce tutoriel]((https://github.com/leucos/ansible-tuto)).
[ssh_connection]
pipelining = True
scp_if_ssh = True
[defaults]
roles_path=./roles
retry_files_enabled = False
host_key_checking = False
# inventory/group_vars/all
# for disks setup
disk_additional_disks:
- disk: /dev/sdb
fstype: xfs
mount_options: defaults
mount: /data/brick1
user: root
group: root
disable_periodic_fsck: false
force: y
disk_package_use: apt
additional_fs_utils: xfsprogs
[premier]
hpc01.home ansible_host=192.168.1.121 ansible_become=yes
[autres]
hpc02.home ansible_host=192.168.1.122 ansible_become=yes
hpc03.home ansible_host=192.168.1.123 ansible_become=yes
---
# one time about disks
- hosts: all
pre_tasks:
- name: Update cache
apt: update_cache=yes cache_valid_time=3600
roles:
- disks
- name: "Install parted"
package:
name: parted
state: present
use: '{{ disk_package_use }}'
when: disk_additional_disks
tags: ['disk', 'pkgs']
- name: "Install additional fs progs"
package:
name: "{{ item }}"
state: present
with_items: "{{ additional_fs_utils|default([]) }}"
when: additional_fs_utils is defined
tags: ['disk', 'pkgs']
- name: "Get disk alignment for disks"
shell: |
if
[[ -e /sys/block/{{ item.disk | basename }}/queue/optimal_io_size && -e /sys/block/{{ item.disk | basename }}/alignment_offset && -e /sys/block/{{ item.disk | basename }}/queue/physical_block_size ]];
then
echo $[$(( ($(cat /sys/block/{{ item.disk | basename }}/queue/optimal_io_size) + $(cat /sys/block/{{ item.disk | basename }}/alignment_offset)) / $(cat /sys/block/{{ item.disk | basename }}/queue/physical_block_size) )) | 2048];
else
echo 2048;
fi
args:
creates: '{{ item.part | default(item.disk + "1") }}'
executable: '/bin/bash'
with_items: '{{ disk_additional_disks }}'
register: disk_offset
tags: ['disk']
- name: "Partition additional disks"
shell: |
if
[ -b {{ item.disk }} ]
then
[ -b {{ item.part | default(item.disk + "1") }} ] || parted -a optimal --script "{{ item.disk }}" mklabel gpt mkpart primary {{ disk_offset.stdout|default("2048") }}s 100% && sleep 5 && partprobe {{ item.disk }}; sleep 5
fi
args:
creates: '{{ item.part | default(item.disk + "1") }}'
executable: '/bin/bash'
with_items: '{{ disk_additional_disks }}'
tags: ['disk']
- name: "Create filesystem on the first partition"
filesystem:
dev: '{{ item.part | default(item.disk + "1") }}'
force: '{{ item.force|d(omit) }}'
fstype: '{{ item.fstype }}'
opts: '{{ item.fsopts|d(omit) }}'
with_items: '{{ disk_additional_disks }}'
tags: ['disk']
- name: "Disable periodic fsck on ext3 or ext4 formatted disks"
shell: tune2fs -c0 -i0 {{ item.part | default(item.disk + "1") }}
with_items: '{{ disk_additional_disks }}'
when: "disk_additional_disks and ( item.fstype == 'ext4' or item.fstype == 'ext3' ) and item.disable_periodic_fsck|default(false)|bool"
tags: ['disk']
- name: "Ensure the mount directory exists"
file:
path: '{{ item.mount }}'
owner: '{{ item.user | default("root") }}'
group: '{{ item.group | default("root") }}'
state: directory
with_items: '{{ disk_additional_disks }}'
tags: ['disk']
- name: "Get UUID for partition"
command: blkid -s UUID -o value {{ item.part | default(item.disk + "1") }}
register: disk_blkid
with_items: '{{ disk_additional_disks }}'
changed_when: False
tags: ['disk']
- name: "Mount additional disk"
mount:
name: '{{ item.0.mount }}'
fstype: '{{ item.0.fstype }}'
opts: '{{ item.0.mount_options|d(omit) }}'
passno: '0'
src: 'UUID={{ item.1.stdout }}'
state: '{{ item.0.mount_state|d("mounted") }}'
with_together:
- '{{ disk_additional_disks }}'
- '{{ disk_blkid.results }}'
tags: ['disk']
- name: "Ensure the permissions are set correctly"
file:
path: '{{ item.mount }}'
owner: '{{ item.user | default("root") }}'
group: '{{ item.group | default("root") }}'
state: directory
with_items: '{{ disk_additional_disks }}'
tags: ['disk']
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment