VMwareでコードとしてインフラストラクチャを構築した経験。 パート1:問題の兆候

読者の皆様、ご挨拶。 仮想VMware VSphere環境でコードとしてのインフラストラクチャアプローチを適用するためのソリューションをどのように探していたかについて、一連の記事を始めています。



Linux用のPuppet構成管理システムがあり、Windows Server用の(現時点では)DSCがあります。



Linuxに関しては、ほとんどすべてが自動化されています。 nodes.yamlにマシン構成を入力し、Hieraにロールを入力し、モジュールをビルド(または既製のものを取得)し、PXEを使用します。IPアドレスはDHCPからMACアドレスによって配布されます。



つまり、仮想マシンがLinuxを起動した瞬間から、仮想マシンの動作準備が整うまで、アクションは不要です。 このチェーンで手動で行われていることを推測してみてください? そうです、仮想マシン自体をVSphereで作成します。



私が最初にこの質問を提起したとき、彼らは解決策を探していて、オプションを試したが、何も機能しなかったと私に言った。 「地獄に!」次のシナリオに従って動作するソリューションを見つけると思い、ビール箱に賭けました:開発者またはエンジニアがプルリクエストを作成し、その中に仮想マシンの構成(カーネル、メモリ、ネットワーク、テンプレートなど)があります.d。)-ファイルの設定に従って、マジックがVSphereに移行してマシンを作成します。



私が取り組まなければならないことをあなたが理解できるように、私たちの環境について少しお話しましょう。



VMware VSphereは、オンプレミスの仮想化として使用します。2つのデータセンター、データストアクラスター、各コマンドの複数のリソースプール(RP)。 チームメンバーはRP内に仮想マシンを作成する権利があり、インフラストラクチャの担当者はこれに干渉せず、プラットフォーム全体のメンテナンスを行うだけで、開発者とエンジニアに未使用のマシン(非ゴムリソース)をクリーンアップするよう定期的に通知します。



Windows仮想マシン、Linux仮想マシンがあり、タスクの規模は巨大です-Webサーバー、リバースプロキシ、バランサー、ドメインコントローラー、アプリケーションサーバー、データベースサーバーなど、終わりはありません。



次に、使用しようとしたツールと、それらが私に合わなかった理由を説明します。



経験的に...



Ansible vsphere_guest



前の記事ですでに書いたように、私はAnsibleが大好きで、自動化に関しては、まずこれを使用できるかどうかを調べます。



ドキュメントによると、仮想マシンを作成および削除できる優れたモジュールvsphere_guestがあります。 必要なもの。 これは私のcreatevm.yamlプレイブックのようです



--- - name: Create a VM in resource pool hosts: localhost connection: local gather_facts: False vars_prompt: - name: "user" prompt: "Enter your username to virtualcenter" private: no - name: "password" prompt: "Enter your password to virtualcenter" private: yes - name: "guest" prompt: "Enter you guest VM name: " private: no tasks: - name: create VM vsphere_guest: vcenter_hostname: vcenter.example.com validate_certs: no username: '{{ user }}' password: '{{ password }}' guest: '{{ guest }}' state: powered_off vm_extra_config: vcpu.hotadd: yes mem.hotadd: yes notes: This is a test VM vm_disk: disk1: size_gb: 10 type: thick datastore: mydatastore vm_nic: nic1: type: vmxnet3 network: mynetwork network_type: standard vm_hardware: memory_mb: 1024 num_cpus: 1 osid: centos64Guest scsi: paravirtual resource_pool: "/Resources/MyResourcePool" esxi: datacenter: mysite #hostname: myesxhost01
      
      





ホストではなくRPで仮想マシンを直接作成するため、ホスト名esxiについて意図的にコメントします。 DRSは、仮想マシンを配置する場所を決定します。



プレイブックを実行する場合、必要なホスト名パラメーターが指定されていないことを誓います。 彼のコメントを外すと、esxホスト上に仮想マシンを作成する権限がないことを批判します(これは、RPの権限しかないためです)。 対応する問題を作成したので、Ansibleの人たちがこれを修正することを願っています。ツールが本当に良いからです。



テラフォーム



VMwareで仮想マシンを作成できるもう1つのツールは、HashiCorpの製品であるTerraformです。 当初、Packerとのやり取りのために投獄され、AWSにデプロイされましたが、タスクも解決します。 構成ファイル自体は次のとおりです。



 provider "vsphere" { user = “mylogin@example.com" password = "${var.vsphere_password}" vsphere_server = “virtualcenter.example.com" allow_unverified_ssl = "true" } resource "vsphere_virtual_machine" "test" { name = "${var.machine_name}" vcpu = 1 memory = 1024 domain = “test.example.com” datacenter = "mysite" resource_pool = "Production Cluster #1/Resources/myresourcepool" network_interface { label = "test" ipv4_address = "192.168.1.2" ipv4_prefix_length = "24" ipv4_gateway = "192.168.1.1" } disk { datastore = "${var.datastore}" size = "10" name = "${var.datastore}/${var.machine_name}/${var.machine_name}.vmdk" template = "mytemplate" } }
      
      





variables.tf

 variable "vsphere_password" {} variable "machine_name" { type = "string" default = "test" } variable "datastore" { type = "string" default = "mysite/mydatastore" }
      
      





テラフォーム計画は素晴らしい作品です。



  $ terraform plan var.vsphere_password Enter a value: supersecurepassword Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. The Terraform execution plan has been generated and is shown below. Resources are shown in alphabetical order for quick scanning. Green resources will be created (or destroyed and then created if an existing resource exists), yellow resources are being changed in-place, and red resources will be destroyed. Cyan entries are data sources to be read. Note: You didn't specify an "-out" parameter to save this plan, so when "apply" is called, Terraform can't guarantee this is what will execute. + vsphere_virtual_machine.test datacenter: "mysite" detach_unknown_disks_on_delete: "false" disk.#: "1" disk.1370406802.bootable: "" disk.1370406802.controller_type: "scsi" disk.1370406802.datastore: "" disk.1370406802.iops: "" disk.1370406802.keep_on_remove: "" disk.1370406802.key: "<computed>" disk.1370406802.name: "" disk.1370406802.size: "" disk.1370406802.template: "mytemplate" disk.1370406802.type: "eager_zeroed" disk.1370406802.uuid: "<computed>" disk.1370406802.vmdk: "" domain: “test.example.com” enable_disk_uuid: "false" linked_clone: "false" memory: "1024" memory_reservation: "0" name: "test" network_interface.#: "1" network_interface.0.ip_address: "<computed>" network_interface.0.ipv4_address: “192.168.1.2" network_interface.0.ipv4_gateway: "192.168.1.1" network_interface.0.ipv4_prefix_length: "24" network_interface.0.ipv6_address: "<computed>" network_interface.0.ipv6_gateway: "<computed>" network_interface.0.ipv6_prefix_length: "<computed>" network_interface.0.label: "test" network_interface.0.mac_address: "<computed>" network_interface.0.subnet_mask: "<computed>" resource_pool: "Production Cluster #1/Resources/myresourcepool" skip_customization: "false" time_zone: "Etc/UTC" uuid: "<computed>" vcpu: "1" Plan: 1 to add, 0 to change, 0 to destroy.
      
      





また、素晴らしいのは、IPアドレス、ドメイン名を設定できることです。つまり、テンプレートからマシンの完全なカスタマイズを設定できます。 実行しようとしています...



 Error applying plan: 1 error(s) occurred: * vsphere_virtual_machine.test: Datastore 'mysite/mydatastore not found. Terraform does not automatically rollback in the face of errors. Instead, your Terraform state file has been partially updated with any resources that successfully completed. Please address the error above and apply again to incrementally change your infrastructure.
      
      





うーん、データストアが見つかりません。 先ほど言ったように、クラスターがあるので、クラスターノードの1つを指定することで、汚いやり方でそれをやろうとします。



 Error applying plan: 1 error(s) occurred: * vsphere_virtual_machine.test: Datastore 'mysite/mydatastore/mydatastore-vol01' not found. Terraform does not automatically rollback in the face of errors. Instead, your Terraform state file has been partially updated with any resources that successfully completed. Please address the error above and apply again to incrementally change your infrastructure.
      
      





さて...再び失敗。 後に、Terraformはデータストアクラスターを操作できないことが判明しました。 対応する問題は私の同僚によってGitHubで作成されましたが、悲しいかな、この分野でも成功していません。



Powercli



サードパーティ製の作業ツールの検索に失敗したため、ベンダーソリューションに切り替えることにしました。



ベンダーは、PowerCLI(Powershellのアドオン)とvmware-cli(* nixのコマンドラインインターフェイス)の2つのソリューションを提供しています。



vmware-cliをCentOS 7およびOS Xで動作させることはできませんでした(被害者の1人がブログについても書いていました)ので、すぐに動作するツールの使用を開始することにしました。



気配りのある読者は、PowerCLIが長い間使用されているのに、なぜAnsibleとTerraformにこれほど多くの時間を費やしたのか疑問に思うかもしれません。 その理由は単純です-Powershellを適切なレベルで使用してスナップで使用を開始するのがわかりません。さらに、クリーンプロビジョニングを処理するWindowsマシンを使用する必要があります。 ただし、他のオプションはありません。



ドキュメントの簡単な研究により、簡単なスクリプトを書くのに十分なスキルが得られました。



 Param( [string]$Name, [string]$ResourcePool, [string]$Location, [int]$NumCPU, [int]$MemoryGB, [int]$DiskGB) $ErrorActionPreference = "Stop" Try { $credential = Get-Credential Add-PSSnapin VMware.VimAutomation.Core [string] $username = $credential.GetNetworkCredential().UserName $username = 'example\' + $username Connect-VIServer -Server virtualcenter.example.com -User $username -Password $credential.GetNetworkCredential().Password -Force $params = @{ name = $Name ResourcePool = $ResourcePool Location = $Location NumCPU = $NumCPU MemoryGB = $MemoryGB DiskGB = $DiskGB } new-vm @params } Catch [VMware.VimAutomation.ViCore.Types.V1.ErrorHandling.DuplicateName] {"VM exists"}
      
      





このスクリプトは機能しており、必要なすべてを実行します。 スクリプトの実行は次のとおりです。



  .\createvm.ps1 -Name mytestvm -ResourcePool myresourcepool -Location myteam -NumCPI 1 - MemoryGB 1 -DisckGB 10
      
      





スクリプトは、ログインとパスワードの入力、変数の再生、cmdlet'a new-vmを使用したマシンの作成を要求します。 読者は、この行がなぜ存在するのか疑問に思うかもしれません。



 [string] $username = $credential.GetNetworkCredential().UserName $username = 'example\' + $username
      
      





私が間違っている場合は、経験豊富なPowershellの人が私を修正しましょう。 Get-Credentialは、ログイン、パスワード、およびドメイン(存在する場合)で構成されるオブジェクトを作成します。 パスワードはSecureString状態です。 残念ながら、PowerCLIはGet-CredentialオブジェクトまたはSecureStringの操作方法を認識していないため、単純な文字列変数のユーザー名とパスワードを指定するには、このようなトリックを実行する必要があります。



結論



親愛なる読者、いつかVMwareで仮想マシンの作成を自動化するタスクがある場合は、次のことを考慮してください。





単一ノードのESXがある場合は、Ansibleを使用することをお勧めします。Ansibleはエントリのしきい値が低く、非常に軽量で機敏です。



私たちと同じ複雑なインフラストラクチャがある場合は、車輪を再発明するのではなく、PowerCLIを開発することをお勧めします。



次のパートでは、スクリプトをよりスマートにした方法を説明し、カスタマイズ、コアの数、その他のリソース、および命名規則を確認する方法を彼に教えました。



All Articles