Princípios básicos possíveis, sem os quais seus manuais são um monte de macarrão

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 !!unsafee yaml delicioso.



All Articles