Je fais beaucoup de critiques pour le code de quelqu'un d'autre dans Ansible et j'écris beaucoup moi-même. Au cours de l'analyse des erreurs (à la fois des inconnus et des nôtres), ainsi que d'un certain nombre d'entretiens, j'ai réalisé la principale erreur des utilisateurs d'Ansibl - ils grimpent dans une erreur difficile sans maîtriser la base.
Pour corriger cette injustice universelle, j'ai décidé d'écrire une introduction à Ansible pour ceux qui le connaissent déjà . Je vous préviens, ce n'est pas un récit de mana, c'est un long trajet dans lequel il y a beaucoup de lettres et pas d'images.
Le niveau attendu du lecteur - plusieurs milliers de lignes de yamla ont déjà été écrites, quelque chose est déjà en production, mais "en quelque sorte tout est de travers".
Des noms
L'erreur principale de l'utilisateur Ansible est de ne pas savoir ce qu'on appelle. Si vous ne connaissez pas les noms, vous ne pouvez pas comprendre ce qui est écrit dans la documentation. Un exemple vivant: lors d'une interview, une personne qui semblait déclarer avoir beaucoup écrit dans Ansible, n'a pas pu répondre à la question "en quoi consiste le livre de jeu?" Et quand j'ai suggéré que "la réponse était que le livre de jeu consiste en un jeu", le commentaire meurtrier "nous n'utilisons pas ceci" a suivi. Les gens écrivent dans Ansible pour de l'argent et n'utilisent pas le jeu. Ils l'utilisent réellement, mais ils ne savent pas ce que c'est.
Commençons donc par un simple: ce qui s’appelle. Peut-être que vous le savez, ou peut-être pas, parce que vous n’avez pas fait attention lorsque vous avez lu la documentation.
ansible-playbook lit un playbook. Playbook est un fichier yml / yaml avec quelque chose comme ça à l'intérieur:
---
- hosts: group1
roles:
- role1
- hosts: group2,group3
tasks:
- debug:
Nous avons déjà réalisé que tout ce fichier est un playbook. Nous pouvons montrer où sont les rôles, où sont les tâches. Mais où est le jeu? Et en quoi le jeu diffère-t-il du rôle ou du playbook?
La documentation a tout pour plaire. Et ils le manquent. Débutants - parce qu'il y en a trop et que vous ne vous souvenez pas de tout à la fois. Expérimenté - parce que «des choses triviales». Si vous êtes expérimenté, relisez ces pages au moins une fois tous les six mois et votre code deviendra une meilleure classe.
Alors, rappelez-vous: un playbook est une liste de jeux et import_playbook
.
Ceci est un jeu:
- hosts: group1
roles:
- role1
et c'est aussi une autre pièce:
- hosts: group2,group3
tasks:
- debug:
Qu'est-ce que le jeu? Pourquoi est-elle?
Play — playbook, play play / , . delegate_to
, lookup-, network-cli- , jump- .. . , . , . , .
"-" "-" — play. . . play. , hosts , roles/tasks — .
, ? ?
, play, ", ". , , .
. monitoring, . monitoring ( . play). , , , . delegate? iptables. delegate? / , . delegate! , include_role
, include_role
delegate_to
. ...
— - monitoring, " " — : .
? , , "x" X Y "y", : play, Y y. - "x", . .
, . ! , DRY , .
. , ( , ) , . , - .
: — . , . — . play. , play?
, . Play (, ) , .
, , ( , ) . . play. , , , .
COBOL jinja. — , . "" — .
: , , control flow. delegate_to
. meta: end host/play
. ! , ? delegate_to
. . , , , . , :
play play .
play role. tasks vs role.
play:
- hosts: somegroup
pre_tasks:
- some_tasks1:
roles:
- role1
- role2
post_tasks:
- some_task2:
- some_task3:
, foo. foo: name=foobar state=present
. ? pre? post? role?
… tasks?
— play. , play , "".
play: hosts, play pre_tasks, tasks, roles, post_tasks. play .
: pre_tasks
, roles
, tasks
, post_tasks
. tasks
roles
, best practices , tasks
, roles
. roles
, pre_tasks
/post_tasks
.
, : pre_tasks
, roles
, post_tasks
.
: foo
? ? ? , — pre post?
, , " ". . : play pre_tasks
post_tasks
( tasks, roles), - , post_tasks
pre_tasks
?
, , . ?
… . : flush' . .. pre_tasks
, , notify. , notify . post_tasks
.
, post_tasks
pre_tasks
, , , handler'. , pre_tasks
-, post_tasks
- , pre_tasks
, "" .
, pre_tasks
post_tasks
? , , ( ) . post_tasks
( ).
Ansible , meta: flush_handlers
, flush_handlers, play? , meta: flush_handlers , when
block
.. , "" . — pre/roles/post — .
, , 'foo'. ? pre, post roles? , , foo. , foo pre, post — — .
" " , play — tasks, tasks. roles — ( task). , tasks roles .
, , .
( )
, . foo, bar baz. , ? : ? , ?… ?
( ) — , — . ? , side causes, side effects, .
, . ? side effects — , — -. side causes? . " " — - . -, . play vars . play . (set_fact
/register
). " ". " " " ".
: ansible - -. — side effect . Rust, , — unsafe
. — . : " ", " , ". . .
: — .
? -, default values (/default/main.yaml
), - .
default values? , , role defaults — ( ). , - , — . ( — |d(your_default_here)
, — ).
? , . , (.. ), ( , - — include_vars
{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml
.). files/
, templates/
. , (library/
). , playbook' ( ), , , .
: , ( galaxy). .
, : ( ) .
: ? "" / , ( ). — . — , . , . "" ( ) , .
import_role , , , .
, , galaxy.yml, include_role
— , , .
: . — . ?
, :
- hosts: group1
tasks:
- foo:
notify: handler1
handlers:
- name: handler1
bar:
handler' rolename/handlers/main.yaml. Handler' play: pre/post_tasks handler' , handler' . , "-" handler' wtf, handler'. ( best practices — handler').
, () (/ when
), — (notify changed). ? , , , changed, handler. , handler changed ? , - changed , . , . , . , .
(, .., 'basic ansible' ). : , .service
-, daemon_reload
state=started
. , , . , . . restarted ( restarted, .. ), state=started, , .. .
handler' , . — skipped ok — . — task' , handler' changed, .. — . , . , , . — changed- .
. , notify , ? , , , .
… handler' , . - ( ) . — .
, listen
, handler notify handler', handler import_tasks ( include_role c with_items), -, include_role .. — "").
WTF, , . delegate_to
notify, delegate_to
, .. , play. ( , , delegate_to
).
reusable roles. , , ansible-galaxy install
. . , : . include_vars
, 100500 corner case . , , , " ". — , ( 1).
if' ( — when
include_vars
), . , , , , . galaxy ( !) when
, "" . , galaxy — - . , — - , , - " galaxy". , , - when
'… . 5 , - .
- variables de groupe, plugin host_group_vars, hostvars. Comment nouer le nœud gordien à partir de spaghettis. Variables de portée et de priorité, modèle de mémoire Ansible. "Alors, où le nom d'utilisateur de la base de données est-il encore stocké?"
jinja: {{ jinja }}
- pâte à modeler nosql notype nosense. Il est partout, même là où on ne s'y attend pas. Un peu!!unsafe
et savoureux yaml.