Conceptos básicos de Ansible, sin los cuales tus libros de jugadas son un montón de pasta pegajosa.

Reviso mucho el código de otra persona en Ansible y escribo mucho yo mismo. Al analizar los errores (tanto los extraños como los míos), así como una serie de entrevistas, me di cuenta del error principal que cometen los usuarios de Ansible: suben a lo difícil sin dominar el básico.



Para corregir esta injusticia universal, decidí escribir una introducción a Ansible para aquellos que ya la conocen. Te advierto, esto no es un recuento de maná, es un recorrido largo en el que hay muchas letras y ninguna imagen.



El nivel esperado del lector: ya se han escrito varios miles de líneas de yamla, algo ya está en producción, pero "de alguna manera todo está torcido".



Nombres



El principal error del usuario Ansible es no saber cómo se llama. Si no conoce los nombres, no puede entender lo que está escrito en la documentación. Un ejemplo vivo: en una entrevista, una persona que supuestamente afirmó que escribió mucho en Ansible no pudo responder la pregunta "¿en qué consisten los elementos de un libro de jugadas?". Y cuando le pregunté que "se esperaba la respuesta de que el libro de jugadas consiste en jugar", entonces hubo un comentario asesino "no lo usamos". La gente escribe en Ansible por dinero y no usa el juego. Realmente uso, pero no sé lo que es.



Comencemos con un simple: cómo se llama. Quizás lo sepas, pero quizás no, porque no le prestaste atención cuando leíste la documentación.



ansible-playbook reproduce un libro de jugadas. Un libro de jugadas es un archivo con la extensión yml / yaml, dentro del cual hay algo como esto:



---
- hosts: group1
  roles:
    - role1

- hosts: group2,group3
  tasks:
    - debug:


Ya nos hemos dado cuenta de que todo este archivo es un libro de jugadas. Podemos mostrar dónde están los roles, dónde están las tareas. ¿Pero dónde está el juego? ¿Y en qué se diferencia el juego del rol o el libro de jugadas?



La documentación lo tiene todo. Y lo extrañan. Principiantes: porque hay demasiados y no puedes recordar todo a la vez. Experimentado - porque "cosas triviales". Si tiene experiencia, vuelva a leer estas páginas al menos una vez cada medio año, y su código se convertirá en una clase mejor.



Entonces, recuerde: un libro de jugadas es una lista de juegos y import_playbook.

Esta es una jugada:



- hosts: group1
  roles:
    - role1


y esta es también otra jugada:



- hosts: group2,group3
  tasks:
    - debug:


¿Qué es jugar? ¿Por qué esta ella?



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 grupo, plugin host_group_vars, hostvars. Cómo atar el nudo gordiano del espagueti. Alcance y variables de precedencia, modelo de memoria Ansible. "Entonces, ¿dónde está almacenado el nombre de usuario para la base de datos?"
  • jinja: {{ jinja }}- nosql notype nosense plastilina blanda. Está en todas partes, incluso donde no lo esperas. Un poco profesional !!unsafey delicioso.



All Articles