Я использую terraform для создания экземпляра EC2, и я использую user_data
для помещения файла в /var/lib/cloud/scripts/per-once
. Это не выполняется - мой вопрос сейчас: запускается ли cloud-init до user_data
?
=== РЕДАКТИРОВАТЬ ===
Более длинный ответ на очень полезный ответ Dude0001:
Сейчас я попробовал следующее - это мое user_data
:
#!/bin/bash
cat >/var/lib/cloud/scripts/per-once/install_mysql <<!
#cloud-config
package_update: true
packages:
- mysql-server
!
cat >>/root/.bashrc <<!
set -o vi
unalias -a
alias ll='ls -lp'
!
cat >>/home/admin/.bashrc <<!
set -o vi
unalias -a
alias ll='ls -lp'
!
cat /root/.vimrc <<!
set t_ti= t_te=
set compatible
set expandtab ts=2 sw=2 ai
!
cat >/home/admin/.vimrc <<!
set t_ti= t_te=
set compatible
set expandtab ts=2 sw=2 ai
!
Это создает все файлы, как и ожидалось (я действительно старомоден и не люблю большинство новых функций vim). Я попытался перезагрузиться после того, как экземпляр был создан: нет mysqld. Я изменил разрешения, chmod 755 / var / lib / cloud / scripts / per-once / install_mysql , и перезагрузил компьютер: результата тоже нет (причина, по которой я изменил разрешения, заключается в том, что из кода Python видно, что это облако-init ищет только исполняемые файлы).
=== РЕДАКТИРОВАТЬ ===
Некоторые пояснения к моему user_data
выше:
Эта конструкция может озадачивать некоторых, поскольку она не слишком распространена:
cat >/some/path/to/a/file <<!
...
!
cat
- это команда, которая просто читает со стандартного ввода и записывает на стандартный вывод без изменений - она часто используется с перенаправлением <
и >
. В приведенной выше конструкции я направляю любой вывод в файл /some/path/to/a/file
. Другая часть, включающая <<!
и !
, известна как здесь документ , что, как я подозреваю, происходит от языка JCL, используемого на мэйнфреймах, но это действительно полезно. Это означает, что читает следующие строки до конечного маркера (здесь: !
, но это может быть любая строка). Итак, в общем, он говорит создать файл со следующим содержанием: ... .
Первый файл, /var/lib/cloud/scripts/per-once/install_mysql
, содержит:
#cloud-config
package_update: true
packages:
- mysql-server
Я надеюсь, что это скажет cloud-init обновить хранилище пакетов и установить mysql-server
- этого не происходит.
Следующие 4 файла - это просто некоторые настройки в root
и admin
пользовательские среды;в основном, я создаю .vimrc
и добавляю несколько строк к .bashrc
, чтобы убедиться, что определенные вещи настроены по моему вкусу.
Все файлы созданы, но тот, который имеет #cloud-config
, не делаеткажется, не трогали вообще. Вчера я провел несколько экспериментов, поместив этот файл в разные каталоги под /var/lib/cloud/scripts/
, но похоже, что эти файлы отсутствуют, когда cloud-init читает каталоги. Читая исходный код cloud-init
, он выглядит так, как будто он проходит через 10 этапов - user_data
выбирается на этапе 5, и его следует прочитать на этапе 7. Я также вижу, что, похоже, требуется разрешение на выполнениебит для установки;однако это то, что находится в журнале после перезагрузки:
2019-10-02 08:06:52,884 - handlers.py[DEBUG]: start: modules-final/config-scripts-per-boot: running config-scripts-per-boot with frequency always
2019-10-02 08:06:52,884 - helpers.py[DEBUG]: Running config-scripts-per-boot using lock (<cloudinit.helpers.DummyLock object at 0x7f677362acc0>)
2019-10-02 08:06:52,885 - util.py[DEBUG]: Running command ['/var/lib/cloud/scripts/per-boot/install_mysql'] with allowed return codes [0] (shell=False, capture=False)
2019-10-02 08:06:52,887 - util.py[WARNING]: Failed running /var/lib/cloud/scripts/per-boot/install_mysql [-]
2019-10-02 08:06:52,887 - util.py[DEBUG]: Failed running /var/lib/cloud/scripts/per-boot/install_mysql [-]
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 1992, in subp
env=env, shell=shell)
File "/usr/lib/python3.7/subprocess.py", line 775, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.7/subprocess.py", line 1522, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 8] Exec format error: b'/var/lib/cloud/scripts/per-boot/install_mysql'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 835, in runparts
subp(prefix + [exe_path], capture=False)
File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 2000, in subp
stderr="-" if decode else b"-")
cloudinit.util.ProcessExecutionError: Exec format error. Missing #! in script?
Command: ['/var/lib/cloud/scripts/per-boot/install_mysql']
Exit code: -
Reason: [Errno 8] Exec format error: b'/var/lib/cloud/scripts/per-boot/install_mysql'
Stdout: -
Stderr: -
2019-10-02 08:06:52,897 - cc_scripts_per_boot.py[WARNING]: Failed to run module scripts-per-boot (per-boot in /var/lib/cloud/scripts/per-boot)
2019-10-02 08:06:52,898 - handlers.py[DEBUG]: finish: modules-final/config-scripts-per-boot: FAIL: running config-scripts-per-boot with frequency always
2019-10-02 08:06:52,898 - util.py[WARNING]: Running module scripts-per-boot (<module 'cloudinit.config.cc_scripts_per_boot' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_scripts_per_boot.py'>) failed
2019-10-02 08:06:52,898 - util.py[DEBUG]: Running module scripts-per-boot (<module 'cloudinit.config.cc_scripts_per_boot' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_scripts_per_boot.py'>) failed
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/cloudinit/stages.py", line 800, in _run_modules
freq=freq)
File "/usr/lib/python3/dist-packages/cloudinit/cloud.py", line 54, in run
return self._runners.run(name, functor, args, freq, clear_on_fail)
File "/usr/lib/python3/dist-packages/cloudinit/helpers.py", line 187, in run
results = functor(*args)
File "/usr/lib/python3/dist-packages/cloudinit/config/cc_scripts_per_boot.py", line 41, in handle
util.runparts(runparts_path)
File "/usr/lib/python3/dist-packages/cloudinit/util.py", line 842, in runparts
% (len(failed), len(attempted)))
RuntimeError: Runparts: 1 failures in 1 attempted commands
Итак, ему определенно не нравится формат файла - он хочет видеть #!...
или, возможно, двоичный исполняемый файл.
Сейчас я опробую предложения Dude0001 более подробно.
=== РЕДАКТИРОВАТЬ ===
В конце концов, что работает, это использовать составной / смешанный формат,как предлагает Dude0001:
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
package_update: yes
package_upgrade: all
packages:
- mariadb-server
- apt-file
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
#!/bin/bash
cat >>/root/.bashrc <<!
set -o vi
unalias -a
alias ll='ls -lp'
!
cat >>/home/admin/.bashrc <<!
set -o vi
unalias -a
alias ll='ls -lp'
!
cat /root/.vimrc <<!
set t_ti= t_te=
set compatible
set expandtab ts=2 sw=2 ai
!
cat >/home/admin/.vimrc <<!
set t_ti= t_te=
set compatible
set expandtab ts=2 sw=2 ai
!
--//
Просто указание #cloud-config
, похоже, не работает, но этот способ работает. По крайней мере, для меня. В настоящий момент.