Cloudformation - Использование параметров на сервере EC2 - PullRequest
0 голосов
/ 07 января 2020

Ниже мой шаблон облачной информации. В основном я хочу использовать параметр под названием «Пользователь» в команде в EC2 Ubuntu Server. Я перепробовал много решений, но команда mkdir не дает сбоев, остальная часть шаблона работает. В приведенном ниже примере я попытался установить значение «Пользователь» в качестве тега, а также свойства. Оба не удалось. Предложите, если вы видели такие примеры.

{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters": {
    "UserName": {
        "Type": "String",
        "Description": "Enter the username",
        "AllowedPattern": "[a-zA-Z0-9_\\-]+",
        "ConstraintDescription": "It should be a combination of characters from [A-Z],[a-z],[0-9],- and _."
    },
  "KeyName": {
  "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instances",
  "Type": "AWS::EC2::KeyPair::KeyName",
  "ConstraintDescription" : "must be the name of an existing EC2 KeyPair."
}
},
"Resources": {
    "EC2Ansiblemaster2743": {
        "Type": "AWS::EC2::Instance",
        "Metadata": {
            "User"   : { "Ref": "UserName" },
            "AWS::CloudFormation::Init" : {
                "configSets" : {
                    "CreateFile" : [
                        "create_file"
                    ]
                    },
                "create_file" : {
                    "files" : {
                        "/home/ubuntu/healthy.txt": {
                            "content": "Hello"
                    }
                    },


                    "commands" : {
                        "mkdir" : {
                        "command" : "sudo mkdir /home/$User" 
                    }
                        }
            }}
        },
        "Properties": {
            "AvailabilityZone": "us-east-2a",
            "ImageId": "ami-05c1fa8df71875112",
            "InstanceType": "t2.micro",
            "SourceDestCheck": false,
            "KeyName"        : { "Ref" : "KeyName" },
           "Tags" : [
                    {
                    "Key" : "User",
                    "Value" : { "Ref": "UserName" }
                    }],
            "UserData": {
                "Fn::Base64": {
                    "Fn::Join": [
                        "",
                        [    
                            "#!/bin/bash -xe\n",
                            "sudo apt-get update\n",
                            "sudo apt-get -y install python-pip\n",
                            "sudo pip install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
                            "# Install the files and packages from the metadata\n",
                            "sudo /usr/local/bin/cfn-init ",
                            "         --stack ",
                            {
                                "Ref": "AWS::StackName"
                            },
                            "         --resource EC2Ansiblemaster2743 ",
                            "         --configsets CreateFile ",
                            "         --region ",
                            {
                                "Ref": "AWS::Region"
                            },
                            "\n",
                            "# Signal the status from cfn-init\n",
                            "sudo /usr/local/bin/cfn-signal -e $? ",
                            "         --stack ",
                            {
                                "Ref": "AWS::StackName"
                            },
                            "         --resource EC2Ansiblemaster2743 ",
                            "         --region ",
                            {
                                "Ref": "AWS::Region"
                            },
                            "\n"
                        ]
                    ]
                }
            },
            "SecurityGroupIds": [
                {
                    "Ref": "EC2SG2AnsM0012743"
                }
            ]
        }
    },
    "EC2SG2AnsM0012743": {
        "Type": "AWS::EC2::SecurityGroup",
        "Properties": {
            "GroupName": "SGAnsibleMas2743",
            "GroupDescription": "First",
            "SecurityGroupIngress": [
                {
                    "CidrIp": "0.0.0.0/0",
                    "FromPort": "0",
                    "ToPort": "65535",
                    "IpProtocol": "tcp",
                    "Description": "From Anywhere"
                },
                {
                    "CidrIp": "0.0.0.0/0",
                    "FromPort": "22",
                    "ToPort": "22",
                    "IpProtocol": "tcp",
                    "Description": "SSH from anywhere , from and to port will be same - 22"
                }
            ]
        },
    }
}

}

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Я использовал Fn: Sub, чтобы получить параметр для Userdata.

            {
                                "Fn::Sub": 

                                [
                                "UserName=${variable}\n",
                                {
                                "variable": {
                                "Ref": "UserName"
                                 }
                                 }]

Позже я сверну 169.254.169.254/latest/user-data, чтобы извлечь строку имени пользователя. Пожалуйста, дайте мне знать, если есть более простое решение для этой проблемы.

0 голосов
/ 09 января 2020

Используйте функцию join intrinsi c, чтобы правильно сформировать командную строку, ссылаясь на имя пользователя в шаблоне.

"command" : "Fn::Join": [  "", "mkdir /home/", { "Ref": "UserName" }] 

Проблема в том, что ваша команда mkdir не разрешается так, как она есть у вас , Нет никакой связи между параметром имени пользователя и командой в разделе инициализации. Используя функцию Join, я формирую команду с правильным значением параметра.

...