2017-03-24 11 views
2

私はAWSでTerraformを使用してDocker Swarmクラスタを構築しようとしています。私はSwarmマネージャーを始めて成功裏に開始しましたが、(マネージャーの後に作成される)作業者に結合キーをどのように渡すのが最善かを試してみようとしています。Terraformはremote_execコマンドから変数を設定できますか?

私はTerraform変数に設定できるdocker swarm join-token worker -qコマンドを何らかの方法で実行したいと思います。そうすれば、労働者は次のようなremote_execコマンドを実行できますdocker swarm join ${var.swarm_token} ${aws_instance.swarm-manager.private_ip}

どうすればいいですか?

私の設定は以下の通りです:

resource "aws_instance" "swarm-manager" { 
    ami = "${var.manager_ami}" 
    instance_type = "${var.manager_instance}" 
    tags = { 
    Name = "swarm-manager${count.index + 1}" 
    } 

    provisioner "remote-exec" { 
    inline = [ 
     "sleep 30", 
     "docker swarm init --advertise-addr ${aws_instance.swarm-manager.private_ip}" 
     "docker swarm join-token worker -q" // This is the value I want to store as a variable/output/etc 
    ] 
    } 
} 

おかげ

答えて

5

あなたのリモートプロビジョニングスクリプトにサプリメントでexternal data sourceを使用することができます。

これは、あなたの群長マネージャーにシェルすることができ、プロビジョニング後にトークンを取得できます。

N個のスウォームマネージャーがいる場合は、マネージャーを作成した後ですぐにすべてを実行する必要があります。外部データソースはプレーンな文字列のマップを返します。したがって、各ノードに適切な結果を選択するためのキーを使用するか、またはセット全体を区切り文字列として返します。element()split()を使用して適切なアイテムを取得します。



resource "aws_instance" "swarm_manager" { 
    ami = "${var.manager_ami}" 
    instance_type = "${var.manager_instance}" 
    tags = { 
    Name = "swarm-manager${count.index + 1}" 
    } 
    provisioner "remote-exec" { 
    inline = [ 
     "sleep 30", 
     "docker swarm init --advertise-addr ${aws_instance.swarm-manager.private_ip}" 
    ] 
    } 
} 

data "external" "swarm_token" { 
    program = ["bash", "${path.module}/get_swarm_tokens.sh"] 
    query = { 
    swarms = ["${aws_instance.swarm_manager.*.private_ip}"] 
    } 
} 

resource "aws_instance" "swarm_node" { 
    count = "${var.swarm_size}" 
    ami = "${var.node_ami}" 
    tags = { 
    Name = "swarm-node-${count.index}" 
    } 
    provisioner "remote-exec" { 
    inline = [ 
     "# Enrol me in the right swarm, distributed over swarms available", 
     "./enrol.sh ${element(split("|", data.swarm_token.result.tokens), count.index)}" 
    ] 
    } 
} 
+0

ええ、私はそれをすべて避けることを望んでいました。ホーハム。 おそらくAnabilitiesを使うとスクリプトよりもプロビジョニングが良くなると思います – RiggerTheGeek

+0

ここでは、Vagrant/Docker/Centosの画像で働いていた統一されたプロビジョニングを思いつきました。 – Adrian

関連する問題