Назад | Перейти на главную страницу

AWS :: CloudFormation :: Init не выполняет команды

Я пытаюсь установить 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'
      - |+