20

私は、ansible プロビジョナーで packer を使用して ami を構築し、terraform を使用してその ami をソースとしてインフラストラクチャをセットアップしています - この記事に多少似ています: http://www.paulstack.co.uk/blog/2016/01/ 02/build-an-elasticsearch-cluster-in-aws-with-packer-and-terraform

コマンドpacker build pack.jsonが正常に完了すると、出力 ami id が次の形式で取得されます。

eu-central-1: ami-12345678

私の terraform 変数variables.tfでは、ソース ami id、リージョンなどを指定する必要があります。ここでの問題は、それらを手動で、または複数回指定したくないということです。リージョン (事前に知っていること) については、両方の状況で環境変数を使用できるので簡単ですが、出力 ami はどうですか? これらの製品をチェーンする組み込みの方法はありますか、それともそれほどハックではないアプローチですか?

編集:興味があるかもしれない人のためのハッキーなアプローチ。このソリューションではgrep、パッカーの出力から aws リージョンと ami を取得し、perl で正規表現を使用して結果をterraform.tfvarsファイルに書き込みます。

vars=$(pwd)"/terraform.tfvars"
packer build pack.json | \
    tee /dev/tty | \
    grep -E -o '\w{2}-\w+-\w{1}: ami-\w+' | \
    perl -ne '@parts = split /[:,\s]+/, $_; print "aws_amis." . $parts[0] ." = \"" . $parts[1] . "\"\n"' > ${vars}
4

3 に答える 3

7

Hashicorp が推奨する「公式」の方法は、同社の製品である Atlas を 2 つの間の「仲介者」として使用することです。Packer で Atlas ポストプロセッサを使用してアーティファクト (この場合は AMI ID) を記録し、Terraform でリソースを使用atlas_artifactて ID を再度読み取り、Terraform で使用できるようにします。

この場合、変数を使用して ID を渡すのではなく、リソースから ID を取得します。

Atlas を除けば、他のオプションはかなり制限されており、場合によってはハックです。

外部サービスをまったく使用せずに実行したい場合は、アーティファクトでローカル コマンドを実行する方法として、ローカル シェル ポストプロセッサを試すか、機械可読出力を使用して AMI ID を抽出し、それらを Terraform の変数ファイルに書き込みます。

さらなるオプションは、Atlas の代替として、既に使用しているソフトウェアと相互作用する独自のポストプロセッサ プラグインを作成することです。たとえば、同僚の何人かと一緒に、アーティファクトをメタデータとして Buildkite に記録するポスト プロセッサを作成し、後で Buildkite APIを使用して取得しました。これには、Go でカスタム コードを記述する必要があります。

執筆時点では、Terraform バージョン 0.7 はまだ開発中ですが、AMI の EC2 API を直接クエリできる新機能を含める予定です。これにより、(実際に 0.7 に到達した場合) AMI にタグを付けるオプションがさらに可能になります。 Packer を使用して、これらのタグを使用して EC2 から直接見つけます。これは EC2 自体を「仲介者」として使用しますが、AMI のストレージとしてすでに関与していたので、おそらくそれほど厄介ではありません。

于 2016-05-21T02:33:58.227 に答える