如何在 AWS 中的自定义 AMI 上设置 cloud-init?(CentOS) [英] How do I set up cloud-init on custom AMIs in AWS? (CentOS)

查看:40
本文介绍了如何在 AWS 中的自定义 AMI 上设置 cloud-init?(CentOS)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 AWS 中为实例定义用户数据对于执行各种引导类型的操作似乎非常有用.不幸的是,由于 PCI 原因,我必须使用并非源自提供的 AMI 之一的自定义 CentOS AMI,因此尚未安装和配置 cloud-init.我只希望它设置一个主机名并运行一个小的 bash 脚本.我如何让它工作?

Defining userdata for instances in AWS seems really useful for doing all kinds of bootstrap-type actions. Unfortunately, I have to use a custom CentOS AMI that didn't originate from one of the provided AMIs for PCI reasons, so cloud-init is not already installed and configured. I only really want it to set a hostname and run a small bash script. How do I get it working?

推荐答案

cloud-init 是一个非常强大但没有文档说明的工具.即使安装后,默认情况下仍有许多模块处于活动状态,它们会覆盖您可能已经在 AMI 上定义的内容.以下是从头开始进行最小设置的说明:

cloud-init is a very powerful, but very undocumented tool. Even once it's installed, there are lot of modules active by default that overwrite things you may have already defined on your AMI. Here are instructions for a minimal setup from scratch:

  1. 从标准存储库安装 cloud-init.如果您担心 PCI,您可能不想使用 AWS 的自定义存储库.

  1. Install cloud-init from a standard repository. If you're worried about PCI, you probably don't want to use AWS's custom repositories.

# rpm -Uvh https://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum install cloud-init

  • 编辑 /etc/cloud/cloud.cfg,一个 yaml 文件,以反映您想要的配置.以下是每个模块的最小配置和文档.

  • Edit /etc/cloud/cloud.cfg, a yaml file, to reflect your desired configuration. Below is a minimal configuration with documentation for each module.

    #If this is not explicitly false, cloud-init will change things so that root
    #login via ssh is disabled. If you don't want it to do anything, set it false.
    disable_root: false
    
    #Set this if you want cloud-init to manage hostname. The current
    #/etc/hosts file will be replaced with the one in /etc/cloud/templates.
    manage_etc_hosts: true
    
    #Since cloud-init runs at multiple stages of boot, this needs to be set so
    #it can log in all of them to /var/log/cloud-init.
    syslog_fix_perms: null
    
    #This is the bit that makes userdata work. You need this to have userdata
    #scripts be run by cloud-init.
    datasource_list: [Ec2]
    datasource:
      Ec2:
        metadata_urls: ['http://169.254.169.254']
    
    #modules that run early in boot
    cloud_init_modules:
     - bootcmd  #for running commands in pre-boot. Commands can be defined in cloud-config userdata.
     - set-hostname  #These 3 make hostname setting work
     - update-hostname
     - update-etc-hosts
    
    #modules that run after boot
    cloud_config_modules:
     - runcmd  #like bootcmd, but runs after boot. Use this instead of bootcmd unless you have a good reason for doing so.
    
    #modules that run at some point after config is finished
    cloud_final_modules:
     - scripts-per-once  #all of these run scripts at specific events. Like bootcmd, can be defined in cloud-config.
     - scripts-per-boot
     - scripts-per-instance
     - scripts-user
     - phone-home  #if defined, can make a post request to a specified url when done booting
     - final-message  #if defined, can write a specified message to the log
     - power-state-change  #can trigger stuff based on power state changes
    
    system_info:
      #works because amazon's linux AMI is based on CentOS
      distro: amazon
    

  • 如果/etc/cloud/cloud.cfg.d/中有defaults.cfg,删除它.

    要利用此配置,请为新实例定义以下用户数据:

    To take advantage of this configuration, define the following userdata for new instances:

    #cloud-config
    hostname: myhostname
    fqdn: myhostname.mydomain.com
    runcmd:
     - echo "I did this thing post-boot"
     - echo "I did this too"
    

    您也可以通过将 #cloud-config 替换为 #!/bin/bash 并将 bash 脚本放在正文中来简单地运行 bash 脚本,但是如果您这样做,您应该从 cloud_init_modules 中删除所有与主机名相关的模块.

    You can also simply run a bash script by replacing #cloud-config with #!/bin/bash and putting the bash script in the body, but if you do, you should remove all of the hostname-related modules from cloud_init_modules.


    请注意,这是最低配置,并且 cloud-init 能够管理用户、ssh 密钥、挂载点等.有关这些特定功能的更多文档,请查看下面的参考资料.

    Note that this is a minimal configuration, and cloud-init is capable of managing users, ssh keys, mount points, etc. Look at the references below for more documentation on those specific features.

    一般来说,cloud-init 似乎会根据指定的模块执行操作.某些模块,例如disable-ec2-metadata",只需指定即可执行操作.其他的,比如runcmd",只有在 cloud.cfg 或 cloud-config userdata 中指定了它们的参数时才会执行.下面的大部分文档只告诉你每个模块可以使用哪些参数,而不是模块的名称,但默认的 cloud.cfg 应该有一个完整的模块列表开始.我发现禁用模块的最佳方法就是将其从列表中删除.

    In general, it seems that cloud-init does stuff based on the modules specified. Some modules, like "disable-ec2-metadata", do stuff simply by being specified. Others, like "runcmd", only do stuff if their parameters are specified, either in cloud.cfg, or in cloud-config userdata. Most of the documentation below only tell you what parameters are possible for each module, not what the module is called, but the default cloud.cfg should have a complete module list to begin with. The best way I've found to disable a module is simply to remove it from the list.

    在某些情况下,rhel"可能比amazon"更适合用于发行版"标签.我真的不知道什么时候.

    In some cases, "rhel" may work better for the "distro" tag than "amazon". I haven't really figured out when.


    这篇关于如何在 AWS 中的自定义 AMI 上设置 cloud-init?(CentOS)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆