Cloudformation:输出 - 您可以从文件返回值吗?

时间:2017-07-26 03:51:07

标签: amazon-web-services jenkins amazon-cloudformation

Cloudformation似乎有一个"输出"您可以拥有为其他堆栈引用的值,或显示给用户等的部分

The limited doc is here

是否可以使用它来使文​​件的内容可用?

e.g。我已经安装了Jenkins,其初始管理密码存储在:

/var/lib/jenkins/secrets/initialAdminPassword

我希望在部署我们的Jenkins Cloudformation堆栈之后,无需再将SSH连接到服务器即可获得该值。

这可以通过输出部分或任何其他方式使用云形态模板吗?

2 个答案:

答案 0 :(得分:3)

输出部分Cloud Formation模板旨在帮助您轻松找到资源。

对于您创建的任何资源,您可以输出Fb::GetAtt Documentation中定义的属性。

例如,要获取使用Cloud Formation模板创建的RDS实例的连接字符串,可以使用以下

"Outputs" : {
    "JDBCConnectionString": {
        "Description" : "JDBC connection string for the master database",
        "Value" : { "Fn::Join": [ "", 
            [ "jdbc:mysql://",
            { "Fn::GetAtt": [ "MyDatabase", "Endpoint.Address" ] },
            ":",
            { "Fn::GetAtt": [ "MyDatabase", "Endpoint.Port" ] },
            "/",
            { "Ref": "MyDBName" }]
        ]}
    }
}

无法从文件输出内容。此外,所有有权访问您的AWS账户的用户都可以看到输出。因此,不建议使用密码作为输出。

我建议您在云形成创建堆栈操作成功后将您的秘密上传到私有S3存储桶,并在需要时下载秘密。

希望这会有所帮助。

答案 1 :(得分:0)

我知道这个问题已经回答,但是我想提供另一个解决方案。

我发现自己想做自己想做的事情:使用Cloudformation在EC2实例上安装Jenkins,然后将初始管理员密码打印到Cloudformation输出中。

我最终尝试解决使用密码读取文件的问题,而是使用UserData部分中的Jenkins CLI用我指定的密码更新了admin用户。

这就是我所做的(显示YAML中模板的摘录):

在模板输入中添加了一个参数以获取密码:

Parameters:
  KeyName:
    ConstraintDescription: Must be the name of an existing EC2 KeyPair.
    Description: Name of an existing EC2 KeyPair for SSH access
    Type: AWS::EC2::KeyPair::KeyName
  PassWord:
    AllowedPattern: '[-_a-zA-Z0-9]*'
    ConstraintDescription: A complex password at least eight chars long with alphanumeric characters, dashes and underscores.
    Description: Password for the admin account
    MaxLength: 64
    MinLength: 8
    NoEcho: true
    Type: String

在UserData部分中,我在对jenkins-cli的调用中使用了PassWord参数来更新管理员帐户:

  UserData: !Base64
    Fn::Join:
      - ''
      - - "#!/bin/bash -x\n"
        - "exec > /tmp/user-data.log 2>&1\nunset UCF_FORCE_CONFFOLD\n"
        - "export UCF_FORCE_CONFFNEW=YES\n"
        - "ucf --purge /boot/grub/menu.lst\n"
        - "export DEBIAN_FRONTEND=noninteractive\n"
        - "echo \"deb http://pkg.jenkins-ci.org/debian binary/\" > /etc/apt/sources.list.d/jenkins.list\n"
        - "wget -q -O jenkins-ci.org.key http://pkg.jenkins-ci.org/debian-stable/jenkins-ci.org.key\n\
          apt-key add jenkins-ci.org.key\n"
        - "apt-get update\n"
        - "apt-get -o Dpkg::Options::=\"--force-confnew\" --force-yes -fuy upgrade\n"
        - "apt-get install -y python-pip\n"
        - "pip install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n"
        - "apt-get install -y nginx\n"
        - "apt-get install -y openjdk-8-jdk\n"
        - "apt-get install -y jenkins\n"
        - "# Wait for Jenkins to Set Up\n
        - until [ $(curl -o /dev/null --silent\
          \ --head --write-out '%{http_code}\n' http://localhost:8080) -eq 403\
          \ ]; do sleep 1; done\nsleep 10\n# Change the password for the admin\
          \ account\necho 'jenkins.model.Jenkins.instance.securityRealm.createAccount(\"\
          admin\", \""
        - !Ref 'PassWord'
        - "\")' | java -jar /var/cache/jenkins/war/WEB-INF/jenkins-cli.jar -s\
          \ \"http://localhost:8080/\" -auth \"admin:$(cat /var/lib/jenkins/secrets/initialAdminPassword)\"\
          \ groovy =\n/usr/local/bin/cfn-init --resource=Instance --region="
        - !Ref 'AWS::Region'
        - ' --stack='
        - !Ref 'AWS::StackName'
        - "\n"
        - "unlink /etc/nginx/sites-enabled/default\nsystemctl reload nginx\n"
        - /usr/local/bin/cfn-signal -e $? --resource=Instance --region=
        - !Ref 'AWS::Region'
        - ' --stack='
        - !Ref 'AWS::StackName'
        - "\n"

使用这种方法,当詹金斯(Jenkins)启动时,我没有得到“输入初始管理员密码”屏幕,而是得到了一个屏幕,我可以使用参数中使用的密码以管理员身份登录。 >

就向系统中文件的输出中添加内容而言,我认为有一种方法是使用WaitCondition并使用cfn-signal命令将数据传回。但是,一旦我确定只需要 set 密码,我就不会继续使用WaitCondition方法。

同样,我知道您有您的答案,但我想分享一下,以防其他任何人碰巧正在寻找一种方法来做到这一点。这样对我有用! :D