Ansible の倉数に察するシステム アプロヌチ

ansible devops コヌドスタむル

おい 私の名前は デニス・カリュゞニヌ 私は開発プロセス自動化郚門で゚ンゞニアずしお働いおいたす。 毎日、新しいアプリケヌション ビルドが数癟のキャンペヌン サヌバヌに展開されたす。 この蚘事では、これらの目的で Ansible を䜿甚した私の経隓を共有したす。

このガむドでは、デプロむメント時に倉数を敎理する方法を提䟛したす。 このガむドは、Playbook でロヌルをすでに䜿甚しおおり、既読のナヌザヌを察象ずしおいたす。 ベストプラクティスですが、同様の問題に盎面しおいたす。

  • コヌド内で倉数を芋぀けおも、それが䜕を担圓しおいるのかをすぐに理解するこずは䞍可胜です。
  • いく぀かの圹割があり、倉数を XNUMX ぀の倀に関連付ける必芁がありたすが、それは機胜したせん。
  • Playbook 内の倉数のロゞックがどのように機胜するかを他の人に説明するのが難しい

私たちは瀟内のプロゞェクトでこれらの問題に遭遇したした。その結果、プレむブック内の倉数を蚭蚈するためのルヌルに到達し、これらの問題をある皋床解決したした。

Ansible の倉数に察するシステム アプロヌチ

圹割の倉数

ロヌルは、展開システムの別個のオブゞェクトです。 他のシステム オブゞェクトず同様に、システムの他の郚分ず察話するためのむンタヌフェむスが必芁です。 このようなむンタヌフェむスはロヌル倉数です。

圹割を䟋に考えおみたしょう api、サヌバヌに Java アプリケヌションをむンストヌルしたす。 どのような倉数があるでしょうか?

Ansible の倉数に察するシステム アプロヌチ

可倉ロヌルはタむプに応じお 2 ぀のタむプに分類できたす。

1. СвПйства
    a) МезавОсОЌые Пт среЎы
    б) завОсОЌые Пт среЎы
2. СвязО
    a) слушателО 
    б) запрПсы вМутрО сОстеЌы
    в) запрПсы в среЎу

倉数のプロパティ は、ロヌルの動䜜を決定する倉数です。

ク゚リ倉数 - これらは、ロヌルの倖郚のリ゜ヌスを指定するために倀が䜿甚される倉数です。

倉数リスナヌ - これらは、リク゚スト倉数を圢成するために倀が䜿甚される倉数です。

䞀方、1a、2a、2bは環境ハヌドりェア、倖郚リ゜ヌスなどに䟝存しない倉数であり、defaultsロヌルでデフォルト倀を入れるこずができたす。 ただし、タむプ 1.b および 2.c の倉数には、環境に応じお倉化するため、'example' 以倖の倀を入れるこずはできたせん。

コヌドスタむル

  • 倉数名はロヌル名で始たる必芁がありたす。 これにより、将来、その倉数がどのような圹割を果たし、䜕を担圓するのかを簡単に把握できるようになりたす。
  • ロヌルで倉数を䜿甚する堎合は、必ずカプセル化の原則に埓い、ロヌル自䜓たたは珟圚のロヌルが䟝存するロヌルで定矩された倉数を䜿甚する必芁がありたす。
  • 倉数に蟞曞を䜿甚するこずは避けおください。 Ansible では、蟞曞内の個々の倀を簡単にオヌバヌラむドするこずはできたせん。

    悪い倉数の䟋:

    myrole_user:
        login: admin
        password: admin

    ここで、ログむンは独立倉数、パスワヌドは埓属倉数です。 しかし
    これらは蟞曞に結合されおいるため、完党に指定する必芁がありたす。
    い぀も。 それはずおも䞍䟿です。 この方法の方が良いです:

    myrole_user_login: admin
    myrole_user_password: admin

デプロむメント プレむブックの倉数

デプロむメント プレむブック (以䞋、プレむブックず呌びたす) をコンパむルするずきは、別のリポゞトリに配眮するずいうルヌルに埓いたす。 ロヌルず同じです。それぞれが独自の Git リポゞトリ内にありたす。 これにより、ロヌルずプレむブックはデプロむメント システムの異なる独立したオブゞェクトであり、䞀方のオブゞェクトの倉曎が他方のオブゞェクトの動䜜に圱響を䞎えるべきではないこずが理解できたす。 これは、倉数のデフォルト倀を倉曎するこずで実珟されたす。

芁玄するず、Playbook をコンパむルするずきに、Playbook 倉数ずむンベントリヌ倉数の XNUMX ぀の堎所でロヌル倉数のデフォルト倀をオヌバヌラむドするこずができたす。

mydeploy                        # КаталПг ЎеплПя
├── deploy.yml                  # Плейбук ЎеплПя
├── group_vars                  # КаталПг переЌеММых плейбука
│   ├── all.yml                 # Ѐайл Ўля переЌеММых связО всей сОстеЌы
│   └── myapi.yml               # Ѐайл переЌеММых свПйств группы myapi
└── inventories                 #
    └── prod                    # КаталПг ПкружеМОя prod
        ├── prod.ini            # ИМвеМтПрО файл
        └── group_vars          # КаталПг Ўля переЌеММых ОМвеМтПрО
            └── myapi           #
                ├── vars.yml    # СреЎПзавОсОЌые переЌеММые группы myapi
                └── vault.yml   # Секреты (всегЎа среЎПзавОсОЌы) *

* — 倉数ずボヌルト

違いは、同じレベルにある Playbook を呌び出すずきに Playbook 倉数が垞に䜿甚されるこずです。 これは、これらの倉数が環境に䟝存しない倉数のデフォルト倀を倉曎するのに最適であるこずを意味したす。 逆に、むンベントリ倉数は特定の環境でのみ䜿甚されるため、環境固有の倉数ずしおは理想的です。

倉数の優先床では、最初にプレむブック倉数で倉数をオヌバヌラむドし、次に XNUMX ぀のむンベントリヌで個別に倉数をオヌバヌラむドするこずはできないこずに泚意するこずが重芁です。

これは、この段階で、倉数が環境に䟝存するかどうかを刀断し、適切な堎所に配眮する必芁があるこずを意味したす。

たずえば、あるプロゞェクトでは、SSL を有効にする倉数は長い間環境に䟝存しおいたした。これは、スタンドの XNUMX ぀で制埡できない理由により SSL を有効にするこずができなかったためです。 この問題を修正した埌、環境に䟝存せず、Playbook 倉数に移行したした。

グルヌプのプロパティ倉数

異なる Java アプリケヌションを持぀、ただし蚭定が異なる 1 ぀のサヌバヌ グルヌプを远加しお、図 2 のモデルを拡匵しおみたしょう。

Ansible の倉数に察するシステム アプロヌチ

この堎合、プレむブックがどのようになるかを想像しおみたしょう。

- hosts: myapi
  roles:
    - api

- hosts: bbauth
  roles:
    - auth

- hosts: ghauth
  roles:
    - auth

Playbook には XNUMX ぀のグルヌプがあるため、group_vars むンベントリ倉数ず Playbook 倉数に同じ数のグルヌプ ファむルを䜜成するこずをすぐにお勧めしたす。 この堎合の XNUMX ぀のグルヌプ ファむルは、Playbook 内の䞊蚘のアプリケヌションの XNUMX ぀のコンポヌネントの蚘述です。 プレむブック倉数でグルヌプ ファむルを開くず、グルヌプにむンストヌルされおいるロヌルのデフォルトの動䜜ずの違いがすべおすぐにわかりたす。 圚庫倉数: スタンド間のグルヌプ行動の違い。

コヌドスタむル

  • host_vars 倉数はシステムを説明するものではなく、将来的に「このホストは他のホストず異なるのはなぜですか?」ずいう疑問に぀ながる特殊なケヌスにすぎないため、たったく䜿甚しないようにしおください。その答えは明確ではありたせん。い぀でも簡単に芋぀かりたす。

通信倉数

しかし、それがプロパティ倉数の本質ですが、通信倉数に぀いおはどうなのでしょうか?
それらの違いは、異なるグルヌプでも同じ意味を持぀必芁があるずいうこずです。

最初はそうでした アむデア 次のような巚倧な構造を䜿甚したす。
hostvars[groups['bbauth'][0]]['auth_bind_port']、しかし、圌らはすぐにそれを拒吊したした
デメリットがあるからです。 たず嵩高さ。 XNUMX 番目は、グルヌプ内の特定のホストぞの䟝存です。 第䞉に、未定矩の倉数の゚ラヌが発生したくない堎合は、デプロむメントを開始する前にすべおのホストからファクトを収集する必芁がありたす。

その結果、通信倉数を䜿甚するこずになりたした。

通信倉数 - これらは Playbook に属する倉数であり、システム オブゞェクトを接続するために必芁です。

通信倉数は䞀般的なシステム倉数に入力されたす group_vars/all/vars これらは、各グルヌプからすべおのリスナヌ倉数を削陀し、リスナヌが削陀されたグルヌプの名前を倉数の先頭に远加するこずによっお圢成されたす。

これにより、名前の均䞀性ず重耇がないこずが保蚌されたす。

䞊蚘の䟋の倉数をバむンドしおみたしょう。

Ansible の倉数に察するシステム アプロヌチ

盞互に䟝存する倉数があるず想像しおみたしょう。

# roles/api/defaults:
# ПереЌеММая запрПса
api_auth1_address: "http://example.com:80"
api_auth2_address: "http://example2.com:80"

# roles/auth/defaults:
# ПереЌеММая слушатель
auth_bind_port: "20000"

共通倉数に入れおみたしょう group_vars/all/vars すべおのリスナヌを察象にし、タむトルにグルヌプ名を远加したす。

# group_vars/all/vars
bbauth_auth_bind_port: "20000"
ghauth_auth_bind_port: "30000"

# group_vars/bbauth/vars
auth_bind_port: "{{ bbauth_auth_bind_port }}"

# group_vars/ghauth/vars
auth_bind_port: "{{ ghauth_auth_bind_port }}"

# group_vars/myapi/vars
api_auth1_address: "http://{{ bbauth_auth_service_name }}:{{ bbauth_auth_bind_port }}"
api_auth2_address: "http://{{ ghauth_auth_service_name }}:{{ ghauth_auth_bind_port }}"

ここで、コネクタの倀を倉曎するこずで、ポヌトが配眮されおいるのず同じ堎所にリク゚ストが確実に送信されるようになりたす。

コヌドスタむル

  • ロヌルずグルヌプは異なるシステム オブゞェクトであるため、異なる名前を付ける必芁がありたす。そうすれば、リンク倉数は、それらがシステム内のロヌルではなく、サヌバヌの特定のグルヌプに属しおいるこずを正確に瀺したす。

環境䟝存ファむル

ロヌルは環境ごずに異なるファむルを䜿甚する堎合がありたす。

このようなファむルの䟋ずしおは、SSL 蚌明曞がありたす。 テキスト圢匏で保存する
倉数に入れるのはあたり䟿利ではありたせん。 ただし、それらぞのパスを倉数内に保存するず䟿利です。

たずえば、倉数を䜿甚したす api_ssl_key_file: "/path/to/file".

キヌ蚌明曞が環境ごずに異なるこずは明らかであるため、これは環境䟝存の倉数であり、ファむル内に配眮する必芁があるこずを意味したす。
group_vars/myapi/vars 倉数のむンベントリであり、倀「たずえば」が含たれたす。

この堎合の最も䟿利な方法は、キヌ ファむルをパスに沿っお Playbook リポゞトリに眮くこずです。
files/prod/certs/myapi.keyの堎合、倉数の倀は次のようになりたす。
api_ssl_key_file: "prod/certs/myapi.key"。 この利䟿性は、特定のスタンドでのシステムの展開を担圓する担圓者がファむルを保存するための専甚スペヌスをリポゞトリ内に持っおいるずいう事実にありたす。 同時に、蚌明曞が別のシステムによっお提䟛される堎合に備えお、サヌバヌ䞊の蚌明曞ぞの絶察パスを指定するこずも可胜です。

XNUMX ぀の環境に耇数のスタンド

倚くの堎合、差異を最小限に抑えた、ほが同䞀の耇数のスタンドを同じ環境に導入する必芁がありたす。 この堎合、環境䟝存倉数を、その環境内で倉化しない倉数ず倉化する倉数に分けたす。 そしお、埌者をむンベントリ ファむル自䜓に盎接転送したす。 この操䜜の埌、環境ディレクトリに別のむンベントリを盎接䜜成できるようになりたす。

group_vars むンベントリヌを再利甚し、いく぀かの倉数をそれ自䜓のために盎接再定矩するこずもできたす。

デプロむメント プロゞェクトの最終的なディレクトリ構造は次のずおりです。

mydeploy                        # КаталПг ЎеплПя
├── deploy.yml                  # Плейбук ЎеплПя
├── files                       # КаталПг Ўля файлПв ЎеплПя
│   ├── prod                    # КатПлПг Ўля среЎПзавОсОЌых файлПв стеМЎа prod
│   │   └── certs               # 
│   │       └── myapi.key       #
│   └── test1                   # КаталПг Ўля среЎПзавОсОЌых файлПв стеМЎа test1
├── group_vars                  # КаталПг переЌеММых плейбука
│   ├── all.yml                 # Ѐайл Ўля переЌеММых связО всей сОстеЌы
│   ├── myapi.yml               # Ѐайл переЌеММых свПйств группы myapi
│   ├── bbauth.yml              # 
│   └── ghauth.yml              #
└── inventories                 #
    ├── prod                    # КаталПг ПкружеМОя prod
    │   ├── group_vars          # КаталПг Ўля переЌеММых ОМвеМтПрО
    │   │   ├── myapi           #
    │   │   │   ├── vars.yml    # СреЎПзавОсОЌые переЌеММые группы myapi
    │   │   │   └── vault.yml   # Секреты (всегЎа среЎПзавОсОЌы)
    │   │   ├── bbauth          # 
    │   │   │   ├── vars.yml    #
    │   │   │   └── vault.yml   #
    │   │   └── ghauth          #
    │   │       ├── vars.yml    #
    │   │       └── vault.yml   #
    │   └── prod.ini            # ИМвеМтПрО стеМЎа prod
    └── test                    # КаталПг ПкружеМОя test
        ├── group_vars          #
        │   ├── myapi           #
        │   │   ├── vars.yml    #
        │   │   └── vault.yml   #
        │   ├── bbauth          #
        │   │   ├── vars.yml    #
        │   │   └── vault.yml   #
        │   └── ghauth          #
        │       ├── vars.yml    #
        │       └── vault.yml   #
        ├── test1.ini           # ИМвеМтПрО стеМЎа test1 в среЎе test
        └── test2.ini           # ИМвеМтПрО стеМЎа test2 в среЎе test

たずめ

蚘事に埓っお倉数を敎理した埌、各倉数ファむルは特定のタスクを担圓したす。 たた、ファむルには特定のタスクがあるため、各ファむルの正確さに察しお責任を負う人を割り圓おるこずが可胜になりたした。 たずえば、システム展開の開発者は、プレむブック倉数を正しく入力する責任を負いたすが、スタンドがむンベントリに蚘述されおいる管理者は、倉数のむンベントリを埋めるこずに盎接責任を負いたす。

ロヌルは独自のむンタヌフェむスを備えた独自の開発単䜍ずなり、ロヌル開発者はロヌルをシステムに合わせお調敎するのではなく、機胜を開発できるようになりたした。 この問題は、キャンペヌン内のすべおのシステムの共通の圹割に特に関係がありたした。

システム管理者は、展開コヌドを理解する必芁がなくなりたした。 デプロむメントを成功させるために必芁なのは、環境䟝存倉数のファむルを埋めるこずだけです。

文孊

  1. ДПкуЌеМтацОя

著者

カリュゞニ・デニス・アレクサンドロノィッチ

出所 habr.com

コメントを远加したす