0

AWSでterraformを使用して人形マスタースレーブ設定をセットアップしようとしています。 私は2つのEC2インスタンスを持っています.1つはマスタ、もう1つはスレーブです。私は人形のマスターとスレーブをインストールするために使用していますsetup.tfTerraform補間エラー:不正な置換

provider "aws"{ 
region="us-east-1" 
access_key="XXXX" 
secret_key="XXXX" 
} 

resource "aws_security_group" "default"{ 
     name="terraform-sg" 
     description="Created by terraform" 

ingress { 
from_port = 0 
to_port = 0 
protocol = "-1" 
cidr_blocks = ["0.0.0.0/0"] 
} 
egress{ 
from_port = 0 
to_port = 65535 
protocol = "tcp" 
cidr_blocks = ["0.0.0.0/0"] 
    } 

} 

resource "aws_instance" "puppet_master"{ 

connection={ 
user="ubuntu" 
key_file="/home/vaibhav/Downloads/puppet_elk.pem" 
} 

instance_type="t2.micro" 

ami="ami-fce3c696" 
key_name = "puppet_elk" 
security_groups= ["${aws_security_group.default.name}"] 
tags{ 
Name="master" 
} 

provisioner "file" { 
source = "./scripts/puppet-master.sh" 
destination = "~/puppet-master.sh" 
} 

provisioner "remote-exec" { 
inline = [ 
"chmod +x ~/puppet-master.sh", 
"~/puppet-master.sh puppet" 
    ] 
    } 
} 

resource "aws_instance" "puppet_node"{ 

depends_on = ["aws_instance.puppet_master"] 

connection={ 
user="ubuntu" 
key_file="/home/vaibhav/Downloads/puppet_elk.pem" 
} 

instance_type="t2.micro" 

ami="ami-fce3c696" 
key_name = "puppet_elk" 
security_groups= ["${aws_security_group.default.name}"] 
tags{ 
Name="node" 
} 

provisioner "file" { 
source = "./scripts/puppet-node.sh" 
destination = "~/puppet-node.sh" 
} 

provisioner "remote-exec" { 
inline = [ 
"chmod +x ~/puppet-node.sh", 
"~/puppet-node.sh node1" 
    ] 
    } 

スクリプトとしてスクリプト記述されている

は次のとおりです。スレーブの

#!/bin/bash 
if [ $# -eq 0 ] 
then 
echo "No hostname supplied" 
exit 
fi 
env=$1 
echo $env 
hostname=`hostname` 
myipaddress=$(ifconfig eth0 | awk '/inet addr/{print substr($2,6)}') 
sudo apt-get update -y 
sudo apt-get upgrade -y 
sudo wget http://apt.puppetlabs.com/puppetlabs-release-trusty.deb 
sudo dpkg -i puppetlabs-release-trusty.deb 
sudo apt-get update -y 
sudo apt-get -y install puppetmaster 
sudo sed -i "s/$hostname/$env/g" /etc/hostname 
sudo sed -i "s/no/yes/g" /etc/default/puppetmaster 
sudo echo "127.0.0.1 puppet.example.net puppet" >> /etc/hosts 
sudo echo "$myipaddress puppet.example.net puppet" >> /etc/hosts 

sudo reboot 

#!/bin/bash 
if [ $# -eq 0 ] 
then 
echo "No hostname supplied" 
exit 
fi 
env=$1 
echo $env 
hostname=`hostname` 
sudo apt-get update -y 
sudo apt-get upgrade -y 
sudo wget http://apt.puppetlabs.com/puppetlabs-trusty.deb 
sudo dpkg -i puppetlabs-release-trusty.deb 
sudo apt-get update -y 
sudo pt-get -y install puppet 
sudo ed -i "s/$hostname/$env/g" /etc/hostname 
sudo sed -i "s/no/yes/g" /etc/default/puppet 
# replace IP with the variable 

#masterip=${aws_instance.puppet-node.private_ip} 
sudo echo "${aws_instance.puppet_master.private_ip} puppet.example.net puppet" >> /etc/hosts 
sudo echo "${aws_instance.puppet_master.private_ip} puppet" >> /etc/hosts 
sudo puppet agent --enable 
sudo puppet agent --waitforcert 60 
sudo reboot 

私はこのスクリプトを実行します。私はスレーブシェルスクリプトで補間のエラーを受け取ります:

{} aws_instance.puppet_master.private_ip:悪い補間

私は、マスターIPを必要とする設定に、この補間文字列の代わりに人形のマスター・スレーブをマスタープライベートIPを代用します。

これに対応する回避策はありますか?

+0

ファイル提供者がそのように変数を補間するかどうかはわかりません。単にテンプレートプロビジョナ(https://www.terraform.io/docs/providers/template/)を使用して、テンプレートをuser_dataとしてawsインスタンスに渡すのはなぜですか? – ptierno

+0

@ptiernoこの理由はありません。なぜなら、ノードが始動するとノードの証明書に署名する必要があります。インスタンスにuser_dataを渡すことはできません。私はELKスタックパペットマニフェストを探しています。あなたがこれに何か助けを与えるなら、非常に感謝します。 :) –

答えて

0

シェルファイルで直接terraform varsを使用することはできません。これについて移動する彼らの方法は、()を使用%sのシェルコードであり、その後、$の形式を使用して直接VARを渡す:

例について:その後、

!/bin/bash 
if [ $# -eq 0 ] 
then 
echo "No hostname supplied" 
exit 
fi 
env=$1 
echo $env 
hostname=`hostname` 
sudo apt-get update -y 
sudo apt-get upgrade -y 
sudo wget http://apt.puppetlabs.com/puppetlabs-trusty.deb 
sudo dpkg -i puppetlabs-release-trusty.deb 
sudo apt-get update -y 
sudo pt-get -y install puppet 
sudo ed -i "s/$hostname/$env/g" /etc/hostname 
sudo sed -i "s/no/yes/g" /etc/default/puppet 
# replace IP with the variable 

#masterip=${aws_instance.puppet-node.private_ip} 
sudo echo "%s" >> /etc/hosts 
sudo echo "%s puppet" >> /etc/hosts 
sudo puppet agent --enable 
sudo puppet agent --waitforcert 60 
sudo reboot 

と、このようなもので値を渡します。

${format(file("path/to/file.json"), "${aws_instance.puppet_master.private_ip}","${aws_instance.puppet_master.private_ip}")} 
+1

時間をいただき、ありがとうございます。私はこの問題を回避するために、2つのパラメータを受け入れるようにスクリプトを修正し、次にリモートexecでインラインを使用して補間スクリプトを渡しました。 –

関連する問題