---
title: "Настройка сервера с помощью cloud-init — Timeweb Cloud"
description: "Как использовать cloud-init для автоматической настройки облачного сервера: форматы сценариев, загрузка и редактирование скриптов, примеры установки пакетов, создания пользователей и добавления SSH-ключей."
---

> Полный индекс документации для ИИ-агентов: [llms.txt](https://timeweb.cloud/llms.txt).

[Cloud-init](https://cloudinit.readthedocs.io/en/latest/index.html) — это инструмент для настройки облачного сервера, который позволяет передать пользовательские параметры (user-data) при запуске виртуальной машины и тем самым ускорить и автоматизировать процесс настройки серверов.

С помощью `cloud-init` вы можете настроить конфигурацию сервера, установить нужное ПО, создать нужные директории и пользователей и назначить им права — и многое другое. 

Сценарии `cloud-init` также можно передавать через [Terraform](https://github.com/timeweb-cloud/terraform-provider-timeweb-cloud), а в ближайшее время реализуем и передачу через CLI.

## Форматы

Сценарии `cloud-init` можно передавать в виде текстовых файлов `#cloud-config` или shell-скриптов `#!/bin/sh`.

> [!NOTE]
> При использовании shell-скриптов необходимо учитывать следующее:
>
> -   shell-скрипт будет автоматически преобразован в `cloud-config` с директивой `runcmd`;
> -   `runcmd` выполняется однократно, поэтому после изменения скрипта и перезагрузки VDS скрипт не будет выполнен.
>
> Если вам нужно, чтобы сценарий выполнялся при каждой загрузке сервера, необходимо использовать скрипты в формате `cloud-config` и директиву `bootcmd`.

## Особенности

-   Сценарии выполняются от `root`, поэтому в командах не требуется указывать `sudo`. 
-   Все созданные файлы и директории будут принадлежать пользователю `root`, поэтому если необходимо, чтобы доступ к ним имел иной пользователь, задайте в сценарии соответствующие права для него.
-   Так как сценарий выполняется полностью автоматически, в нем не получится использоваться команды, запрашивающие действия от пользователя. Для команд, требующих подтверждения в процессе выполнения, используйте ключ `-y` (например, `apt upgrade -y`).
-   Лог выполнения сценария записывается в файл `/var/log/cloud-init-output.log`.
-   При использовании сторонних образов системы `cloud-init` может работать некорректно.
    
-   На Ubuntu `cloud-init` по умолчанию создаст пользователя `ubuntu`, если нет инструкции `users`. Если создание пользователей не требуется, рекомендуется указать запись вида:

```shell
users: []
```

## Загрузка сценария

Загрузить сценарий `cloud-init` можно:

-   На этапе создания сервера. Заданные параметры будут применены при установке.

![081449bf 55b6 44d0 Bd74 578830f3efef](https://content.timeweb.com/assets/853e691e-3c2c-400e-a86e-def8985a7901?width=773&height=440)

-   При переустановке сервера. Заданные параметры будут применены при установке.

![Без Названия (1)](https://content.timeweb.com/assets/36bc5af7-e9c3-469a-a238-80f497501f25?width=1473&height=1213)

-   После создания сервера, в разделе «Конфигурация». Чтобы заданные параметры были применены при следующей перезагрузке, необходимо перезагрузить систему командой: `cloud-init clean --reboot`.

![E5d9634a 23f5 491b B45f 60f3be14d878](https://content.timeweb.com/assets/ac04e434-64ff-4573-9bbc-6c01c58be1b1?width=1448&height=961)

## Редактирование сценария

Вы можете изменять уже загруженный скрипт `cloud-init` в настройках сервера.

> [!NOTE]
> Чтобы заданные параметры были применены при следующей перезагрузке, необходимо перезагрузить систему командой: `cloud-init clean --reboot`.

1.  Перейдите на вкладку «Конфигурация».
2.  Кликните «Редактировать» в блоке «Cloud-init».
3.  Внесите изменения и сохраните их.

![E5d9634a 23f5 491b B45f 60f3be14d878](https://content.timeweb.com/assets/fbffd610-49d9-4fae-aaa1-9f237cb1b0b1?width=1448&height=961)

Сценарий будет применен при следующей перезагрузке сервера. 

## Примеры shell-скриптов

> [!NOTE]
> Скрипт обязательно должен начинаться с `#!/bin/sh`.

**Установка пакетов**

С помощью скрипта ниже установим `fail2ban`:

```shell
#!/bin/sh
apt -y update
apt -y install fail2ban
```

**Установка LAMP на CentOS**

```shell
#!/bin/sh

##Ставим PHP 7.2
yum -y install epel-release
yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi-php72
yum update -y
yum install -y php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-process php-ldap php-mbstring

##Ставим MariaDB 11.02
wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
chmod +x mariadb_repo_setup
bash mariadb_repo_setup
yum install -y httpd mariadb-server

##Запускаем автозагрузку сервисов
systemctl start mariadb
systemctl enable mariadb
systemctl start httpd
systemctl enable httpd

##Назначаем права
chmod 2775 /var/www
find /var/www -type d -exec chmod 2775 {} \;
find /var/www -type f -exec chmod 0664 {} \;

## Вывод phpinfo
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

## Открываем порт
iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
```

## Примеры cloud-config

> [!NOTE]
> Файл обязательно должен начинаться с  `#cloud-config`.

**Установка пакетов**

```shell
#cloud-config
package_update: true
packages:
 - apache2
 - mariadb-server
 - mariadb-client
```

**Создание пользователей**

```shell
#cloud-config
users:
  - name: username
  - name: new_username
```

При создании пользователя через cloud-init пропадет возможность авторизации под пользователем root с использованием пароля. Это происходит из-за того, что ваш `user-data` перезаписывает настройки, заданные `vendor-data`.

Если вам нужна авторизация под root с паролем, используйте директиву `chpasswd` и явно задайте пароль:

```bash
#cloud-config
users:
  - name: newuser
    shell: /bin/bash
    groups: [sudo]
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]

chpasswd:
  list: |
    root:rootpass
    newuser:newuserpass
  expire: false
```

> [!NOTE]
> В этом случае пароль root, отображаемый в панели управления, больше не будет актуален. Однако при смене пароля через панель управления он обновится корректно.

Если авторизация по паролю вам не нужна, используйте SSH-ключи.

**Добавление SSH-ключей**

```shell
#cloud-config
ssh_authorized_keys:
  - ssh-rsa ПУБЛИЧНЫЙ_КЛЮЧ username@server
```

Можно добавить несколько ключей сразу:

```shell
#cloud-config
ssh_authorized_keys:
  - ssh-rsa ПУБЛИЧНЫЙ_КЛЮЧ username@server
  - ssh-rsa ПУБЛИЧНЫЙ_КЛЮЧ_2 username2@desktop
```

**Создание пользователя с правами sudo, добавление SSH-ключей и настройка оболочки bash**

```shell
#cloud-config
users:
  - name: username
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh-authorized-keys:
      - ПУБЛИЧНЫЙ_КЛЮЧ username@server
      - ПУБЛИЧНЫЙ_КЛЮЧ_2 username2@desktop
```

**Установка LAMP на Ubuntu**

```shell
#cloud-config

package_update: true
packages:
  - apache2
  - php-mysql
  - mysql-server
  - libapache2-mod-php
  - php-gd
  - php-curl

runcmd:
  - [ find, /var/www, -type, d, -exec, chmod, 2775, {}, \; ]
  - [ find, /var/www, -type, f, -exec, chmod, 0664, {}, \; ]

write_files:
  - path: /var/www/html/phpinfo.php
    owner: www-data:www-data
    content: |
      "<?php phpinfo(); ?>"
```

После завершения настройки при переходе по адресу `http://ip_адрес_сервера/phpinfo.php` отобразится страница с параметрами PHP.

> [!NOTE]
> Больше примеров можно найти в [документации cloud-init](https://cloudinit.readthedocs.io/en/latest/reference/examples.html#cloud-config-examples).
