the*_*ien 5 amazon-web-services amazon-cloudformation
我正在尝试在实例上安装 ansible。我想我可以AWS::CloudFormation::Init用来执行sudo pip install ansible. 不过,这似乎不起作用。这是我的实例资源:
ansibleInstance:
Type: 'AWS::EC2::Instance'
Metadata:
'AWS::CloudFormation::Init':
commands:
ansible:
command: "sudo pip install ansible"
test: "pip --version"
ignoreErrors: 'false'
Properties:
ImageId: ami-467ca739
KeyName: Candidate-EyMm7zuOcn
InstanceType: t2.micro
SubnetId: !Ref subnetTest
SecurityGroupIds:
- !Ref allowSSH
Tags:
- Key: Name
Value: Test
Run Code Online (Sandbox Code Playgroud)
有没有办法查看尝试执行此操作时发生的情况,以便我可以找出失败的位置/原因?有没有其他人可能会建议考虑解决这个问题?
EDIT1:我删除了sudo以防万一,以防万一,无论出于何种原因(我认为不会,但我还是想完全消除它)。那没有影响。我还验证了aws-cli工具已安装,这是预期的,因为它是AWS Linux AMI
EDIT2:这是 ansibleInstance 资源的一个版本,我试图在其中通过UserData以下方式执行命令:
ansibleInstance:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: ami-467ca739
KeyName: Candidate-EyMm7zuOcn
InstanceType: t2.micro
SubnetId: !Ref subnetTest
SecurityGroupIds:
- !Ref allowSSH
Tags:
- Key: Name
Value: Test
UserData:
Fn::Base64:
!Sub |
#!/bin/bash -xe
pip install ansible
Run Code Online (Sandbox Code Playgroud)
我怀疑格式有问题,但我无法弄清楚它是什么。
EDIT3:我cfn-init按照 jordanm 的建议运行。这似乎确实为实例提供了元数据,如果我然后登录并手动执行cfn-init命令将被处理:
[ec2-user@ip-192-168-1-121 ~]$ sudo /opt/aws/bin/cfn-init -v -s cfTest --resource ansibleInstance [ec2-user@ip-192-168-1-121 ~]$ ansible --version 安全的 2.5.4 配置文件 = 无 配置的模块搜索路径 = [u'/home/ec2-user/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python 模块位置 = /usr/local/lib/python2.7/site-packages/ansible 可执行位置 = /usr/local/bin/ansible python 版本 = 2.7.13(默认,2018 年 1 月 31 日,00:17:36)[GCC 4.8.5 20150623(红帽 4.8.5-11)]
所以现在我的问题是:为什么不cfn-init执行UserData?
解决方案:感谢@jordanm,我能够解决这个问题。我的工作片段:
ansible实例:
类型:'AWS::EC2::Instance'
元数据:
'AWS::CloudFormation::Init':
配置:
命令:
可靠的:
命令:“sudo pip install ansible”
测试:“pip --version”
忽略错误:'假'
特性:
图像 ID:ami-467ca739
KeyName: Candidate-EyMm7zuOcn
实例类型:t2.micro
SubnetId: !Ref subnetTest
安全组 ID:
- !Ref allowSSH
标签:
- 关键:姓名
值:测试
用户数据:
Fn::Base64:
!Sub |
#!/bin/bash -xe
# 从元数据安装 Ansible
/opt/aws/bin/cfn-init -v -s ${AWS::StackName} --resource ansibleInstance
你必须执行cfn-init才能AWS::CloudFormation::Init做任何事情。这通常是通过 cloud-init 用户数据完成的。以下是cfn-init 文档中的示例:
UserData: !Base64
'Fn::Join':
- ''
- - |
#!/bin/bash -xe
- |
# Install the files and packages from the metadata
- '/opt/aws/bin/cfn-init -v '
- ' --stack '
- !Ref 'AWS::StackName'
- ' --resource WebServerInstance '
- ' --configsets InstallAndRun '
- ' --region '
- !Ref 'AWS::Region'
- |+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5818 次 |
| 最近记录: |