我正在尝试在实例上安装 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
有没有办法查看尝试此操作时发生的情况,以便我可以找出失败的位置/原因?有没有其他人可能建议看一下来解决这个问题?
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
我怀疑格式有问题,但我无法弄清楚它是什么。
EDIT3:我cfn-init
按照约旦的建议跑了。这似乎确实向实例提供了元数据,如果我随后登录并手动执行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(Red Hat 4.8.5-11)]
所以现在我的问题是:为什么不cfn-init
按UserData
?
解决方案:感谢@jordanm,我能够解决这个问题。我的工作片段:
实例: 类型:'AWS::EC2::Instance' 元数据: 'AWS::CloudFormation::Init': 配置: 命令: 可靠: 命令:“sudo pip install ansible” 测试:“点子--版本” 忽略错误:'假' 特性: ImageId:ami-467ca739 KeyName:Candidate-EyMm7zuOcn 实例类型:t2.micro SubnetId: !Ref 子网测试 安全组 ID: - !Ref 允许SSH 标签: - 键:名称 值:测试 用户数据: Fn::Base64: !子 | #!/bin/bash -xe # 从元数据安装 Ansible /opt/aws/bin/cfn-init -v -s ${AWS::StackName} --resource ansibleInstance
你必须执行
cfn-init
才能AWS::CloudFormation::Init
做任何事情。这通常通过 cloud-init 用户数据完成。以下是cfn-init 文档中的示例: