Ansibleの基本、プレイブックが粘着性のあるパスタの塊になる

Ansibleで他の誰かのコードを何度もレビューし、自分でたくさん書いています。間違い(見知らぬ人と私自身の両方)といくつかのインタビューを分析する過程で、Ansibleユーザーが犯す主な間違いを理解しました。基本的なミスをマスターしなくても、困難に乗り込むのです。



この普遍的な不正を正すために、私はすでにそれを知っている人のためにAnsibleの紹介を書くことにしました。私はあなたに警告します、これは人の語り直しではありません、これは多くの手紙と写真のない長い読み物です。



読者の予想レベル-数千行のyamlaがすでに書かれており、何かがすでに生産されていますが、「どういうわけかすべてが曲がっています」。



お名前



Ansibleユーザーの主な間違いは、何と呼ばれるかを知らないことです。名前がわからない場合は、ドキュメントの内容を理解できません。実例:インタビュー中に、Ansibleで多くのことを書いたと主張された人物は、「プレイブックのどの要素が構成されているか」という質問に答えることができませんでした。そして、「プレイブックはプレイで構成されているという答えが予想された」と私に促したところ、「私たちはそれを使用しません」というキラーなコメントがありました。人々はお金のためにAnsibleで書いて、遊びを使いません。彼らは実際にそれを使用しますが、彼らはそれが何であるかを知りません。



それでは、シンプルなものから始めましょう。これを知っているかもしれませんが、知らないかもしれません。ドキュメントを読んだときに注意を払っていなかったからです。



ansible-playbookはプレイブックを実行します。プレイブックは、yml / yaml拡張子が付いたファイルで、その中には次のようなものがあります。



---
- hosts: group1
  roles:
    - role1

- hosts: group2,group3
  tasks:
    - debug:


このファイル全体がプレイブックであることはすでに認識しています。ロールがどこにあるか、タスクがどこにあるかを示すことができます。しかし、遊びはどこですか?そして、遊びと役割またはプレイブックの違いは何ですか?



ドキュメントにはそれがすべて含まれています。そしてそれは見過ごされています。初心者-数が多すぎて一度にすべてを思い出すことができないため。経験-「些細なこと」のため。経験が豊富な場合は、これらのページを少なくとも半年に1回は再読してください。そうすれば、コードがより良いクラスになります。



したがって、覚えておいてください:PlaybookはPlayとのリストですimport_playbook

これは1つの遊びです。



- hosts: group1
  roles:
    - role1


これもまた別の遊びです:



- hosts: group2,group3
  tasks:
    - debug:


遊びとは?彼女はなぜですか?



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





  • グループ変数、host_group_varsプラグイン、hostvars。スパゲッティからゴーディアンノットを結ぶ方法。スコープと優先順位変数、Ansibleメモリモデル。「では、データベースのユーザー名はまだどこに保存されていますか?」
  • jinja: {{ jinja }}-nosql notype nosenseソフトプラスチシン。それはあなたがそれを期待しない場所でさえ、どこにでもあります。少し!!unsafeとおいしいyaml。



All Articles