on peut code en INI [group1] web1.example.com web2.example.com
[group2]
web2.example.com
192.0.2.42
[group_couple:childen]
groupe1
groupe2
ou en yaml all: children: group_couple: children: group1: hots: web1.example.com: {} web2.example.com: {} group2: hosts: web2.example.com: {} 192.0.2.42: {}
yum ansible
inventory file: web1.example.com web2.example.com 192.0.2.42
si tu veux grouper, un nom avec _ : [group1] web1.example.com web2.example.com
[group2]
web2.example.com
192.0.2.42
tu peux faire des groupes de groupes: avec : [group_couple:childen] groupe1 groupe2
2 groupes particuliee all inclue every host in the inventoryun ungrouped unclue tout les hosts qui ne sont dans aucun groupe que all
on peut faire des ranges de hsts avec [start:end] example : 192.168.[4:7].[0:255] pour dire tous les ips de : 192.168.4.... 192.168.6.... 192.168.7.... 192.168.8.... 192.168.X.0 192.168.X.1 192.168.X.2 ...... 192.168.X.255
cela marche aussi avec des adress'es server[1:5].example.com
le fichier de config ansible est : /etc/ansible/ansible.cfg voir les valeurs par défaults (par exemple: inventory)
agentless,pas besoin de custom agent. c'est included.
sudo pour action admin ssh utilisé (config dans defaults section)
basis section [default] sets default for ansible operation [priviliege_escalation] configure how ansible performs privilege escalation on managed hosts
default =>
- remote_user : utilisateur utilisé sur la machine managé
- remote_port : specifié le port sshd utilisé sur la machine managé (défault 22)
- ask_pass : controle will prompt you for ssh password mais faut mieux key-based auth for ssh
priviliege_escalation =>
- become : boolean ??? (default is no)
- become_user : quel utilisateur sur la machine ansible sera celui qui donne privilege (défault is root)
- become_method : control comment ansible devient user (default sudo , mais ça pourrait être juste su)
- become_ask_pass mot de passe pour become_method (default is no)
typiquement le ansible.cfg file: [defaults] inventory = ./inventory remote_user = ansible ask_pass = false
[priviliege_escalation]
become = true
become_user = root
become_ask_pass = false
arborescence HOST-BASED CONNECTION VARIABLE :
- project
- ansible.cfg
- host_vars
- server1.example
- server2.exmple
- inventory
dans host_vars on peut spécifier des variables spécifique
- ansible_host: ip address or hostname utilise pour la connnexion
- ansible_port : specifie le ssh port pour ce host
- ansible_user : utilisateur utilisé pour ce host
- ansible_become : utilisateur utilise pour privilege excalation pour ce host
- ansible_become_method : specifie la method to use privilege escalation pour ce host (sudo ou su etc...)
exemple : host_vars/server1.exemple.com contient
#variable pour server1
ansible_host: 192.2.36.104
ansible_port: 34102
ansible_user: root
ansbile_become:false
- ssh key based auth
- specific account only for ansible use
il faut avoir un [default] section comme
[default]
inventory = ./inventory
sinon la location est celle par défaut : /etc/ansible/hosts
débute par ansible
tu dois spécifié host-pattern
-m pour les options que le module ansible doit lancer
-a pour les arguments obligatoire pour le module
cela donne : ansible host-pattern -m module -a %module argument% -i inventory
exemple de ad hoc commande : * ansible all -m ping * ansible -m user -a 'name=newbie uid=4000 state=present'
pour specifier un mdp , on utilise -k ou --ask-pass pour spécifier un user, on utilise -u remot_user pour enable privilege escalation , on utilise -b équivalent become:yes pour spécifier le mdp de l'escalation, on utilie le grand -K ou --ask-become-pass pour spécifier la méthode d'escalation, on utilise --become-method (défault = sudo)
cela donne le resultat du current inventory en YAML
donne un fichier json de l'inventory
cela permet de recherche le host recherche ansible web1.example.com --list-hosts
pour connection mdp
pour utiliser u user particulier
pour l"equivalend become=true
pour passer un password escalation
pour passer une methode autre que celle par défaut (sudo )
obtenir la liste des docs: * ansible-doc -l * ansible-doc -l | grep service
pour obtenir la doc précise (exemple : ping) :
* ansible-doc -m ping
* ansible-doc -m service
* ansible-doc -m user
obtenir les infos de base: * ansible --version
voir le fichier de config: cat ansible.cfg
voir l'inventory : cat inventory
commande ping limité: ansible all --limit web01 -i inventory -k -m ping cela te donne le ssh password cela te donne le ping de web01
restart le service sshd : ansible all -m service -a 'state=restart name=sshd'
creer un user : ansible webservers -m user -a 'name=test password=secure_password state=present' ansible all -m user -a 'name=test2 groups=dev,wheel append=yes state=present'
append=yes permet de garder les autres groups auquel il est rattaché, sinon ça garde que cette liste
verifier : ssh webservers tail /etc/passwd
on retrouve une ligne pour test
si on veut supprimer un user ansible webservers -m user -a 'name=test password=secure_password state=absent'
si on reverifie, il a disparu de la liste
- copy : copier un fichier de local vers host
- file : set permission à un fichier
- lineinfile: ajouter une ligne
- synchronize: utilisation de rsync (voir )
pour ajouter et controler module:
- yum : manager using YUM
- dnf : manager using DNF
- gem : manger ruby GEMS
system module ;
- firewalld : port et service qui
- reboot : reboot une machine
- service : manage service
- user : manage user
net tools module: get_url : download file nmcli : manage networking uri : interact with webservice and communicate APIs
ansible all -m package -a 'name=httpd state=present'
ansible webservers -m yum -a 'name=httpd state=present'
- command : run a single commande on remote system
- shell : run a a command on remote system's shell
- raw : à pas utiliser , ça lance une command sans process
exemple : * ansible myhost -m command -a /usr/bin/hostname * ansible localhost -m shell -a set
executer un playbook : ansible-playbook site.yml --limit wwebservers
valider un playbook : ansible-playbook --syntax-cheeck task.yml
tester un playbook (dry run): ansible-playbook -C tada.yml
une playbook commence toujours par --- qui donne le debut du fichier puis - name : dazdzadazdazdzadzadzadzad
---
- name: dadadaadada
hosts: all
become: true
tasks:
- name: User get created
user:
name: test
state: present
règle du nommage de variable
- que des lettre, chiffre et underscore
- pas de . ou $ ou d'espace ou -
- commence par une lettre
- separe mot par _
global :
- value for all hosts
- extra variable you set in the job templace
host :
- value for a particular host or groups
- variabe set for a host in inventory or host_vars directory
play:
-
value for a playbook
-
variable directive in a play, include_varstasks
- host: all vars: user_name: joe user_state: present - host: all vars_files: - vars/users.yml
- name: example
hosts: all
vars:
user_name: joe
tasks:
# this line will read : create a user joe
- name: create a user {{ user_name }}
user:
# this line will ceate the user named joe
name: "{{ user_name }}"
state: present
autres examples: - systemd : name: {{ service }}
ou
with_items:
- "{{ list }}"
group overide by host
can de déclared:
- in inventory
- in host_vars ou groups_vars
project groups_vars all back front host_vars demo.example.com demo2.example.com playbook.yml
- name: install packages
hosts: all
vars:
package:
- nmap
- httpd
- php
- mod_php
- mod_ssl
tasks:
- name: install software {{ packages }}
yum:
name: "{{ packages }}"
state: present
example avec user
vars:
users:
henry:
unanme: henry
fname: henry
lname: henry
home: /home/henry
shell: /bin/bash
joe:
unanme: joe
fname: joe
lname: joe
home: /home/joe
shell: /bin/bash
- return value vary for each module
- registrered variables are only stored in memory
-e for override extra variable
ansible-playbook -e "username=joe" example.yml
cela remplace la vars username avec joe
** utilise un objet
user:
name: "{{ users['henry']['uname'] }}"
comment: "{{ user }}"
state: present
si tu mets dans un fichier groups vars,
users:
henry:
unanme: henry
fname: henry
lname: henry
home: /home/henry
shell: /bin/bash
joe:
unanme: joe
fname: joe
lname: joe
home: /home/joe
shell: /bin/bash
il va prendre les variable automatiquement du playbook vers group_vars ou _host_vars
ENCRYPTED FILE:
- ansible-vault create filename
- ansible-vault view filename
- ansible-vault edit filename
encrypt existing file:
- ansible-vault encrypt filename
save avec --output=new_filename
decrypt file:
- ansible-vault decrypt filename
- ansible-playbook --vault-id @prompt filename
@prompt option will prompt the user for the ansible vault password, sinon cela retour une erreur cela va afficher le mdp à saisir
- ansible-vault encrypt filename --vault-id vars@prompt
avec playbook: ansible-playbook --vault-id vars@prompt --vault-id playbook@prompt site.yml
une mdp pour le fault , un autre mdp pour le playbook
cela va demander le mdp vault ansible-playbook --ask-vault-pass test.yml
ne pas avoir l'objet de sortie, pour pas afficher mdp
- name : adadadadad
debug:
msg: "{{ secret }}"
no_log: true
no_log: true
use loop
- name: loop user
hosts: all
vars:
mysusers:
- jeo
- barnabe
- carla
tasks:
- name: create user
user:
name: "{{ item }}"
state: present
loop: "{{ myusers }}"
create user in groups
---
- name: create user in appriopriate group
hosts: all
tasks:
- name: create groups
group:
name:"{{ item }}"
loop
- admin
- dev
- name: create user in groupz
user:
name: "{{ item.name }}"
groups: "{{ item.groups }}"
**with_dict**:
- { name: 'fred', groups: "admin,dev" }
- { name: 'henry', groups: "admin" }
- { name: 'seb', groups: "dev" }
ou pour les packages
- name: install packages
yum:
name: "{{ item }}"
state: present
loop:
- ngnix
- postgresql
- postgresql-server
when: condition
si la variable est define:
- name: test
hosts: all
vars:
myservice: httpd
tasks:
- name: "{{ myservice}} package is installed"
yum:
name: "{{ myservice }}"
when:
myservice is defined
- name: condition in
hosts: all
gather_facts: yes
become: yes
vars:
myservice: httpd
supported_os:
- RedHat
- Fedora
tasks:
- name: install "{{ myservice }}"
yum:
name: "{{ myservice }}"
state: present
when: ansible_facts['distribution'] in suported_os
on peut recuperer les facts de ansible pour récupere les distirbutions supported
il ya directement
- ansible_distribution "Fedora" ou "RedHat'
- ansible_distribution_version "7.5"
- ansible_kermel "3.10.0-327.el7.x86_64"
classique condition link:
- or
- and
-
( ) AND ( ( ) OR () )
- (
avec when : - condition1 - condition2
revient à faire un conditon1 AND condition2
on peut utilise item d'une loop
- name: test
hosts: all
tasks:
- name: get postfix
command: /usr/bin/systemctl is-active postfix
ignore_errors: yes
register: result
- name: restart apache httpd
service:
name: httpd
state: restarted
when result.rc == 0
groups:
when : "'database' in groups_name" cela fera que si on est dans le [database] group dans inventory
tasks:
- name: copy files
template:
src: /vars/file
dest: /etc/httpd/conf.d/file
notify:
- restart apache
- restart mysql
handlers:
- name: restart apache
service:
name: httpd
state: restart
- name: restart mysql
service:
name: mariadb
state: restart
cela se déclenche uniquement si ya un changed (couleur orange)
handlers:
- name: reboot system
reboot:
par exemple cela reboot juste db01 car c'est le seul à avoir changé
permet de mettre une condition sur un block d'action
- name: block exemple
hosts: all
tasks:
- name: two task in one block
block:
- name: installation
- name: creation
when: true
si le block fail, on execute la partie rescue
peut importe le resultat , on fait la tache définie dans le always
exemple:
block fait l'update databse rescue fait un revert database always fait le redemarrage
- name: use template
template: src=templates/ngnix.conf.j2 dest=/etc/ngnix/sites-available/demo mode=0664
---
- hosts: weberver
become: true
tasks:
- name: verify ngnix status
command: service ngnix status
- name: verify ngnix is not listening on port 80
wait_for: port=80 timeout=1 {state}
{state} valeurs possible stopped started => par défault, si tu met rien c'est ça
pour un load balancer drained
pour logger
- name : installation
debug:
msg: "installation en cours..."