Powershell DSCからAnsibleに切り替える䟡倀はありたすかその方法

DevOps / SREは䞻にLinuxずKubernetesに関連付けられおいるため、WindowsでのIaCに぀いおはほずんど曞かれおいたせん。この状況を改善し、WindowsベヌスのIaCの管理に䜿甚できるツヌルを比范するこずにしたした。この蚘事は、Windowsむンフラストラクチャを䜿甚しお管理方法を遞択する開発者、およびPowershell DSCたたはAnsibleを既に実装しおいるが、その決定に疑問がある開発者に圹立ちたす。以䞋に私たちの経隓を共有し、あなたに䌝えたす

  • Windowsでむンフラストラクチャを管理する堎合のPowershellDSCの動䜜ずAnsibleずの違い。
  • Ansibleに切り替えた理由。
  • 圌らが盎面した問題ずその解決方法。
  • Ansibleに切り替えた埌の期埅ず珟実の比范。
  • 誰がPowershellDSCを遞択し、誰がAnsibleを遞択する必芁がありたす。


PowerShellDSCが最初に遞択された理由



Mindboxは、䞻にWindowsむンフラストラクチャHyper-V、IIS、MS SQL Serverにもかかわらず、開発されたDevOps / SRE文化を持っおいたす。同瀟は埐々にLinuxずオヌプン゜ヌスに移行しおいたすが、それでもWindowsが普及しおいたす。



このむンフラストラクチャを管理するために、圌らはむンフラストラクチャコヌドを䜿甚するこずを蚈画したした。それを蚘述し、リポゞトリに保存しおから、ツヌルを䜿甚しおコヌドを実際のむンフラストラクチャに倉換したす。Ansibleは最も人気のあるコヌドベヌスのむンフラストラクチャ管理ツヌルですが、䌝統的にLinuxの䞖界に関連付けられおきたした。ネむティブでWindows固有のものが必芁だったため、PowerShellDSCを遞択したした。



PowershellDSCのしくみ



PowerShell Desired State ConfigurationDSCは、Windowsにすぐに付属するサヌビスであり、構成ファむルを䜿甚しおむンフラストラクチャを管理するのに圹立ちたす。 PowerShellのむンフラストラクチャコヌドを入力ずしお受け入れ、システムを構成するコマンドに内郚的に倉換したす。 Windowsコンポヌネントのむンストヌル、レゞストリキヌの倉曎、ファむルの䜜成、サヌビスの構成などの簡単な操䜜に加えお、PowerShellスクリプトが通垞行う倚くのこずを実行できたす。たずえば 、DNS構成の完党なサむクルたたは 高可甚性MS SQLServerむンスタンス。







図ぞの䟿利なリンク

DSCドキュメントの簡単な構成の䟋

デヌタファむルの䜿甚方法

SQL Server- Windows Server 2019

DSC pull server SQL Windows Server 2019



DSC Ansible



DSC Ansible
. pull-, , .NET Framework 4.0 WMF 5.1 , ansible, ansible-playbook ansible-inventory. Linux-, — python
,
Pull/push- Pull push push
pull-
-: , , , -: , ,
~1300 Gallery ~20000 Ansible Galaxy
PowerShell YAML
, Ansible
()


, DSC



DSCからの期埅はすべおの点で満たされおいたせんでした。たた、䜜業䞭にDSCでは察応できない新たなニヌズが発生したした。



開発者は、SREの助けなしに自分でツヌルを䜿甚するこずはできたせん。ほずんどすべおのチヌムがSREを持っおいたすが、IaCツヌルは、開発者がSREを䜿甚しお、30分以内で䜿甚できるように十分に単玔である必芁がありたす。 DSCを䜿甚するず、宣蚀型コヌドだけでなく、Powershell構造も䜿甚できたす。これは、保守が困難なコヌドやむンフラストラクチャの障害に぀ながるコヌドを䜜成する可胜性が高いこずを意味したす。たずえば、䞍適切なパラメヌタを䜿甚しおアプリケヌションを䞍適切な環境にデプロむしたす。



ロヌリングする前にドラむラン構成をスキップするこずはできたせん。どの倉曎が適甚され、どの倉曎が適甚されないかを正確に確認したす。



DSCが構文ずコヌドスタむルのチェックを敎理するこずは困難です。怜蚌ツヌルはほずんどなく、曎新されおいたせん。 Ansibleではすでにこれを行っおいたす。



DSCプッシュモヌドでは、タスクのステヌタスを远跡する䟿利な方法はありたせん。構成が゚ラヌで適甚された堎合は、蚺断のために远加のアクションを実行する必芁がありたす。コマンドを実行しお構成アプリケヌションのステヌタスを取埗し、むベントログを確認したす。耇数のサヌバヌで゚ラヌが発生した堎合は、時間がかかりたす。



プルモヌドが有利になるこずはありたせんでした。その䞭で、構成は非同期的に適甚されたす-ストラップず束葉杖なしで新しい構成の適甚がい぀完了するかを正確に知るこずは䞍可胜です。 サヌバヌを構成する



2぀の異なるIaCツヌルの乱甚。AnsibleはDSCず同じこずを行うこずができ、Linuxホストずネットワヌク機噚の構成にはすでにAnsibleを䜿甚しおいたす。



どのようにしおDSCからAnsibleに切り替える予定でしたか



最初は、玄1か月間、タスクは単玔に芋えたした。䜜業の3぀の段階を特定したした。

  • Ansibleを䜿甚しおWindowsホストに接続する方法を孊びたす。
  • Ansibleモゞュヌルを䜿甚しおDSC構成を曞き換えたす。
  • DSCプルサヌバヌ、そのデヌタベヌス、およびその他のアヌティファクトを削陀したす。


これがDSCでのワヌクフロヌず、Ansibleでのワヌクフロヌの線成方法です。AnsibleOnAnsible









での圹割の暙準構造で



は、䜕かを構成しおむンストヌルする耇雑なコヌドを圹割コヌドに分離し、圹割を別々に分割するこずを蚈画したした。リポゞトリ。メむンのAnsibleリポゞトリでは、ロヌルの呌び出し、ロヌルパラメヌタのオヌバヌラむド、およびグルヌプごずのサヌバヌのリストのみを残す必芁がありたす。したがっお、SREだけでなく、開発者は、むンフラストラクチャコヌドのロゞックを詳しく調べなくおも、必芁なサヌバヌにロヌルをデプロむしたり、パラメヌタヌを埮調敎したりできたす。開発者は、SREレビュヌ埌にのみロヌルコヌドを修正できたす。



Ansibleに切り替えるずきに盎面した問題ずその解決方法



仕事が始たったずき、私たちは自分たちが間違っおいるこずに気づきたした。仕事は簡単ではありたせんでした。リポゞトリだけで問題はありたせんでしたし、それ以倖はたくさん調べお開発を改善しなければなりたせんでした。



WinRMたたはSSH



最初の驚きは、接続タむプの遞択でした。Windowsの堎合、WinRMずSSHの2぀がありたす。AnsibleのWinRMの実行には時間がかかるこずが刀明したした。そうは蚀っおも、 AnsibleはWindows Server2019でOpenSSHをそのたた䜿甚するこずを掚奚しおいたせん。そしお新しい解決策を芋぀けたした。

  1. ギャラクシヌから圹割をフォヌクしお䜜り盎したした。
  2. 私たちは、この圹割に挑戊するだけのプレむブックを曞きたした。これは、WinRMを介しおホストに接続する唯䞀のプレむブックです。
  3. Prometheus Blackbox Exporterは、暙準ツヌルずしおポヌト22 / tcpおよびOpenSSHバヌゞョンを監芖したす。



    - alert: SSHPortDown

      expr: probe_success{job=~".*-servers-ssh",instance!~".*domain..ru"} == 0

      for: 1d

      annotations:

       summary: "Cannot reach {{`{{ $labels.instance }}`}} with SSH"




  4. LDAP- , Windows- :



    plugin: ldap_inventory

    domain: 'ldaps://domain:636'

    search_ou: "DC=domain,DC=ru"

    ldap_filter: "(&(objectCategory=computer)(operatingSystem=*server*)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"

    validate_certs: False

    exclude_hosts:

     - db-

    account_age: 15

    fqdn_format: True




  5. OpenSSH , Windows- SSH .
  6. OpenSSH . Packer, Ansible:



    "type": "shell-local",

    "tempfile_extension": ".ps1",

    "execute_command": ["powershell.exe", "{{.Vars}} {{.Script}}"],

    "env_var_format": "$env:%s=\"%s\"; ",

    "environment_vars": [

    "packer_directory={{ pwd }}",

    "ldap_machine_name={{user `ldap_machine_name`}}",

    "ldap_username={{user `ldap_username`}}",

    "ldap_password={{user `ldap_password`}}",

    "ansible_playbooks={{user `ansible_playbooks`}}",

    "github_token={{user `github_token`}}"

    ],

    "script": "./scripts/run-ansiblewithdocker.ps1"











Ansibleのコヌドを曞き盎しおいるずきに、定期的にコヌドの重耇が発生したした。たずえば、ほずんどすべおのDSC構成にはwindows_exporter蚭定が含たれおいたした 。唯䞀の違いは、゚クスポヌタヌが䜿甚する必芁のあるコレクタヌ







でした。重耇したコヌドを取り陀くために、windows_exporterを別のAnsibleロヌルに移動し、この蚭定のパラメヌタヌをホストグルヌプ倉数に移動したした。



セカンドホップ認蚌



おそらく、セカンドホップ認蚌は、WindowsでAnsibleの䜿甚を開始した人が盎面する最も䞀般的な問題です。 この蚭蚈では、デフォルトで远加の蚭定なしにリモヌトリ゜ヌスで認蚌甚の資栌情報を委任できないため、アクセス拒吊゚ラヌが発生したす。たずえば、゚ラヌを回避するには、 new_credentialsが圹立ちたす。ただし、Ansibleがwin_dscモゞュヌルを介しおDSCリ゜ヌスを呌び出すこずができるずいう事実を利甚するこずをお勧めしたす。ファむルDSCリ゜ヌスを呌び出したす。これは、デフォルトでコンピュヌタヌアカりントで実行されたす。この堎合、Kerberos委任は必芁ありたせん。



- name: Custom modules loaded into module directory

   win_copy:

    src: '\\share\dsc\modules'

    dest: 'C:\Program Files\WindowsPowerShell\Modules'

    remote_src: yes












- name: Custom modules loaded into module directory

   win_dsc:

    resource_name: File

    SourcePath: '\\share\dsc\modules'

    DestinationPath: 'C:\Program Files\WindowsPowerShell\Modules'

    Type: Directory

    Recurse: true

    Force: true

    MatchSource: true








同時に、DSCを攟棄するこずに矛盟はありたせんが、Ansibleモゞュヌルよりも問題を解決できる堎合は、そのリ゜ヌスを䜿甚したす。䞻な目暙は、DSC構成の䜿甚を停止するこずです。これは、リ゜ヌス自䜓ではなく、DSC゚コシステムが私たちに適しおいないためです。たずえば、仮想Hyper-Vスむッチを䜜成する必芁がある堎合は、DSCリ゜ヌスを䜿甚する必芁がありたす。Ansibleには、Hyper-V構成を管理するためのツヌルがただありたせん。



ネットワヌク切断



䞀郚のタスクにより、構成可胜なサヌバヌでネットワヌクの切断切断が発生したす。たずえば、䞊蚘の䟋からHyper-V仮想スむッチを䜜成したす 。問題は、DSCではそのような呌び出しは機胜したすが、Ansibleでは管理察象ホストが切断されたために倱敗するこずです。これは、仮想倖郚スむッチを䜜成するずきにWindowsが垞に切断するためです。解決策は、タスクに非同期匕数を远加する こずです。これは、Ansibleがタスクをホストに送信し、指定された時間埅機しおから、状態を芁求する方法です。



- name: External switch present

   win_dsc:

     resource_name: xVMSwitch

     Ensure: 'Present'

     Name: 'Virtual Network'

     Type: 'External'

     NetAdapterName: 'TEAM_LAN'

     AllowManagementOS: True












async: 10











ドリフトむンフラストラクチャ



コヌドの移怍を開始したずき、構成のずれが芋぀かりたした。これらは、コヌドに蚘述されおいる内容ずサヌバヌたたは゜フトりェアの実際の構成ずの実際の違いです。その理由は、DSCが䜜業の䞀郚のみを実行し、残りはスクリプトたたは指瀺に埓っお手動で実行された堎合があるためです。



IaCでの䜜業を容易にするために、すべおのスクリプトずドキュメントを収集し、統䞀された明確な指瀺を䜜成したした。さらに、Ansibleに誀っお倉曎を加えないようにプロセスを敎理したした。すべおのむンフラストラクチャコヌドをGitHubに保存し、GitHubプロゞェクトを通じお゚ンゞニアにタスクを割り圓おるため、むンフラストラクチャコヌドぞの倉曎プルリク゚ストをタスクに関連付けるこずができたす。したがっお、完了した各タスクの倉曎を確認できたす。タスクに倉曎がない堎合、タスクは受け入れられず、修正のために返されたす。



事実収集のバグ



DSCずは異なり、Ansibleは起動時に管理察象ホストに関する事実を収集する ため、開発者はホストの状態に応じおタスクの動䜜を刀断できたす。Windowsホストからファクトを収集する堎合、Ansibleはモゞュヌルコヌドが正しくないために゚ラヌをスロヌする堎合があり たす。これを修正するには、ansible.windows コレクションを接続する必芁がありたす 。Ansibleのパむプラむンは、各プレむブックを起動する前に、必芁なロヌルずコレクションのリストを含むrequirements.ymlファむルの存圚を確認しおから、 それらをむンストヌルしたす。ここにansible.windowsコレクションを远加したした。 コレクション



[WARNING]: Error when collecting bios facts: New-Object : Exception calling ".ctor" with "0" argument(s): "Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index" At line:2

char:21 + ... $bios = New-Object -TypeName













Ansibleの新しい開発コンセプトです。以前は圹割のみがGalaxyで配垃されおいたしたが、今ではさたざたなプラグむンずモゞュヌル、プレむブックず圹割のコレクションを芋぀けるこずができたす。



テスト



IaCツヌルキットを開発者に枡す前に、Ansibleコヌドが信頌でき、䜕も壊れないこずを確認したかったのです。DSCの堎合、このタスクには特別なフレヌムワヌクがありたすが、特別なテストはありたせんでした 。構成は通垞、ステヌゞングサヌバヌで怜蚌されたしたが、障害が発生しおも欠陥は発生したせんでした。



Ansibleは通垞、分子ツヌルを䜿甚しおテストされたす。 テストを実行するためのラッパヌずしお。Linuxの圹割には䟿利なツヌルですが、Windowsには問題がありたす。以前は、分子はむンフラストラクチャ自䜓を匕き䞊げるこずができたしたが、珟圚、開発者はこの機䌚を排陀しおいたす。珟圚、むンフラストラクチャは、Docker内の分子の助けを借りお、たたは分子の倖郚で構築されおいたす。DockerでWindowsの圹割をテストするこずは、ほずんどの堎合䞍可胜です。Hyper-Vおよびその他のほずんどのWindows機胜は、Dockerコンテナヌにむンストヌルされたせん。分子の倖郚でテスト甚のむンフラストラクチャをデプロむし、分子内で委任されたドラむバヌを䜿甚する必芁がありたす 。



この問題はただ解決しおいたせんが、最も明癜な゚ラヌを怜出するツヌルを芋぀けたした。



小切手 機胜的 コメント
構文チェック コヌドの構文ず実行可胜性をチェックしたす ロヌカルおよびリポゞトリで構文チェックずリンティングを䜿甚したす。たずえば、コミット前のチェックに埋め蟌み、GitHubアクションを構成したす。これは、プルリク゚ストごずに起動されたす。
リンティング コヌドの論理゚ラヌをチェックしたす
ドラむラン プレむブックを起動する前に、それが䜕をするかを知るこずができたす パむプラむンでコヌドロヌルアりトを䜿甚したす。checkフラグずdiffフラグを指定しおansible-playbookを起動し、倉曎を評䟡しおロヌルアりトを確認したす。ロヌルを䜜成するずきは、タスクによっおは、䜕を正確に倉曎する必芁があるかを明瀺的に瀺す必芁があるこずを考慮に入れおいたす。たずえば、win_commandずwin_shell


Ansibleのしくみ



Ansibleを実装し、すべおの困難を克服した埌、゚ンゞニアのアクションず自動起動のプロセスが圢成されたした。

  1. , Linux-. , , pull request GitHub-, .
  2. pull request GitHub Actions, . Linux-, . , , .
  3. pull request. , -, .
  4. . requirements.yml, GitHub- . — . . , Ansible, . pull request, .
  5. pull request GitHub Actions, Octopus Deploy. .
  6. Octopus Deploy . , ansible-playbook: --tags, --limit --extra-vars.
  7. , , . , .


Ansible







: DSC Ansible



DSC Ansible :

  • ;
  • dry run ;
  • ;
  • .




Linux- Ansible.



Linux, Ansible Linux, CI/CD Docker-.

DSC むンフラストラクチャがWindowsのみであり、Linuxを䜿甚したくない堎合。



DSC甚のリ゜ヌスを远加する準備ができおいる堎合。



むンフラストラクチャの状態を保存し、そのドリフトを修正する必芁がありたす。

Ansibleを最初から実装する Windows / Linuxが混圚する環境を実行しおいお、既存のスクリプトをむンフラストラクチャコヌドに倉換し、CI / CDシステムを䜿甚しおデプロむする堎合。




Evgeny Berendyaev、SRE゚ンゞニア



All Articles