我正在尝试在实例上安装 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
有没有办法查看尝试此操作时发生的情况,以便我找出失败的位置/原因?其他人是否可能建议查看以找出原因?
编辑1:我删除了它,sudo
以防万一它因为某种原因妨碍了我(我没想到它会妨碍我,但我还是想把它消除掉)。这没有影响。我还验证了工具是否aws-cli
已安装,这是意料之中的,因为它是AWS Linux AMI
编辑2:这是我尝试通过以下方式执行命令的 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
我怀疑格式有问题,但我不明白是什么问题。
编辑3:我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 ansible 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,我能够解决这个问题。我的工作片段:
ansible实例: 类型:'AWS::EC2::Instance' 元数据: ‘AWS :: CloudFormation :: Init’: 配置: 命令: ansible: 命令:“sudo pip install ansible” 测试:“pip——版本” 忽略错误:'false' 特性: 图片编号:ami-467ca739 密钥名称:Candidate-EyMm7zuOcn 实例类型:t2.micro 子网 ID: !参考子网测试 安全组 ID: - !Ref allowSSH 标签: - 关键词:姓名 值:测试 用户数据: Fn::Base64: !子| /bin/bash -xe 的用法 # 从元数据安装 Ansible /opt/aws/bin/cfn-init -v -s ${AWS::StackName} --resource ansibleInstance
答案1
您必须执行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'
- |+