Cloudformation似乎有一个"输出"您可以拥有为其他堆栈引用的值,或显示给用户等的部分
是否可以使用它来使文件的内容可用?
e.g。我已经安装了Jenkins,其初始管理密码存储在:
中/var/lib/jenkins/secrets/initialAdminPassword
我希望在部署我们的Jenkins Cloudformation堆栈之后,无需再将SSH连接到服务器即可获得该值。
这可以通过输出部分或任何其他方式使用云形态模板吗?
答案 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