紹介
Terraformの出力は、プロジェクト状態からインフラリソースの情報を抽出するために使用されます。Terraformが使用するHashiCorp Configuration Language (HCL)の他の機能を利用して、リソース情報をクエリーし、リストやマップなどのより複雑なデータ構造に変換することができます。出力は、作成されたインフラリソースに操作する外部ソフトウェアに情報を提供するために便利です。
このチュートリアルで、Dropletsをデプロイするための簡単なインフラを作成して、Terraformの出力構文とそのパラメーターについて学びます。また、JSONに変換してプログラム的に解析する方法も学びます。
前提条件
- DigitalOceanのコントロールパネルから作成できる個人アクセストークン。 DigitalOceanの製品文書に基づいて指示を探すことができます。個人アクセストークンを作成する方法。
- あなたのローカルマシン上にTerraformをインストールし、DigitalOceanプロバイダーを使用したプロジェクトを設定します。手順1と手順2のTerraformをDigitalOceanと共用する方法チュートリアルを完了してください。プロジェクトフォルダーに
terraform-outputs
を名付けて、loadbalance
にします。手順2の間、pvt_key
変数とSSHキーリソースを含めないでください。 - HCLデータ型とループについての熟悉度。詳細についてはTerraform変数、依存関係、条件を使用して柔軟性を向上させる方法チュートリアルを参照してください。
注意:このチュートリアルはTerraform 1.0.2
で特定にテストされています。
出力の定義
この節で、Dropletを宣言し、クラウドに部署し、DropletのIPアドレスを表示する出力を定義することで、Dropletについて学びます。
前提条件として作成したterraform-outputs
ディレクトリから、droplets.tf
ファイルを作成して編集します:
以下のDropletリソースと出力定義を追加します:
ドロップルトン资源を宣言し、名前はweb
、実際の名はtest-droplet
、地域はfra1
、Ubuntu 20.04を运行させます。
次に、出力を宣言し、名称为droplet_ip_address
というものを作ります。Terraformでは、出力は内部値や計算値を見せるために使用されます。ここでは、value
パラメーターをIPアドレスを指定しています。宣言時点では不明ですが、部署後に利用可能です。出力は deployment 後に表示され、アクセス可能です。
ファイルを保存し、閉じます。そして、以下のコマンドでプロジェクトをデploy します:
deploy 時に提示されたyes
を入力します。输出の終了部分は次のようになります:
ハイラIGHTED 部分は新しくデployed されたDropletのIPアddress です。Applying プロジェクトはresources をcloud にdeploy し、deployment の末尾でoutputs を表示します。outputs はresource 属性を表示するために使用されます。outputs を使わずに、Droplet はdeployed されますが、除droplet_ip_address
以外、terraform は Droplet の他のattribute を表示しません。outputs を使って、deployed 後のresource attribute を見ることができます。
output コマンドを使用して、project 中のすべてのoutputs を表示します:
output はproject 中のすべてのoutputs を表示します:
Outputdroplet_ip_address = ip_address
output コマンドは特定のoutput 名を指定しても使用できます:
droplet_ip_address の場合、output はIP address だけを含む:
Outputip_address
output コマンドは、optional parameters も持つ:
– value: 必填参数, 出力値を指定する
– description: 出力の説明を提供する
– json: JSON 形式で出力値を返す
– format: 出力値を整形する格式を指定する
– visibility: 出力値を表示する visibility level を指定する
以上のoptional parameters を使用して、outputs を自定义することができます。
description
: 短いドキュメントを埋め込んで、出力が表示する内容を詳細に説明します。depends_on
: 各リソースに適用可能なメタパラメータで、Terraformが計画段階で自動で決まることができないリソースに依存していることを明示的に指定することができます。sensitive
: 真偽値を受け取ることができ、true
に設定されると、デプロイ後の出力内容が表示されなくなります。
sensitive
パラメータは、Terraformのデプロイメントのログが公共に利用可能であるとしても、出力内容が保持されるべきである場合に便利です。今回は、Dropletリソース定義にこれを追加します。
droplets.tf
を編集して、強調表示された行を追加します。
終了したら、ファイルを保存し閉じます。プロジェクトを再度デプロイするには、以下のコマンドを実行します。
質問が来たら、yes
を入力してください。出力が抜け金になっていることがわかります。
sensitive
として标记されているにも関わらず、出力とその内容は、Terraformの状態を見るか直接出力を問い合わせるなど、他のチャンネルを通じて依然として利用可能です。
次のステップで、異なるDropletと出力構造を作成します。そのために、以下のコマンドを実行して現在のデプロイを破棄します。
最終的な出力は以下の通りです。
Output...
Destroy complete! Resources: 1 destroyed.
Dropletを宣言し、IPアドレスを表示する出力を作成しました。今回は、出力を使ってリストやマップのより複雑な構造を表示する方法を学びます。
複雑な構成の出力
この节では、同じ定義を使用して複数のDropletsをデployし、各種形式でIPアddressを出力します。
使用したいfor
loop
最初に、Droplet資源定義を開くときには、次のように変更する必要があります:
変更してみましょう:
あなたはcount
キーを使って3個のDropletsを作成し、Droplet名に現在のindexを追加して、後で区別できるようにしました。既存の出力を削除しました。変更完了後、保存して閉じます。
コードを適用するために、以下のコマンドを実行します:
Terraformは3個の番号付きDroplets(test-droplet-0
、test-droplet-1
、test-droplet-2
)の作成を計画します。プロセスの中でyes
を入力して終了させます。最後に、次の出力が見えます:
Output...
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
これは意味するは、すべて3個のDropletsが成功にデployedされているから、そのすべての情報はプロジェクト状態に保存されています。
それらの資源属性を見る最簡単な方法は出力を使用することですが、それぞれのDropletに対して1つの出力を作成することは拡張性に矛盾します。解決策は、for
loopを使用してリストのDropletsを遍历し、その属性を取得するか、alternatively, you can use splat expressions (which you will learn about later in this step).
First, open droplets.tf
for editing:
Add the following lines:
The output value of droplet_ip_addresses
is constructed using a for
loop. Since it’s enclosed in curly braces, the resulting type will be a map. The loop iterates over the list of Droplets, pairs its name with its IP address, and appends it to the resulting map.
Save and close the file, then apply the project again:
Enter yes
when prompted and you’ll see the output contents at the end:
The droplet_ip_addresses
output details the IP addresses of the three deployed droplets.
Using the Terraform output
command, you can get the contents of the output as JSON using its command argument:
The result will be similar to the following:
JSON parsing is widely used and supported in many programming languages. This allows you to programmatically parse the information about the deployed Droplet resources.
スラット表現の使用
スラット表現は、リストのすべての要素を一旦イテレートして、属性の内容をそれぞれ集めてリストにする compact な方法を提供します。3つのデプロイされたドロップルのIPアドレスを抽出するスラット表現は以下の構文を持っています:
左側のリストを巡回し、それぞれの要素について右側の属性の内容を取り出します。左側の参照がリストではない場合、それは右側で指定された属性の内容を持つ単一の要素のリストに変換されます。
编辑用の droplets.tf
を開き、以下の行を変更してこの機能を实现します:
保存した後、以下のコマンドを実行してプロジェクトを適用します:
これにより、現在の出力はリストとなり、デプロイされたドロップルのIPアドレスだけを含むようになります:
JSON 形式の出力を取得するには、以下のコマンドを実行します:
出力は単一の配列になります:
これで、スラット表現と for
ループを使用して、デプロイされたドロップルのIPアドレスをエクポートし、出力内容を JSON 形式で受け取り、それらを解析するために jq
という、JSONに基づいた dynamic filtering を行うツールを使用できます。
Parsing Outputs 使用jq
このステップでは、Terraform プロジェクトの出力を解析するためにjq
というツールをインストールし、基礎知識を学びます。そして、これを使ってJSON文を manipulation します。今回は、jq
を使ってTerraformの出力を解析します。
Ubuntu 用户可以使用以下命令安装 jq
:
macOS 用户可以使用 Homebrew 来安装它:
jq
は与えられた処理 expressive を入力されたものから適用し、入力全体が出力されます。簡単な操作である場合は identity operator (.
) を使い、入力を無変更で输出します。
identity operator (.
) を使用すると、入力された JSON 文全体が出力され、改动されずに保持されます。
例えば次のように、入力全体を出力するために identity operator (.
) を使ってみます:
出力は次のようになります:
identity operator (.
) を使用すると、入力全体が出力され、改动されずに保持されます。
identity operator (.
) を使用すると、入力全体が出力され、改动されずに保持されます。
identity operator (.
) を使用すると、入力全体が出力され、改动されずに保持されます。
identity operator (.
) を使用すると、入力全体が出力され、改动されずに保持されます。
0:2 範囲は、 Range 0:2
は最初の2要素を返します—上部の範囲 (2
) は含まないので、位置 0
和 1
の要素が取得されます。
次に、部署済みの資源を破棄するために以下を実行してください:
このスtepで、あなたはjq
をインストールし、それを使用してTerraformプロジェクトの出力を解析および manipulatethe output of your Terraform project, which deploys three Droplets.
結論
あなたはTerraformの出力、それらを使用して deployed resources の詳細を表示し、外部処理に使用した後に manipulating the output of your Terraform project, which deploys three Droplets.
For more detailed information about the features of jq
, visit the official docs.
本教程是How To Manage Infrastructure with Terraform 系列的一部分。该系列涵盖了多个Terraform主题,从首次安装Terraform到管理复杂项目。