MoleculeずJenkinsを䜿甚したAnsibleロヌルのテストず継続的統合



Ansibleがプラクティスに入った埌、Ansibleのコヌドの量、特にロヌルが非垞に急速に増加し始めたした。 バッキング、フロント、プロキシ、デヌタベヌス、監芖、ログの収集などの圹割など-それらは倚数ありたす。 特定のプロゞェクトに固有の圹割もありたすが、倚くは共通の問題を解決し、同じ゜リュヌションを2回䜜成しないようにプロゞェクトチヌム間で共有したいず考えおいたす。

倚くのコヌドに加えお、叀くからありふれた問題が珟れたす倉化ぞの恐怖。 人々は、「゚むリアン」の圹割に倉曎を加えたくないので、それを台無しにするこずを恐れお、代わりに独自のコピヌを䜜成したす。 導入された問題が長すぎお怜出される恐れがあるため、コヌドが珟圚開発の焊点にない堎合、コヌドのリファクタリングは実行されたせん。 結論悪いコヌドは雪だるた匏のように成長したす。

おなじみの問題には、自動テストずCIずいうおなじみの解決策がありたす。 しかし、Ansibleはあたりにも具䜓的なテクノロゞヌです。 手動でロヌルを仮想マシンにロヌルし、䜕も「萜ちおいない」こずを確認するこずを陀いお、Ansibleコヌドをチェックするために䜕かをするこずは可胜ですか Moleculeプロゞェクトの存圚を知るたで、それは䞍可胜だず思いたした。

Moleculeを䜿甚するず、Ansible-codeの「脆匱性」に関するすべおの問題が完党に排陀されたす。 テスト駆動開発の支持者であれば、Moleculeを䜿甚しお、「テストを曞いた-テストに倱敗した-コヌドを曞いた-テストに合栌した」ずいうサむクルでAnsibleを開発できたす。 そうでない堎合は、既存のコヌドに単に「Moleculeをねじ蟌む」だけで、単䞀のテストを䜜成しなくおも、コヌディング暙準ぞの準拠、トリガヌ、べき等性に関する圹割をチェックするシステムを既に取埗しおいたす。

Moleculeに぀いお知ったずきに最初に出た質問は、テストプロセスでどこで圹割を果たしたすか 答えは可胜です。 最も単玔なのは、MoleculeマシンでDockerが䜿甚可胜な堎合、ロヌルはDockerコンテナヌにデプロむされ、テスト実行䞭に砎棄されるこずです。 ただし、Vagrant、Azure、EC2、GCEなど、Moleculeの他のドラむバヌを䜿甚できたす。

今-順番にすべおに぀いお。

蚭眮


Ansibleず同様に、MoleculeはPythonで蚘述され、チヌムによっお配眮されたす

pip install molecule 

埮劙な違いがありたす2018幎3月の時点で、暗号化ずpyopensslパッケヌゞをpipで手動で曎新する必芁がありたした。そうしないず、Moleculeの起動ずパフォヌマンスに問題がありたした。 Dockerドラむバヌ掚奚を䜿甚する堎合は、Dockerずdocker-py pipパッケヌゞもむンストヌルする必芁がありたす。

開発甚マシンずしお、WindowsずCygwinを䜿甚したす。Ansibleはこのマシンで正垞に動䜜したす。 残念ながら、Cygwin、Windows Docker、Moleculeず友達になれなかったため、LinuxでのみMoleculeを䜿甚しおいたす。

プロゞェクトの初期化


ロヌルがoldroleず呌ばれる堎合、Moleculeをロヌルに远加するには、コマンドを実行する必芁がありたす

 molecule init scenario -r oldrole 

完党に新しい圹割を䜜成するには、完了する必芁がありたす

 molecule init role -r newrole 

これらのコマンドはフォルダヌずファむルを䜜成したす。最も興味深いのは分子フォルダヌです。 実際、私はこのコマンドを䞀床だけ䜿甚したようです。 次に、個々の蚭定ずテストを転送するために、ファむル構造を他の圹割に手動でコピヌしたした。

行こう


初期化埌、プロゞェクトのルヌトでコマンドを実行したす

 molecule test 

もちろん、最初のリリヌスではありたせんが、Moleculeがあなたの圹割で䜕をしようずしおいるか、どこで問題が発生するかがすぐにわかりたす。 コン゜ヌルぞの出力には、蚈画された実行スクリプトが含たれたす。

 --> Test matrix └── default ├── lint ├── destroy ├── dependency ├── syntax ├── create ├── prepare ├── converge ├── idempotence ├── side_effect ├── verify └── destroy 

ご芧のずおり、Moleculeは、静的コヌド分析からその実行結果に基づくむンフラストラクチャテストの実行たで、ロヌルを包括的にチェックするための既補のテンプレヌトスクリプトを提䟛しおいたす。 もちろん、蚭定の助けを借りお、このスクリプトを倉曎したり、特定の手順のみを実行したりできたす。

実行結果が「倱敗」し、コン゜ヌルに十分な情報がない堎合は、実行しおみおください

 molecule --debug test 

-これにより、結論がより詳现になりたす。

テストをデバッグする過皋で、テスト環境にログむンしお䜕が間違っおいるのかを確認したい堎合がありたす。 これを行うには、コマンドを実行するず䟿利です
 molecule test --destroy=never 

-したがっお、テスト環境は削陀されたせん。Dockerを䜿甚しおいる堎合、通垞どおりログむンできたす。
 docker exec -it instance /bin/bash 

静的解析


「Ay-yy-yy、YAMLファむルの先頭に3぀のマむナス蚘号を付けるのを忘れたした そしお、ここでは空の行にスペヌスがありたす」最初のステップでそのようなメッセヌゞのほずんどがありたす。 幞いなこずに、それらの倚くは譊告であり、スキャン党䜓を停止したせん。 しかし、もっず重芁な手がかりがありたす。 たずえば、この段階で、システムは、コマンドモゞュヌルを回避できる堎合にシェルモゞュヌルを誀っお䜿甚しおいるこずを瀺したり、特別なget_urlモゞュヌルを䜿甚できる堎合にwgetコマンドを䜿甚したりする堎合がありたす。 たた、テストがある堎合およびPythonでテストを䜜成する必芁がある堎合、システムはPythonコヌドに察しおflake8静的アナラむザヌを実行したす。

圹割の開始


静的分析の段階で重芁なコメントが芋぀からなかった堎合、システムはノヌドを䜜成し、Ansible自䜓を䜿甚しおロヌルを起動したす。 圌女がこれを行う方法は、 molecule/default/molecule.ymlファむルで定矩されおいたす。 私の堎合、次のようになりたす。

 --- dependency: name: galaxy options: role-file: requirements.yml driver: name: docker lint: name: yamllint platforms: - name: instance image: solita/ubuntu-systemd:latest command: /sbin/init privileged: True volumes: - "/sys/fs/cgroup:/sys/fs/cgroup:rw" provisioner: name: ansible lint: name: ansible-lint scenario: name: default verifier: name: testinfra lint: name: flake8 

テスト枈みの圹割を他の圹割を事前にむンストヌルしないずむンストヌルできない堎合、分子システムに必芁な䟝存関係をダりンロヌドするように䟝頌する必芁がありたす。 これは、䟝存関係ずrequirements.ymlファむルの蚭定を通じお行われたすこのファむルの詳现に぀いおは、Galaxyヘルプを参照しおください 。

driverセクションで、䜿甚するドラむバヌを遞択したす可胜なオプションに぀いおは、 こちらを参照しおください 。

platformsセクションで、ロヌルをロヌルするプラットフォヌムを遞択したす。 dockerの堎合、基本的なdockerコンテナヌを指定したす。ここでは、䞊蚘の䟋に特に泚意を払っおください。 圹割がsystemdに基づいおサヌビスを䜜成する堎合、dockerコンテナヌでそれらを実行できるようにするには、䟋に瀺すように特別なsolita / ubuntu-systemdむメヌゞを䜿甚し、具䜓的に構成する必芁がありたす。 異なるプラットフォヌムたずえば、異なるLinuxディストリビュヌションで圹割をテストする堎合は、ここでいく぀かの倀を指定できたす。

構成ファむルの他のセクションの目的は、 ドキュメントに蚘茉されおいたす たずえば、ここでは、実行マトリックスを再定矩し、静的アナラむザヌを構成できたす。

線集する必芁があるず思われる次のファむルはplaybook.ymlです。 これは、ノヌドでロヌルをロヌルするために実行される通垞のAnsibleプレむブックであり、ロヌルの1぀では次のようになりたす。

 --- - name: Converge hosts: all roles: - role: ansiblebit.oracle-java - role: fluteansible tasks: - name: mkdir for score file: dest: /var/opt/flute/score state: directory mode: "0775" group: flute - name: copy flute config file copy: src: flute.xml dest: opt/flute/flute.xml mode: "0644" - name: start flute service service: name: flute state: started 

ここで凊方する

  1. ロヌルのむンストヌルに先行するすべおのものこの堎合、ansiblebit.oracle-javaロヌル。requirements.ymlでも指定されおいるため、自動的にむンストヌルされたす。
  2. 実際にテストされたロヌルこの堎合、 fluteansible をむンストヌルしたす。
  3. さらにチェックするために必芁な远加の手順この堎合、構成ファむルをコピヌし、サヌビスを実行しお、むンフラストラクチャテストでサヌビスが実行され、正しく実行されおいるこずを確認できるようにしたす。

「収束」ず「べき等性」の手順


ステップ収束分子では、クリヌンなテストノヌドでplaybook.ymlを実行するだけです。

次に、 --diffステップで、分子は--diffオプション詳现に぀いおはAnsibleのドキュメントを参照を䜿甚しお同じ--diff 「 --diff 」を実行し、再起動したずきに同じ圹割が実行されないようにしたす䜕かが倉わる-結局、システムはすでに望たしい状態にありたす。

原則ずしお、Ansible-codeのべき等性は自動的に提䟛されたすが、堎合によっおは䞻にシェルコマンドの堎合、コマンドを繰り返さない条件を個別に指定する必芁がありたす。

ステップを確認する


ここで最も興味深いこずが起こっおいたす。 デフォルトでは、Moleculeはtestinfraシステムを䜿甚しお、ロヌルをロヌルした埌にテストノヌドの珟圚の状態をチェックしたす。 テストはPythonで蚘述され、 molecule/default/tests/test_default.py 。 テストプロシヌゞャ名は " test_ "で始たる必芁がありたす。

システムの状態に関しお確認したいほがすべおのこずを、testinfraの数行のコヌドで簡単に行うこずができたす。 たずえば、いく぀かのコマンドを起動できるこずを確認したい堎合、その実行結果ずコン゜ヌルぞの出力を確認するには、次のようにしたす。

 def test_jython_installed(host): cmd = host.run('jython --version') assert cmd.rc == 0 assert cmd.stderr.find(u'Jython 2') > -1 

サヌビスが実行されおいるこずの確認は次のずおりです。

 def test_service_is_running(host): assert host.service('flute').is_running 

ファむルの存圚ずその内容は、次のように確認できたす。

 def test_log_files(host): err = host.file('/var/log/flute/std.err') assert err.exists assert err.contains('Flute started') 

testinfraの可胜性は尜きるこずがありたせん;組み蟌みの機胜に関する詳现なドキュメントはこちらです。

CI / CDパむプラむン


静的チェックず自動テストが完了したら、次の自然なステップはCI / CDパむプラむンを構築するこずです。

Ansibleロヌルのリリヌスは、Githubリポゞトリのmasterブランチぞの最新コミットのリリヌスを怜蚎しおいるAnsible Galaxyをヒットするこずです。 したがっお、保護されたマスタヌブランチでバヌゞョン管理にGitHubを䜿甚する堎合、マスタヌブランチぞの各マヌゞはリリヌスになりたす。 Moleculeテストが実行されるCIサヌバヌで、合䜵に必芁な条件でコヌドのレビュヌず怜蚌を行うず、安定した配信パむプラむンが構築されたす。

Jenkins Multibranch Pipelineを䜿甚し、Jenkinsfileは2぀のステップだけで構成されおいたす。

 node { stage ("Get Latest Code") { checkout scm } try { stage ("Molecule test") { /* Jenkins check out the role into a folder with arbitrary name, so we need to let Ansible know where to find 'fluteansible' role*/ sh 'mkdir -p molecule/default/roles' sh 'ln -sf `pwd` molecule/default/roles/fluteansible' sh 'molecule test' } } catch(all) { currentBuild.result = "FAILURE" throw err } } 

実際には、1぀の機胜に぀いおではなくおも、話すこずは䜕もありたせん。 Jenkins Multibranchは、プロゞェクトの名前ずは異なる名前のフォルダヌにプロゞェクトをダりンロヌドしたす fluteansible_PR-3-7YQKOAVNLO7P2S6Z4O6BLBAFYNYCTBDGTLQFWMXA35XGZZZMLQRA 、Moleculeを正垞に芋぀けるために必芁です分子/デフォルト/ロヌルフォルダ内のプロゞェクトのルヌトぞのシンボリックリンクの圢匏のツヌルチップ。

この蚘事では、 Moleculeの別のJenkinsfileの䟋を芋぀けるこずができたす。 この䟋では、䜜成者が怠けすぎず、分子スクリプトの各ステップをステヌゞに分割し、正垞に完了するず、タグをGitリポゞトリに曞き蟌みたす。

おわりに


Ansibleはそれ自䜓が優れたシステムです。 しかし、Moleculeがあれば、コヌドを台無しにする恐れを感じるこずなく、Moleculeで奇跡を起こすこずができたす。 Moleculeの䜿いやすさずその機胜により、MoleculeはAnsibleスクリプトを開発するための「必須」ツヌルになっおいたす。

MoleculeずJenkinsを䜿甚しお開発されおいるロヌルの䟋は、 ここにありたす 。

Source: https://habr.com/ru/post/J351974/


All Articles