在 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 中设置环境变量的主要内容,如果未能解决你的问题,请参考以下文章

在 Sinatra 的自定义错误块中设置状态码

以编程方式在 UINavigationController 中设置 UINavigationBar 的自定义子类

如何在 RatingBar 中设置星星的自定义大小

在 Android 的自定义适配器中设置 Textview 的文本的问题

如何在 PrimeNG 中设置我们自己的自定义主题

未在具有自定义文本字段的自定义 TableView 中设置第一响应者