在 opsworks 中的自定义 json 中设置环境变量
Posted
技术标签:
【中文标题】在 opsworks 中的自定义 json 中设置环境变量【英文标题】:Set an environment variables in the custom json in opsworks 【发布时间】:2017-05-04 09:20:51 【问题描述】:我正在开发一个创建 opsworks 堆栈的 AWS cloudformation 模板。 在我的堆栈中,我将有一个实例 (Ubuntu 14.04),将在实例中安装的所有应用程序和软件包都在 S3 存储桶提供的厨师食谱中进行配置。我需要在我的实例中设置一个环境变量,它的值是由 cloudformation 模板的一个参数设置的,这是模板:
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "AWS CloudFormation Template : Stack OpsWorks Slave pour deployer les instances script",
"Mappings":
"Region2Principal":
"us-east-1":
"EC2Principal": "ec2.amazonaws.com",
"OpsWorksPrincipal": "opsworks.amazonaws.com"
,
"us-west-2":
"EC2Principal": "ec2.amazonaws.com",
"OpsWorksPrincipal": "opsworks.amazonaws.com"
,
"us-west-1":
"EC2Principal": "ec2.amazonaws.com",
"OpsWorksPrincipal": "opsworks.amazonaws.com"
,
"eu-west-1":
"EC2Principal": "ec2.amazonaws.com",
"OpsWorksPrincipal": "opsworks.amazonaws.com"
,
"AWSInstanceType2Arch" :
"t1.micro" : "Arch" : "PV64" ,
"t2.micro" : "Arch" : "HVM64" ,
"m1.small" : "Arch" : "PV64" ,
"m1.large" : "Arch" : "PV64" ,
"m4.large" : "Arch" : "HVM64" ,
"m4.xlarge" : "Arch" : "HVM64" ,
"m4.2xlarge" : "Arch" : "HVM64" ,
"m4.4xlarge" : "Arch" : "HVM64" ,
"m4.10xlarge" : "Arch" : "HVM64" ,
"m4.16xlarge" : "Arch" : "HVM64" ,
"c3.large" : "Arch" : "HVM64" ,
"c3.xlarge" : "Arch" : "HVM64" ,
"c3.2xlarge" : "Arch" : "HVM64" ,
"c3.4xlarge" : "Arch" : "HVM64" ,
"c3.8xlarge" : "Arch" : "HVM64" ,
"c4.large" : "Arch" : "HVM64" ,
"c4.xlarge" : "Arch" : "HVM64" ,
"c4.2xlarge" : "Arch" : "HVM64" ,
"c4.4xlarge" : "Arch" : "HVM64" ,
"c4.8xlarge" : "Arch" : "HVM64"
,
"AWSRegionArch2AMI" :
"us-east-1" : "PV64" : "ami-5fb8c835", "HVM64" : "ami-60b6c60a" ,
"us-west-1" : "PV64" : "ami-56ea8636", "HVM64" : "ami-d5ea86b5" ,
"eu-west-1" : "PV64" : "ami-95e33ce6", "HVM64" : "ami-bff32ccc" ,
"us-west-2" : "PV64" : "ami-d93622b8", "HVM64" : "ami-f0091d91"
,
"Parameters":
"OpsWorksStackColor":
"Description": "RGB Color to use for OpsWorks Stack",
"Type": "String",
"Default": "rgb(38, 146, 168)"
,
"Region" :
"Type":"String",
"Description": "Region location of the template resources",
"Default": "eu-west-1",
"AllowedValues" : [ "us-east-1", "us-west-1", "us-west-2", "eu-west-1" ]
,
"SecurityGroupIds":
"Description": "Security groups that can be used to access the EC2 instances, do not select more than 5 SG",
"Type": "List<AWS::EC2::SecurityGroup::Id>",
"ConstraintDescription": "must be list of EC2 security group ids"
,
"VpcId":
"Type": "AWS::EC2::VPC::Id",
"Description": "VPC associated with the provided subnets",
"Default": "vpc-69e3320c",
"ConstraintDescription": "must be an existing VPC ID"
,
"SubnetId":
"Type": "String",
"Default": "subnet-6820eb31",
"ConstraintDescription": "must be an existing subnet ID"
,
"InstanceType":
"Type": "String",
"Default": "c3.large",
"AllowedValues" : ["t2.micro", "m1.small", "m1.large","m4.large","m4.xlarge","m4.2xlarge","m4.4xlarge","m4.10xlarge","m4.16xlarge","c4.large" , "c4.xlarge" ,"c4.2xlarge" , "c4.4xlarge","c4.8xlarge" , "c3.large" , "c3.xlarge", "c3.2xlarge", "c3.4xlarge" ,"c3.8xlarge"],
"ConstraintDescription": "must be a valid EC2 instance type"
,
"KeyPairName":
"Type": "AWS::EC2::KeyPair::KeyName",
"Default": "test-generic-ec2",
"ConstraintDescription": "must be the name of an existing EC2 KeyPair"
,
"CookbookS3" :
"Type": "String",
"Default": "https://s3-eu-west-1.amazonaws.com/MybucketJRBLO.cookbooks/cookbook-v2.tar.gz",
"ConstraintDescription": "the Url to the cookbook"
,
"CookbookS3AccessID":
"Type": "String",
"ConstraintDescription": "username to the appropriate IAM access key ID"
,
"CookbookS3AccessKey":
"Type": "String",
"NoEcho" : "true",
"ConstraintDescription": "password to the appropriate IAM secret access key"
,
"Environnement" :
"Description": "The Environnement variable ",
"Type": "String",
"Default": "test",
"AllowedValues" : ["dev", "test", "int", "prod"]
,
"Conditions" :
"CreateProdResources" : "Fn::Not" : [ "Fn::Equals" : [ "Ref" : "Environnement","test" ] ]
,
"Resources":
"MabStack":
"Type": "AWS::OpsWorks::Stack",
"Properties":
"AgentVersion" : "LATEST",
"Name": "Ref": "AWS::StackName" ,
"Attributes": "Color": "Ref": "OpsWorksStackColor" ,
"ChefConfiguration": ,
"ConfigurationManager": "Name": "Chef", "Version": "12" ,
"CustomCookbooksSource":
"Type": "s3",
"Password" : "Ref": "CookbookS3AccessKey" ,
"Username" : "Ref": "CookbookS3AccessID" ,
"Url": "Ref": "CookbookS3"
,
"CustomJson": "awscli": "profils":
"default": "role_arn": "Fn::GetAtt": [ "OpsWorksInstanceProfile", "Arn" ]
,
"chef_environment": "Ref" : "Environnement"
,
"DefaultInstanceProfileArn": "Fn::GetAtt": [ "OpsWorksInstanceProfile","Arn" ] ,
"DefaultOs": "Ubuntu 14.04 LTS",
"DefaultRootDeviceType": "ebs",
"DefaultSshKeyName": "Ref": "KeyPairName" ,
"DefaultSubnetId" : "Ref" : "SubnetId" ,
"ServiceRoleArn": "Fn::GetAtt": ["OpsWorksServiceRole", "Arn"] ,
"UseCustomCookbooks": true,
"UseOpsworksSecurityGroups" : true,
"VpcId" : "Ref" : "VpcId"
,
"MabLayer":
"Type": "AWS::OpsWorks::Layer",
"DependsOn" : "OpsWorksServiceRole",
"Properties":
"AutoAssignElasticIps" : false,
"AutoAssignPublicIps" : true,
"CustomRecipes" :
"Configure" : ["cassandra-php-driver::configure"],
"Setup" : ["cassandra-php-driver::setup", "security::setup"]
,
"CustomSecurityGroupIds" : "Ref" : "SecurityGroupIds" ,
"EnableAutoHealing" : true,
"InstallUpdatesOnBoot": false,
"LifecycleEventConfiguration":
"ShutdownEventConfiguration":
"DelayUntilElbConnectionsDrained": false,
"ExecutionTimeout": 120
,
"Name": "script-node",
"Shortname" : "node",
"StackId": "Ref": "MabStack" ,
"Type": "custom",
"UseEbsOptimizedInstances": true,
"VolumeConfigurations": [
"Iops": 10000,
"MountPoint": "/dev/sda1",
"NumberOfDisks": 1,
"Size": 20,
"VolumeType": "gp2"
]
,
"OpsWorksServiceRole":
"Type": "AWS::IAM::Role",
"Properties":
"AssumeRolePolicyDocument":
"Version" : "2012-10-17",
"Statement": [
"Effect": "Allow",
"Principal": "Service": [ "Fn::FindInMap": [ "Region2Principal", "Ref": "AWS::Region" ,"OpsWorksPrincipal" ] ] ,
"Action" : [ "sts:AssumeRole" ]
]
,
"Path": "/",
"Policies": [
"PolicyName": "opsworks-service",
"PolicyDocument":
"Version" : "2012-10-17",
"Statement": [
"Effect": "Allow",
"Action": "*",
"Resource": "*"
]
]
,
"OpsWorksInstanceRole":
"Type": "AWS::IAM::Role",
"Properties":
"AssumeRolePolicyDocument":
"Version" : "2012-10-17",
"Statement": [
"Effect": "Allow",
"Principal": "Service" : [ "Fn::FindInMap": [ "Region2Principal", "Ref": "AWS::Region" ,"EC2Principal" ] ] ,
"Action" : [ "sts:AssumeRole" ]
]
,
"Path": "/",
"Policies": [
"PolicyName": "aws-opsworks-instance",
"PolicyDocument":
"Statement": [
"Effect": "Allow",
"Action": "*",
"Resource": "*"
]
]
,
"OpsWorksInstanceProfile":
"Type": "AWS::IAM::InstanceProfile",
"Properties":
"Path": "/",
"Roles": [ "Ref": "OpsWorksInstanceRole" ]
,
"MabInstance":
"Type": "AWS::OpsWorks::Instance",
"Properties":
"Hostname": "Script",
"RootDeviceType": "ebs",
"StackId": "Ref": "MabStack",
"LayerIds": ["Ref": "MabLayer"],
"InstanceType": "Ref" : "InstanceType"
,
"MabApp":
"Type": "AWS::OpsWorks::App",
"Properties":
"AppSource" :
"Type" : "git",
"Url" : "git://github.com:soumab/JRLapplication.git",
"Revision" : "develop"
,
"Description": "Dataimport and connectors",
"Name" : "JRL-App",
"Shortname" : "JRL_app",
"StackId" : "Ref": "MabStack",
"Type" : "other"
,
我希望我的实例有这个环境变量:
export $Apps_ENV = "test" / "int" / "prod"
因此该值取决于用户将选择的内容。如何设置这个变量?可以通过CustomJson
吗?还是直接在菜谱里?请帮忙。谢谢。
【问题讨论】:
CustomJson
是使用 Chef 的资源 AWS::Opsworks::Stack
的属性。
【参考方案1】:
我通过以下设置成功实现了我想要的:
我在我的模板中将此添加到 CustomJson :
"settings" : "var" :
"default": "Apps_ENV": "Ref" : "Environnement"
我添加了一本如下的食谱
settings/recipes/defaults.rb :
template '/etc/environment' do
source 'env.erb'
owner 'root'
group 'root'
mode '0755'
end
和settings/templates/default/env.erb
:
<% node['settings']['var'].each do |var_name, var_att| %>
<%= sprintf("[%s]", var_name) %>
<% var_att.each do |attr_name, attr_value| %>
<%= sprintf("%s=%s", attr_name, attr_value) %>
<% end
end %>
【讨论】:
以上是关于在 opsworks 中的自定义 json 中设置环境变量的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式在 UINavigationController 中设置 UINavigationBar 的自定义子类