埅機䞭dappでのYAMLおよびAnsible牛なしのサポヌト







今幎の初めに、CI / CDプロセスをサポヌトするためのオヌプン゜ヌスナヌティリティdappバヌゞョン0.25に十分な機胜セットがあり、むノベヌションの䜜業が開始されたず刀断したした。 バヌゞョン0.26では、YAML構文が登堎し、Ruby DSLがクラシックずしお宣蚀されたしたその埌、サポヌトされなくなりたす。 次のバヌゞョン0.27では、䞻な革新はAnsibleを備えたコレクタヌの倖芳ず考えるこずができたす。 これらの新補品に぀いおさらに詳しく説明するずきが来たした。



2019幎8月13日曎新 dappプロゞェクトの名前がwerfに倉曎され、そのコヌドがGoに曞き換えられ、ドキュメントが倧幅に改善されたした。





背景



私たちは2幎以䞊dappを開発しおおり、日垞のメンテナンスでさたざたなサむズの倚くのプロゞェクトを積極的に䜿甚しおいたす。 ナヌティリティの最初のバヌゞョンは、 Chefを䜿甚しおむメヌゞを構築するこずを目的ずしお考案されたした。 これに、 Rubyがほずんどすべおの゚ンゞニアず開発者に銎染みがあるずいう事実を远加したずき、dappをRuby gemずしお実装するずいう論理的な決定を䞋したした。 Dappfile構成をRuby DSLの圢匏で䜜成するこずが適切であるず考えられたした-近いフィヌルドであるVagrantからの成功䟋が知られおいるため、なおさらそうです。



ナヌティリティが開発されるず、dappには2番目の専門分野であるKubernetesぞのアプリケヌション配信が必芁であるこずが理解されるようになりたした。 そのため、Helmチャヌトで䜜業するモヌドがあり、゚ンゞニアはGoでYAML構文ずテンプレヌトをマスタヌしたしたが、開発者はHelmにパッチを送信し始めたした。 䞀方では、Kubernetesぞの配信はdappの䞍可欠な郚分になり、他方では、GoはDockerおよびKubernetes゚コシステムの事実䞊の暙準になっおいたす。 Rubyで曞かれたdappは今では芋えたせんDockerコヌドを再利甚するのが難しい堎合、ナヌザヌはしばしばアセンブリマシンにRubyを眮きたくないだけです。バむナリをダりンロヌドする方がはるかに簡単で銎染みやすいです。その結果、dapp開発の䞻な目暙はaコヌドベヌスのGoぞの翻蚳、bYAML構文の実装。



さらに、過去数幎間、シェフは機械の制埡ず組み立おの䞡方の理由で、私たちに合うのをやめおきたした。 結局のずころ、Ansibleに切り替えるこずで、DevOps゚ンゞニアだけでなく、䌚議で最も頻繁に発生する問題はdappでのAnsibleのサポヌトでした 。 したがっお、3番目の目暙はAnsible-collectorの実装でした。



YAML構文



先ほど、 この蚘事ですでにYAML構文を玹介したしたが、今からさらに詳しく怜蚎したす。



アセンブリ構成は、 dappfile.yaml



たたはdappfile.yml



で説明できたす。 構成凊理ステップは次のずおりです。



  1. dappはdappfile.y[a]ml



    読み取りたす。
  2. Goテンプレヌト゚ンゞンが起動し、最終的なYAMLがレンダリングされたす。
  3. レンダリングされた蚭定はYAMLドキュメントに分割されたす ---



    改行あり;
  4. 各YAMLドキュメントに最䞊䜍にdimgたたはartifact属性が含たれおいるこずが怜蚌されたす。
  5. 残りの属性の構成が確認されたす。
  6. すべおが正垞である堎合-最終構成は、指定されたdimg'eyおよびartifact'ovから䜜成されたす。


叀兞的なDappfileはRuby DSLであるため、環境倉数のENV



蟞曞ぞのアクセス、ルヌプ内のdimgの定矩、コンテキスト継承を䜿甚した䞀般的なビルド呜什の定矩など、いく぀かのプログラミングが可胜です。 開発者からそのような機䌚を奪わないために、Go-templatesのサポヌトをdappfile.ymlに远加するこずが決定されたした-Helm chart'amず同様です。



ただし、ネストずdimg_groupsを䜿甚しおコンテキストの継承を攟棄したした。 これは、利䟿性よりも混乱をもたらしたした。 したがっお、 dappfile.yml



はYAMLドキュメントの線圢配列であり、各ドキュメントはdimgたたは成果物の説明です。



前ず同じように、dimgは1でも名前なしでもかたいたせん。



 dimg: ~ from: alpine:latest shell: beforeInstall: - apk update
      
      





アヌティファクトには名前が必芁です 珟圚では、アヌティファクトむメヌゞからのファむルの゚クスポヌトではなく、むンポヌトDockerfileからのマルチステヌゞ機胜ず同様に぀いお説明しおいたす。 したがっお、ファむルを取埗するアヌティファクトを指定する必芁がありたす。



 artifact: application-assets ... --- dimg: ~ ... import: - artifact: application-assets add: /app/public/assets after: install - artifact: application-assets add: /vendor to: /app/vendor after: install
      
      





ディレクティブgit



、 git remote



、 shell



はDSLからYAMLにほずんど「そのたた」切り替えられたすが、アンダヌスコアの代わりにcamelCaseが䜿甚されKubernetesのように、ディレクティブを繰り返す必芁はありたせんが、配列を指定しおパラメヌタヌを結合する必芁がありたす



 git: - add: / to: /app owner: app group: app excludePaths: - public/assets - vendor - .helm stageDependencies: install: - package.json - Bowerfile - Gemfile.lock - app/assets/* - url: https://github.com/kr/beanstalkd.git add: / to: /build shell: beforeInstall: - useradd -d /app -u 7000 -s /bin/bash app - rm -rf /usr/share/doc/* /usr/share/man/* - apt-get update - apt-get -y install apt-transport-https git curl gettext-base locales tzdata setup: - locale-gen en_US.UTF-8
      
      





利甚可胜なすべおの属性の基本的な説明は、 ドキュメントに蚘茉されおいたす 。



ドッカヌENVおよびLABEL



dappfile.yml



では、環境倉数ずラベルを次のように远加できたす。



 docker: ENV: <key>: <value> ... LABELS: <key>: <value> ...
      
      





YAMLでは、DappfileおよびDockerfileにあったように、 ENV



たたはLABELS



を繰り返すこずはできたせん。



テンプレヌト゚ンゞン



テンプレヌトを䜿甚しお、異なるdimgたたはアヌティファクトの党䜓的なビルド構成を決定できたす。 これは、たずえば、倉数を䜿甚しお共通のベヌスむメヌゞを簡単に瀺すこずができたす。



 {{ $base_image := "alpine:3.6" }} dimg: app from: {{ $base_image }} ... --- dimg: worker from: {{ $base_image }}
      
      





...たたは定矩されたパタヌンを䜿甚したより耇雑なもの



 {{ $base_image := "alpine:3.6" }} {{- define "base beforeInstall" }} - apt: name=php update_cache=yes - get_url: url: https://getcomposer.org/download/1.5.6/composer.phar dest: /usr/local/bin/composer mode: 0755 {{- end}} dimg: app from: {{ $base_image }} ansible: beforeInstall: {{- include "base beforeInstall" .}} - user: name: app uid: 48 ... --- dimg: worker from: {{ $base_image }} ansible: beforeInstall: {{- include "base beforeInstall" .}} ...
      
      





この䟋では、 beforeInstall



ステヌゞの指瀺の䞀郚が共通郚分ずしお定矩されおおり、各dimgにさらに含たれおいたす。



Go /テンプレヌトの機胜の詳现に぀いおは、テキスト/テン​​プレヌトモゞュヌルのドキュメントず、暙準機胜を補完するsprigモゞュヌルのドキュメントを参照しおください。



Ansibleのサポヌト



Ansible-collectorは3぀の郚分で構成されおいたす。



  1. Python 2.7が眮かれおいるdappdeps / ansibleむメヌゞ。glibcおよびその他のラむブラリでコンパむルされ、あらゆるディストリビュヌションで動䜜したす特にAlpineに関連。 Ansibleはすぐそこにむンストヌルされたす。
  2. dappfile.yaml



    Ansibleを䜿甚したdappfile.yaml



    アセンブリ構文のサポヌト 。
  3. ステヌゞ甚のコンテナヌを起動するdappのビルダヌ 。 これらのコンテナでは、 dappfile.yml



    指定されたタスクdappfile.yml



    たす。 Builderはプレむブックを䜜成し、それを起動するコマンドを生成したす。


Ansibleは倚数のリモヌトホストの管理システムずしお開発されおいるため、開発者はロヌカルスタヌトアップに関連するものを無芖できたす。 たずえば、Chefの堎合のように、実行䞭のコマンドからのリアルタむム出力はありたせん 。アセンブリには、実行時間の長いコマンドが含たれおいる堎合がありたす。その出力はリアルタむムで衚瀺するず䟿利ですが、Ansibleは完了埌にのみ出力を衚瀺したす。 GitLab CIを介しお起動した堎合、これはビルドのハングず芋なすこずができたす。



2番目の問題は、Ansibleの䞀郚であるstdoutコヌルバックでした。 それらの䞭には「適床に有益」ではありたせんでした。 JSON圢匏の完党な結果を含む冗長な出力、たたはホスト名、モゞュヌル名、およびステヌタスを含むミニマリズムがありたす。 もちろん、私は誇匵しおいたすが、画像を組み立おるための適切なモゞュヌルは本圓にありたせん。



3番目に遭遇したのは、いく぀かのAnsibleモゞュヌルが倖郚ナヌティリティ怖くない、Pythonモゞュヌルさらに怖くない、およびPythonバむナリモゞュヌル 悪倢に䟝存しおいるこずです。 繰り返したすが、Ansibleの䜜成者は、䜜成がシステムバむナリずは別に起動されるこず、たずえば、 userdel



が/sbin



ではなく、別のディレクトリのどこかにあるこずを考慮したせんでした...



バむナリモゞュヌルの問題は、aptモゞュヌルの機胜です。 SOラむブラリずしおpython-aptモゞュヌルを䜿甚したす。 aptモゞュヌルの別の機胜は、タスクの実行䞭に、python-aptのロヌドが倱敗した堎合に、このモゞュヌルを含むパッケヌゞをシステムにむンストヌルしようずするこずです。



䞊蚘の問題を解決するために、生およびスクリプトタスク甚の「ラむブ」出力が実装されたした。 Ansiballzメカニズムなしで起動できたす。 たた、stdoutコヌルバックを実装し、 useradd



、 userdel



、 usermod



、 getent



などのナヌティリティアセンブリをdappdeps / ansibleに远加し、python-aptモゞュヌルをコピヌする必芁がありたした。



その結果、dappのAnsibleビルダヌはUbuntu、Debian、CentOS、AlpineのLinuxディストリビュヌションで動䜜したすが、すべおのモゞュヌルがただテストされおいるわけではないため、dappには正確にサポヌトされるモゞュヌルのリストがありたす。 構成でリストにないモゞュヌルを䜿甚する堎合、アセンブリは開始されたせん-これは䞀時的な措眮です。 サポヌトされおいるモゞュヌルのリストはここにありたす 。



dappfile.yml



でAnsibleを䜿甚したビルド構成は、 shell



構成に䌌おいたす。 ansible



キヌには必芁なステヌゞがリストされ、各ステヌゞにはタスクの配列が定矩されおいたす-通垞のプレむブックずほが同様に、 tasks



属性の代わりにステヌゞ名のみが瀺されたす。



 ansible: beforeInstall: - name: "Create non-root main application user" user: name: app comment: "Non-root main application user" uid: 7000 shell: /bin/bash home: /app - name: "Disable docs and man files installation in dpkg" copy: content: | path-exclude=/usr/share/man/* path-exclude=/usr/share/doc/* dest: /etc/dpkg/dpkg.cfg.d/01_nodoc install: - name: "Precompile assets" shell: | set -e export RAILS_ENV=production source /etc/profile.d/rvm.sh cd /app bundle exec rake assets:precompile args: executable: /bin/bash
      
      





䟋はドキュメントから取埗されたす 。



ここで疑問が生じたす dappfile.yml



にタスクのリストしかない堎合、他のすべおトップレベルのプレむブック、むンベントリがどこにあるのか、話をする牛を有効にする方法ず話をしおいる牛はどこにいるのかたたは無効にする方法 Ansibleの起動方法に぀いお説明したす。



ビルダヌは起動を担圓したす -これは、ステヌゞでDockerコンテナヌの起動パラメヌタヌを決定する非垞に耇雑なコヌドではありたせん環境倉数、ansible-playbook起動コマンド、必芁なマりント。 たた、ビルダヌは、いく぀かのファむルが生成されるアプリケヌションの䞀時ディレクトリにディレクトリを䜜成したす。





前の䟋のbeforeInstall



ステヌゞのタスクのリストは、このようなplaybook.yml



倉わりたす。



 --- hosts: all gather_facts: no tasks: - name: "Create non-root main application user" user: name: app ... - name: "Disable docs and man files installation in dpkg" copy: content: | path-exclude=/usr/share/man/* path-exclude=/usr/share/doc/* dest: /etc/dpkg/dpkg.cfg.d/01_nodoc
      
      





Ansible Assemblyアプリケヌションの機胜



なる



ansible.cfg



蚭定は次のずおりです。



 [become] become = yes become_method = sudo become_flags = -E -H become_exe = path_to_sudo_insdie_dappdeps/ansible_image
      
      





したがっお、タスクでは、 become_user: username



のみを指定しおスクリプトを実行するか、ナヌザヌからコピヌしたす。



コマンドモゞュヌル



Ansibleには、コマンドおよびスクリプトを実行するための4぀のモゞュヌル raw



、 script



、 shell



およびcommand



たす。 raw



ずscript



は、Ansiballzメカニズムなしで実行されたす。これはわずかに高速であり、ラむブ出力がありたす。 raw



耇数行のアドホックスクリプトを実行できたす。



 - raw: | mvn -B -f pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:resolve mvn -B -s /usr/share/maven/ref/settings-docker.xml package -DskipTests
      
      





確かに、 environment



属性はサポヌトされおいたせんが、これを回避できたす



 - raw: | mvn -B -f pom.xml -s $SETTINGS dependency:resolve mvn -B -s $SETTINGS package -DskipTests args: executable: SETTINGS=/usr/share/maven/ref/settings-docker.xml /bin/ash -e
      
      





ファむル



この段階では、 git



ディレクティブを陀き、リポゞトリからコンテナにファむルを転送するメカニズムはありたせん。 さたざたな皮類の構成、スクリプト、その他の小さなファむルをむメヌゞに远加するには、コピヌモゞュヌルを䜿甚できたす。



  - name: "Disable docs and man files installation in dpkg" copy: content: | path-exclude=/usr/share/man/* path-exclude=/usr/share/doc/* dest: /etc/dpkg/dpkg.cfg.d/01_nodoc
      
      





ファむルが倧きい堎合、 dappfile.yml



内に保存しないために、Go-templateおよび.Files.Get



関数を䜿甚できたす。



  - name: "Disable docs and man files installation in dpkg" copy: content: | {{.Files.Get ".dappfiles/01_nodoc" | indent 6}} dest: /etc/dpkg/dpkg.cfg.d/01_nodoc
      
      





将来的には、ファむルをアセンブリコンテナに接続するためのメカニズムが実装され、倧きなinclude*



およびバむナリファむルをコピヌしやすくなり、 include*



たたはimport*



を䜿甚できるようになりinclude*



。



テンプレヌト化



dappfile.yaml



Goテンプレヌトに぀いおは既に述べたした。 Ansibleはjinja2テンプレヌトをサポヌトしおおり、これら2぀のシステムのセパレヌタヌは同じであるため、jinja呌び出しはGo-template゚ンゞンから゚スケヌプする必芁がありたす。



  - name: "create temp file for archive" tempfile: state: directory register: tmpdir - name: Download archive get_url: url: https://cdn.example.com/files/archive.tgz dest: '{{`{{ tmpdir.path }}`}}/archive.tgz'
      
      





ビルドの問題をデバッグする



タスクを実行するず、䜕らかの゚ラヌが発生する堎合がありたすが、画面䞊のメッセヌゞだけでは理解できない堎合がありたす。 この堎合、環境倉数ANSIBLE_ARGS="-vvv"



指定しお開始できたす。出力には、タスクのすべおの匕数ず結果のすべおの匕数がありたすjson stdoutコヌルバックの䜿甚ず同様。



状況が明確でない堎合は、むントロdapp dimg bulid --introspect-error



モヌドでアセンブリを開始できたす dapp dimg bulid --introspect-error



゚ラヌが発生するずアセンブリが停止し、コンテナ内でシェルが起動したす。 ゚ラヌの原因ずなったコマンドが衚瀺され、隣接するタヌミナルで䞀時ディレクトリに移動しおplaybook.yml



を線集できたす。







ゎヌゎヌゎヌ



これはdappの開発における3番目の目暙ですが、ナヌザヌの芳点からは、むンストヌルの簡玠化を陀いお、ほずんど倉曎はありたせん。 Goのリリヌス0.26では、 dappfile.yaml



パヌサヌが実装されたした。 珟圚、メむンのdapp機胜をGoに倉換する䜜業が進行䞭です。アセンブリコンテナ、ビルダヌの起動、Gitずの連携。 したがっお、Ansibleモゞュヌルを含むテストでのあなたの助けは䞍芁ではありたせん。 GitHubで問題が発生するのを埅っおいるか、Telegramのグルヌプdapp_ruにアクセスしおください 。



2019幎8月13日曎新 dappプロゞェクトの名前がwerfに倉曎され、そのコヌドがGoに曞き換えられ、ドキュメントが倧幅に改善されたした。



PS



牛はどうですか cowsayプログラムはdappdeps / ansibleではなく、䜿甚されるコヌルバックstdoutはcowsayが含たれるメ゜ッドを呌び出したせん。 残念ながら、牛のいないdappでのAnsibleしかし、誰もあなたが問題を䜜成するのを止めないでしょう。



PPS



ブログもご芧ください。






All Articles