Compare commits

12 Commits

Author SHA1 Message Date
f5586981f1 fix typo 2023-09-19 13:52:57 +02:00
dbb2986a14 typo 2023-06-19 14:44:06 +02:00
aae4240ef5 rajout ligne de commande adhoc 2023-06-14 11:27:53 +02:00
9355940b55 typo 2023-06-06 15:05:11 +02:00
c70f9d523f typo 2022-11-15 16:24:12 +01:00
e0e3833aa6 typo 2022-11-15 15:55:01 +01:00
a86be86ac6 typo 2022-11-15 15:26:57 +01:00
013e55c843 simplification et rajout install git et vim 2022-11-15 15:20:14 +01:00
0a6c39884b solution blockinfile 2022-10-31 14:04:44 +01:00
d0d005e782 solution cron 2022-10-31 12:32:50 +01:00
c2d1a56fda typo 2022-10-31 12:18:28 +01:00
e46837c987 solutions 2022-10-27 14:29:15 +02:00

111
Readme.md
View File

@@ -1,67 +1,111 @@
# Commandes AdHoc
## Ligne de commande
## Lignes de commande:
```bash
ansible -o -m ping all -u root -k -K
```
1. identifier tous les éléments de cette ligne de commande
2. expliciter toutes les options utilisées
2. faire le lien entre option et directives de configuration (ansible.cfg)
3. si on omet l'option "-u root", avec quelle identité se fera la connexion ?
## Tâches d'administration système I
1. Lister sur le pad les tâches d'administration système que nous réalisons au quotidien, et que nous souhaiterions automatiser
2. Tenter, pour chaque tâche, d'identifier le(s) module(s) ansible que l'on pourra utiliser
1. et 2. -o (affichage sur 1 ligne) -m ping (choix du module) all (cible - référencé dans l'inventaire) -u root (identité de connexion) -k (authentification ssh par mot de passe) -K (élévation de privilèges avec demande du mot de passe)
3. -u <=> remote_user ; -k <=> ask_pass ; -K <=> become_ask_pass
4. soit avec la valeur de l'option remote_user (si définie), soit avec le compte qui lance la commande
## Tâches d'administration système II
### Télécharger des fichiers sur la cible avec get_url
## Télécharger des fichiers sur la cible avec get_url
Récupérer dans /tmp le fichier : https://starship.rs/install.sh
### Exécuter des scripts à distance avec command
```bash
ansible -o all -m get_url -a 'url=https://starship.rs/install.sh dest=/tmp mode=0700'
```
## Exécuter des scripts à distance avec command
Exécuter le script précédemment récupéré, uniquement si le fichier /usr/local/bin/starship n'existe pas déjà
### Déployer un fichier avec copy
```bash
ansible -o all -m command -a '/tmp/install.sh --yes creates="/usr/local/bin/starship"'
#ou, si on n'a pas pensé à rendre le fichier exécutable précédemment:
ansible -o all -m command -a 'sh /tmp/install.sh --yes creates="/usr/local/bin/starship"'
```
## Déployer un fichier avec copy
S'assurer de la présence du fichier /etc/profile.d/zstarship.sh avec le contenu suivant:
```bash
eval "$(/usr/local/bin/starship init bash)"
```
### Installer des packages avec git
S'assurer que les paquets _vim_ et _git_ soit installées sur les cibles.
Pour un contenu aussi léger, pas besoin d'avoir à maintenir un fichier local comme source, on va plutôt utiliser l'argument _content_:
### Cloner des dépôts avec git
```bash
ansible -o all -m copy -a 'content="eval \"$(/usr/local/bin/starship init bash)\"" dest=/etc/profile.d/zstarship.sh'
```
⚠️ aux quotes !
## S'assurer de la présende de git sur les cibles
```bash
ansible -o all -m package -a 'name=git state=present'
```
## Cloner des dépôts avec git
Cloner le dépôt https://infra.opendoor.fr/git/tom/vim_formation.git dans /opt/vim/
```bash
ansible -o all -m git -a "repo=https://infra.opendoor.fr/git/tom/vim_formation.git dest=/opt/vim"
```
### S'assurer de l'absence de fichier avec file
## S'assurer de la présende de vim sur les cibles
```bash
ansible -o all -m package -a 'name=vim state=present'
```
## S'assurer de l'absence de fichier avec file
Supprimer le fichier /etc/vimrc existant
### Gérer des liens symboliques, toujours avec file
```bash
ansible -o all -m file -a "path=/etc/vimrc state=absent"
```
## Gérer des liens symboliques, toujours avec file
Faire un lien symbolique /etc/vimrc vers /opt/vim/vimrc
### Modifier des fichiers avec lineinfile
```bash
ansible -o all -m file -a "path=/etc/vimrc state=link src=/opt/vim/vimrc"
```
## Modifier des fichiers avec lineinfile
dans /etc/vimrc, assurez-vous que la ligne 62 (qui commence par set list listchars...) soit _décommentée_
### Planifier l'exécution de la tâche "_Exécuter des scripts à distance avec command_" toutes les semaines le dimanche soir avec cron
```bash
ansible -o all -m lineinfile -a 'path=/etc/vimrc regex="^\"(set list listchars.*)" line=\1 backrefs=true'
#ou en recopiant la ligne entière
ansible -o all -m lineinfile -a 'path=/etc/vimrc regex="^\"set list listchars.*" line="set list listchars=nbsp:▶,tab:··,trail:¤,extends:▶,precedes:◀"'
```
Comment éviter que cette tâche soit programmée exactement à la même heure pour toutes les machines cibles ?
## Planifier l'exécution de la tâche "_Exécuter des scripts à distance avec command_" toutes les semaines le dimanche soir avec cron
### Rajouter des blocs de textes dans un fichier avec blockinfile
```bash
ansible all -o -m cron -a 'name="update starship" cron_file="starship" hour="12" minute="01" weekday="sun" job="sh /tmp/install.sh -y" user="root"'
```
```bash
# avec distribution horaire aléatoire ⚠️ principe d'indempotence non respecté
ansible all -o -m cron -a 'name="update starship" cron_file="starship" hour="12" minute="{{ 59 | random() }}" weekday="sun" job="sh /tmp/install.sh -y" user="root"'
```
```bash
# avec distribution horaire aléatoire principe d'indempotence respecté
ansible all -o -m cron -a 'name="update starship" cron_file="starship" hour="12" minute="{{ 59 | random(seed=inventory_hostname) }}" weekday="sun" job="sh /tmp/install.sh -y" user="root"'
```
## Rajouter des blocs de textes dans un fichier avec blockinfile
Rajouter dans ~/.ssh/config, sur la machine *pilote* les infos suivantes:
@@ -70,3 +114,10 @@ Host machinecible #cf variable inventory_hostname
User: formation
Port 22
```
```bash
ansible -o localhost all -u formation -m blockinfile -a 'path=/home/formation//.ssh/config block="Host {{ inventory_hostname }}\n\tPort 22" create=true marker="# {mark} ssh config for {{ inventory_hostname }}"'
```
⚠️ on travaile sur *localhost*, donc l'exemple n'est pas très pertinent