Eu faço muitas revisões do código de outra pessoa no Ansible e escrevo muito. Durante a análise de erros (estranhos e os meus), bem como um certo número de entrevistas, eu entendi o principal erro cometido pelos usuários da Ansibl - eles enfrentam um erro difícil sem dominar o básico.
Para corrigir essa injustiça universal, decidi escrever uma introdução ao Ansible para quem já o conhece. Eu aviso, isso não é uma recontagem de mana, é uma longa jornada em que há muitas letras e nenhuma imagem.
Nível esperado do leitor - vários milhares de linhas de nome já foram escritas, algo já está em produção, mas "de alguma forma tudo está torto".
Nomes
O principal erro do usuário Ansible é não saber o que é chamado. Se você não souber os nomes, não poderá entender o que está escrito na documentação. Um exemplo vivo: em uma entrevista, uma pessoa que alegadamente alegou ter escrito muito no Ansible não conseguiu responder à pergunta "em que elementos de um manual de jogo consiste?". E quando sugeri que "a resposta era que o manual consiste em brincadeira", o comentário assassino "não usamos isso" foi seguido. As pessoas escrevem no Ansible por dinheiro e não usam brincadeiras. Eles realmente usam, mas não sabem o que é.
Então, vamos começar simples: como é chamado. Talvez você saiba disso, mas talvez não, porque não prestou atenção ao ler a documentação.
ansible-playbook executa o playbook. Um manual é um arquivo com a extensão yml / yaml, dentro do qual algo como isto:
---
- hosts: group1
roles:
- role1
- hosts: group2,group3
tasks:
- debug:
Já percebemos que esse arquivo inteiro é um manual. Podemos mostrar onde estão os papéis, onde estão as tarefas. Mas onde está o jogo? E como a peça é diferente da peça ou do manual?
A documentação tem tudo. E eles sentem falta disso. Iniciantes - porque são muitos e você não consegue se lembrar de tudo de uma vez. Experiente - porque "coisas triviais". Se você tiver experiência, releia essas páginas pelo menos uma vez a cada meio ano, e seu código se tornará uma classe melhor.
Portanto, lembre-se: Playbook é uma lista de jogos e import_playbook
.
Esta é uma peça:
- hosts: group1
roles:
- role1
e essa também é outra peça:
- hosts: group2,group3
tasks:
- debug:
O que é brincar? Por que ela está?
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 , - .
- variáveis de grupo, plug-in host_group_vars, hostvars. Como amarrar um nó górdio de espaguete. Variáveis de escopo e precedência, modelo de memória Ansible. "Então, onde está armazenado o nome de usuário do banco de dados?"
jinja: {{ jinja }}
- nosql notype nosense plasticina macia. Está em toda parte, mesmo onde você não espera. Um pouco pro!!unsafe
e yaml delicioso.