【发布时间】:2016-10-14 04:37:06
【问题描述】:
我正在尝试在 AWS 上使用 terraform 设置 puppet 主从设置。 我有 2 个 EC2 实例,一个是主实例,第二个是从属实例。
我已将脚本编写为 setup.tf
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"
]
}
我用于安装 puppet master 和 slave 的脚本是:
#!/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
当我运行这个脚本时,我得到了从 shell 脚本中插值的错误:
{aws_instance.puppet_master.private_ip}:插值错误
我想用主私有 IP 代替这个插值字符串来在 puppet 中设置主从我需要主 IP。
有什么办法解决这个问题吗?
【问题讨论】:
-
我不确定文件配置器会以这种方式插入变量。为什么不直接使用模板配置器 (terraform.io/docs/providers/template) 并将模板作为 user_data 传递给 aws 实例。
-
@ptierno 我不能这样做背后的原因是,一旦节点启动,我必须在 master 上签署节点证书,并且在将 user_data 传递给实例的情况下这是不可能的。无论如何我正在寻找ELK stack puppet manifest,如果您在这方面提供任何帮助,我们将非常感激。 :)
标签: shell amazon-web-services puppet amazon-cloudformation terraform