Estou tentando instalar ansible em uma instância. Eu percebi que poderia usar AWS::CloudFormation::Init
para executar sudo pip install ansible
. Isso não parece estar funcionando, no entanto. Este é o recurso da minha instância:
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
Existe uma maneira de ver o que está acontecendo quando isso é tentado para que eu possa descobrir onde / por que está falhando? Há alguma coisa que os outros possam sugerir que olhe para descobrir isso?
EDIT1: eu removi o sudo
apenas para o caso de estar atrapalhando por qualquer razão (eu não achei que seria, mas queria eliminá-lo da mesma forma) ). Isso não teve impacto. Também verifiquei que as ferramentas aws-cli
estão instaladas, o que era esperado, já que é o AWS Linux AMI
EDIT2: Esta é uma versão do recurso ansibleInstance em que tentei executar comandos via 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
Eu suspeito que há algo errado com a formatação, mas não consigo entender o que é isso.
EDIT3: corri cfn-init
pela sugestão jordanm. Isso parece fornecer os metadados para a instância e, se eu fizer login e executar manualmente cfn-init
, os comandos são processados:
[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)]
Então, agora, minha pergunta é: por que cfn-init
não será executado por UserData
?
SOLUÇÃO: Graças a @jordanm eu pude entender isso. Meu trecho de trabalho:
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