Как я могу написать собственный облачный конфиг в cloud-init?

cloud-init - мощный инструмент для ввода пользовательских данных в экземпляр виртуальной машины, а его существующий модуль предоставляет множество возможностей.

Хотя, чтобы упростить использование, я хочу определить свой собственный тег, как показано ниже, coreos, подробности см. В запуск coreos в 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

Таким образом, я мог бы иметь что-то вроде ниже, используя мой собственный определенный тег / config myapp

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

Я новичок в cloud-init, это называется модулем? он пуст в документе http://cloudinit.readthedocs.org/en/latest/topics/modules.html

Не могли бы вы предоставить некоторую информацию, чтобы описать, как я могу написать свой собственный модуль?


person Larry Cai    schedule 19.10.2014    source источник


Ответы (2)


Вам нужно написать модуль «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 и т. Д., Которые соответствуют различным частям процесса инициализации, где вы можете запустить свой скрипт. Если это не работает прямо из коробки, вам, вероятно, придется провести небольшое расследование, чтобы выяснить, как модули вызываются в вашей системе. Например, в Amazon Linux был жестко запрограммированный список модулей внутри сценария init.d, игнорирующий любые списки, указанные в файлах конфигурации.

Также обратите внимание, что по умолчанию ваш сценарий будет запускаться только один раз для каждого экземпляра, что означает, что повторный запуск cloud-init не приведет к повторному запуску вашего сценария. Вам нужно либо пометить скрипт как выполняющийся при загрузке, установив frequency на always в файле конфигурации, в котором указан ваш модуль, либо удалить файл маркера, говорящий о том, что скрипт запущен, который находится где-то в /var/lib/cloud, как в /var/lib/cloud/instances/i-86ecc763/sem/config_mounts.

person Nakedible    schedule 02.11.2014

вставьте мою заметку для вас:

config: после установки cloud-init в виртуальной машине, если вы хотите иметь root-права для доступа с помощью passwd, выполните простую конфигурацию ниже

измените /etc/cloud/cloud.cfg, как показано ниже

users:
 - defaults
disable_root:0
ssh_pwauth: 1

Примечание: ssh_pwauth: "он изменит PasswordAuthentication в sshd_config автоматически, 1 означает yes

Использование: поведение cloud-init можно настроить с помощью user data. пользовательские данные могут быть заполнены пользователем во время запуска экземпляра (пользовательские данные ограничены до 16 КБ).

В основном есть несколько способов сделать (проверено):

  1. скрипт пользовательских данных

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

при запуске экземпляра добавьте параметр --user-data myscript.sh, и экземпляр будет запускать скрипт один раз при запуске и только один раз.

  1. синтаксис облачной конфигурации:

Он основан на 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. Включите формат run url script, он загрузит URL-сценарий и выполнит их последовательность, это может помочь централизованно управлять сценариями.

    #include
    http://hostname/script1
    http://hostname/scrpt2 
    
person Heven.Yan    schedule 23.10.2014
comment
Уточняю вопрос, стремлюсь найти способ настроить тег в cloud-config - person Larry Cai; 24.10.2014