Ansible Grundlagen, ohne die Ihre SpielbĂĽcher ein Klumpen klebriger Nudeln sind

Ich ĂĽberprĂĽfe viel den Code eines anderen in Ansible und schreibe selbst viel. Bei der Analyse der Fehler (sowohl von Fremden als auch von mir) sowie einer Reihe von Interviews wurde mir der Hauptfehler bewusst, den Ansible-Benutzer machen - sie steigen in den Komplex ein, ohne den grundlegenden zu beherrschen.



Um diese universelle Ungerechtigkeit zu korrigieren, habe ich beschlossen, eine Einführung in Ansible für diejenigen zu schreiben, die es bereits kennen. Ich warne Sie, dies ist keine Nacherzählung von mans, dies ist ein Longread mit vielen Buchstaben und keinen Bildern.



Erwartete Leserebene - mehrere tausend Zeilen James wurden bereits geschrieben, bereits etwas in Produktion, aber "irgendwie ist alles schief".



Namen



Der Hauptfehler des Ansible-Benutzers besteht darin, nicht zu wissen, wie er heißt. Wenn Sie die Namen nicht kennen, können Sie nicht verstehen, was in der Dokumentation steht. Ein lebendiges Beispiel: Bei einem Interview konnte eine Person, die zu erklären schien, dass sie viel in Ansible geschrieben hat, die Frage "Aus welchen Elementen besteht das Spielbuch?" Nicht beantworten. Und als ich vorschlug, dass "die Antwort war, dass das Spielbuch aus Spiel besteht", folgte der mörderische Kommentar "Wir verwenden dies nicht". Die Leute schreiben für Geld in Ansible und benutzen kein Spiel. Eigentlich verwenden, aber nicht wissen, was es ist.



Beginnen wir also mit einem einfachen: Wie heiĂźt es? Vielleicht wissen Sie das, aber vielleicht auch nicht, weil Sie beim Lesen der Dokumentation nicht darauf geachtet haben.



ansible-playbook spielt ein playbook ab. Playbook ist eine yml / yaml-Datei mit so etwas wie:



---
- hosts: group1
  roles:
    - role1

- hosts: group2,group3
  tasks:
    - debug:


Wir haben bereits erkannt, dass diese gesamte Datei ein Playbook ist. Wir können zeigen, wo Rollen sind, wo Aufgaben sind. Aber wo ist spielen? Und was ist der Unterschied zwischen Spiel und Rolle oder Spielbuch?



Die Dokumentation hat alles. Und sie vermissen es. Anfänger - weil es zu viele gibt und man sich nicht an alles auf einmal erinnern kann. Erfahren - weil "triviale Dinge". Wenn Sie Erfahrung haben, lesen Sie diese Seiten mindestens einmal im halben Jahr erneut, und Ihr Code wird zu einer besseren Klasse.



Denken Sie also daran: Playbook ist eine Liste von Spielen und import_playbook.

Dies ist ein StĂĽck:



- hosts: group1
  roles:
    - role1


und das ist auch ein anderes StĂĽck:



- hosts: group2,group3
  tasks:
    - debug:


Was ist spielen? Warum ist sie?



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 , - .





  • Gruppenvariablen, Host_group_vars-Plugin, Hostvars. Wie man den gordischen Knoten aus Spaghetti bindet. Umfangs- und Vorrangvariablen, Ansible-Speichermodell. "Wo ist also der Benutzername fĂĽr die Datenbank gespeichert?"
  • jinja: {{ jinja }}- nosql notype nosense weiches Plastilin. Es ist ĂĽberall, auch dort, wo man es nicht erwartet. Ein bisschen ĂĽber !!unsafeund leckeres Yaml.



All Articles