Les bases d'Ansible, sans lesquelles vos playbooks sont un bouquet de pâtes collantes

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 !!unsafeet savoureux yaml.



All Articles