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!!unsafe
y delicioso.