如何在cloud-init中编写自己的cloud-config?

时间:2014-10-19 13:51:13

标签: coreos cloud-init

cloud-init功能强大,可将用户数据注入VM实例,其现有模块提供了大量可能性。

虽然为了让它更易于使用,我想在下面定义我的自己的标记,例如核心,请参阅running coreos in openstack

中的详细信息
#cloud-config

coreos:
  etcd:
    # generate a new token for each unique cluster from https://discovery.etcd.io/new
    discovery: https://discovery.etcd.io/<token>
    # multi-region and multi-cloud deployments need to use $public_ipv4
    addr: $private_ipv4:4001
    peer-addr: $private_ipv4:7001
  units:
    - name: etcd.service
      command: start
    - name: fleet.service
      command: start

所以我可以使用我自己定义的标签/配置myapp

#cloud-config
myapp:
  admin: admin
  database: 192.168.2.3

我是cloud-init的新手,是否称为模块?它在文档http://cloudinit.readthedocs.org/en/latest/topics/modules.html

中为空

您能提供一些信息来描述我如何编写自己的模块吗?

2 个答案:

答案 0 :(得分:3)

您需要在合适的目录中编写“cc”模块,并修改一些配置。它不是非常简单,但肯定可行(我们经常使用它)。

  1. 找到cloudconfig模块的目录。在Amazon Linux上,这是/usr/lib/python2.6/site-packages/cloudinit/config/,但目录位置在不同的云init版本和发行版中有所不同。找到这个的最简单方法是找到一个名为cc_mounts.py的文件。

  2. 在您的案例cc_myapp.py中添加新文件。复制一些现有脚本作为基础,以了解在那里写什么。重要的功能是def handle(name,cfg,cloud,log,args):,它基本上是脚本的入口点。

  3. 实施您的逻辑。 cfg参数有一个python对象,它是解析的YAML配置文件。所以对于你的情况你会做类似的事情: myapp = cfg.get('myapp') admin = myapp.get('admin') database = myapp.get('database')

  4. 确保您的脚本被cloud-init调用。如果您的发行版使用标准的cloud-init设置,则只需添加该文件即可。否则,您可能需要将其添加到/etc/cloud/cloud.cfg.d/defaults.cfg或直接添加到/etc/cloud/cloud.cfg。有一些名为cloud_init_modulescloud_config_modules等的键,它们对应于init进程的不同部分,您可以在其中运行脚本。如果这不能直接使用,您可能需要进行一些调查,以了解如何在系统上调用模块。例如,Amazon Linux过去在init.d脚本中有一个硬编码的模块列表,忽略配置文件中指定的任何列表。
  5. 另请注意,默认情况下,您的脚本每个实例只运行一次,这意味着重新运行cloud-init将不会再次运行您的脚本。您需要通过在列出模块的配置文件中将frequency设置为always来将脚本标记为每次启动,或者删除标记文件,说明脚本已运行,该文件位于{{ 1}}喜欢/var/lib/cloud

答案 1 :(得分:0)

为您粘贴我的便条:

config:在VM中安装cloud-init之后,如果您想拥有使用passwd访问的root权限,请执行以下简单配置

修改/etc/cloud/cloud.cfg,如下所示

users:
 - defaults
disable_root:0
ssh_pwauth: 1

注意:ssh_pwauth:&#34;它会自动修改PasswordAuthentication中的sshd_config1表示yes

使用方法: 可以使用cloud-init配置user data的行为。在实例开始时用户可以填写用户数据(用户数据限制为16K)。

主要有几种方法可以做(测试):

  1. 用户数据脚本

    $ cat myscript.sh
    #!/bin/sh
    echo "Hello World. The time is now $(date -R)!" | tee /root/output.txt
    
  2. 启动实例时,添加参数--user-data myscript.sh,实例将在启动期间运行一次脚本,并且只运行一次。

    1. 云配置语法:
    2. 它是基于YAML的,请参阅http://bazaar.launchpad.net/~cloud-init-dev/cloud-init/trunk/files/head:/doc/examples/

      运行脚本

          #cloud-config
          runcmd:
          - [ ls, -l, / ]
          - [ sh, -xc, "echo $(date) ': hello world!'" ]
          - [ sh, -c, echo "=========hello world'=========" ]
          - ls -l /root
          - [ wget, "http://slashdot.org", -O, /tmp/index.html ]
      

      更改主机名,密码

          #cloud-config
          chpasswd:
            list: |
               root:123456
            expire: False
          ssh_pwauth: True
          hostname: test
      
      1. 包含格式 运行url脚本,它将下载URL脚本并执行它们的顺序,这有助于集中管理脚本。

        #include
        http://hostname/script1
        http://hostname/scrpt2