Я пытаюсь установить 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
инструменты установлены, что и ожидалось, так как является AMI AWS Linux
РЕДАКТИРОВАТЬ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
согласно предложению Иордании. Похоже, что это предоставляет метаданные экземпляру, и, если я затем войду в систему и вручную выполню 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 config file = None configured module search path = [u'/home/ec2-user/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/local/lib/python2.7/site-packages/ansible executable location = /usr/local/bin/ansible python version = 2.7.13 (default, Jan 31 2018, 00:17:36) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
Итак, теперь мой вопрос: почему не cfn-init
выполнить в соответствии с UserData
?
РЕШЕНИЕ: Благодаря @jordanm я смог это понять. Мой рабочий фрагмент:
ansibleInstance: Type: 'AWS::EC2::Instance' Metadata: 'AWS::CloudFormation::Init': config: 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 UserData: Fn::Base64: !Sub | #!/bin/bash -xe # Install Ansible from the metadata /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'
- |+