AWS::CloudFormation::Init 不执行命令

the*_*ien 5 amazon-web-services amazon-cloudformation

我正在尝试在实例上安装 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
Run Code Online (Sandbox Code Playgroud)

有没有办法查看尝试执行此操作时发生的情况,以便我可以找出失败的位置/原因?有没有其他人可能会建议考虑解决这个问题?

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
Run Code Online (Sandbox Code Playgroud)

我怀疑格式有问题,但我无法弄清楚它是什么。

EDIT3: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
安全的 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(红帽 4.8.5-11)]

所以现在我的问题是:为什么不cfn-init执行UserData

解决方案:感谢@jordanm,我能够解决这个问题。我的工作片段:

  ansible实例:
    类型:'AWS::EC2::Instance'
    元数据:
      'AWS::CloudFormation::Init':
        配置:
          命令:
            可靠的:
              命令:“sudo pip install ansible”
              测试:“pip --version”
              忽略错误:'假'
    特性:
      图像 ID:ami-467ca739
      KeyName: Candidate-EyMm7zuOcn
      实例类型:t2.micro
      SubnetId: !Ref subnetTest
      安全组 ID:
      - !Ref allowSSH
      标签:
        - 关键:姓名
          值:测试
      用户数据: 
        Fn::Base64: 
          !Sub |
            #!/bin/bash -xe
            # 从元数据安装 Ansible
            /opt/aws/bin/cfn-init -v -s ${AWS::StackName} --resource ansibleInstance

jor*_*anm 5

你必须执行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'
      - |+
Run Code Online (Sandbox Code Playgroud)

  • @theillien 我将通过在实例上手动运行 cfn-init 进行测试。一旦您确切地弄清楚命令应该是什么并验证它正常工作,您可能会发现添加用户数据以在实例启动时自动运行更容易。使用 cfn-init 的主要好处是您可以使用 cfn-hup 应用对 Init 所做的更改。 (2认同)