2

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

虽然为了让它更容易使用,我想定义我自己的标签,比如下面的 coreos,详见在openstack 中运行 coreos

#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 的新手,它叫做 module 吗?它在文档http://cloudinit.readthedocs.org/en/latest/topics/modules.html中为空

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

4

2 回答 2

3

你需要在合适的目录下编写一个“cc”模块,并修改一些配置。这不是很容易,但肯定是可行的(我们经常使用它)。

  1. 找到 cloudconfig 模块的目录。在 Amazon Linux 上,这是/usr/lib/python2.6/site-packages/cloudinit/config/,但目录位置在不同的云初始化版本和发行版中有所不同。找到它的最简单方法是找到一个名为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_modules,cloud_config_modules等的键对应于 init 进程的不同部分,您可以在其中运行脚本。如果这不能直接开箱即用,您可能需要进行一些调查以了解模块是如何在您的系统上调用的。例如,Amazon Linux 过去在 init.d 脚本中有一个硬编码的模块列表,忽略了配置文件中指定的任何列表。

另请注意,默认情况下,您的脚本每个实例仅运行一次,这意味着重新运行 cloud-init 不会再次运行您的脚本。frequency您需要通过在列出模块的配置文件中设置来将脚本标记为每次启动always,或者删除表示脚本已运行的标记文件,该文件/var/lib/cloud位于/var/lib/cloud/instances/i-86ecc763/sem/config_mounts.

于 2014-11-02T17:59:10.490 回答
0

paste my note for you:

config: after installed cloud-init in VM,if u want to have root permission to access with passwd, do simple config below

modify /etc/cloud/cloud.cfg like below

users:
 - defaults
disable_root:0
ssh_pwauth: 1

Note: ssh_pwauth: "it will modify PasswordAuthentication in sshd_config automatically, 1 means yes

Usage: the behavior of cloud-init can configured using user data. user data can be filled by user during the start of instance (user data is limited to 16K).

Mainly there are several ways to do (tested):

  1. user-data script

    $ cat myscript.sh
    #!/bin/sh
    echo "Hello World. The time is now $(date -R)!" | tee /root/output.txt
    

when starting instance, add parameter --user-data myscript.sh, and the instance will run the script once during startup and only once.

  1. cloud config syntax:

It is YAML-based, see http://bazaar.launchpad.net/~cloud-init-dev/cloud-init/trunk/files/head:/doc/examples/

run script

    #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 ]

change hostname, password

    #cloud-config
    chpasswd:
      list: |
         root:123456
      expire: False
    ssh_pwauth: True
    hostname: test
  1. include format run url script, it will download URL script and execute them sequence, this can help to manage the scripts centrally.

    #include
    http://hostname/script1
    http://hostname/scrpt2 
    
于 2014-10-23T15:32:59.810 回答