如何使用云计算的配置为您的初始服务器设置

云-config文件是用来定义为您的服务器配置的详细信息,因为它正在联机的第一次特殊的脚本。这些经常用于完成一个用户通常不得不登录到服务器来完成共同的任务。在本指南中,我们将贯穿怎么办使用我们的元数据服务云-config文件一个Ubuntu 14.04服务器的一些初始配置。

介绍

随着引进的DigitalOcean元数据服务 ,就可以开始配置您的服务器,你甚至登录之前。总之,元数据服务是您的服务器可以在启动过程中访问HTTP位置。

元数据的位置将包含有关服务器的配置和环境的基本数据,如网络地址,主机名等。在初始设置,这些值可以通过程序调用被拉低cloud-init帮助配置必要的服务。

最强大的功能是,当你创建一个使用名为场的服务器你可以通过脚本到元数据服务user-data 这将在初始引导过程中运行,非常灵活,允许您完成任何你可以脚本。

脚本的最常见的类型,以通过在被称为cloud-config脚本。 这是一个YAML格式的文件,提供了通过声明设置通用配置项的简单,可读的方法。 它还具有为其他任务运行任意命令的能力。

在本指南中,我们将得到熟悉的DigitalOcean元数据服务和cloud-config尝试了一个简单的例子文件。 我们将重现一些在列出的步骤初始服务器设置为Ubuntu 14.04 ,以证明指南。

目标

为了成功复制的步骤的Ubuntu 14.04服务器初始设置向导 ,我们的脚本就必须做一些任务。

这些是上述指南完成的基本任务:

  • 更改root用户的密码
  • 创建新用户
  • 创建新用户的密码
  • 授予新用户root权限
  • (可选)更改SSH守护程序侦听的端口
  • (可选)限制root SSH登录
  • (可选)明确允许我们的新用户

修改目标以解决环境问题

对于具有创建我们的服务器cloud-config文件,我们必须修改我们的目标位。 通过传递任何信息cloud-config文件是为服务器的整个生命系统中的任何用户访问。

这引入了许多重要的理解和解决的安全问题。 有些事情要记住:

  • 在传递的任何信息cloud-config是系统中每个用户访问。 不要放置任何物品在您的机密cloud-config文件。
  • 您可以为现有用户设置密码,但必须以纯文本形式传递密码。
  • 对于新用户,您可以传递散列版本的密码,但是这些散列可以很容易地用现代硬件打破。

随着考虑到这些事情,我们的设置应该尽一切可能避免犯密码,以任何形式,在内部cloud-config文件。 我们可以调整我们的目标以适应我们的部署环境的特定需求。

我们的调整策略将如下所示:

  • 设置无密码,并通过提供root帐户没有SSH密钥cloud-config (任何SSH密钥加虽然DigitalOcean接口仍然会被添加照常)
  • 创建新用户
  • 不为新用户帐户设置密码
  • 为新用户帐户设置SSH访问
  • 给予新用户无密码sudo权限以进行管理更改。
  • (可选)更改SSH守护程序侦听的端口
  • (可选)限制root SSH登录(特别是如果您不通过DigitalOcean接口包括SSH密钥)
  • (可选)明确允许我们的新用户

除了清除密码这两个帐户,这里最剧烈的变化是,新的帐户将被允许使用sudo不输入帐户密码。 这是必要的,因为我们不允许root登录,并且我们不会为新用户设置帐户密码。

在新用户登录后,他们可以自由地为自己安全地设置密码,并修改sudo权限以需要密码(如果需要)。

考虑到这些调整目标,让我们开始吧。

使用Cloud-Config文件

一个cloud-config文件基本上能够理解某些指令YAML文件。 YAML是一种数据序列化格式,意味着非常人类可读,使其易于理解和编辑。

YAML文件依赖于几个格式化规则:

  • 带空格的缩进表示项目的结构和关系。 更缩进的项目是第一个项目的子项目,其上方具有较低缩进级别。
  • 列表成员可以通过引号破折号标识。
  • 通过使用冒号(:)后跟空格和值创建关联数组条目。
  • 文本块缩进。 要指示该块应按原样读取,并保持格式,请在块之前使用管道字符(|)。

一的第一行cloud-config文件必须包含一个特殊的标识符,以使cloud-init程序知道该文件是一个cloud-config文件。 这看起来像这样:

#cloud-config

这必须单独放在第一行。 cloud-config创建服务器时,必须提供文件。 这可以以两种不同的方式实现。

请记住,元数据服务仅在部署了Cloud 1.5的地区可用。 此外,需要使用用户数据字段的cloud-init版本目前仅在Ubuntu 14.04和CentOS 7中可用,以及基于这些版本的应用程序映像。

通过控制面板界面,有一个可选的复选框来启用用户数据。 当您选择此,一个文本框将显示在这里你可以粘贴您的cloud-config文件:

DigitalOcean用户数据

如果您正在使用的API,这是一个创建请求中传递的JSON对象可以利用一个名为场user_data 例如,您可以传入类似于以下内容的JSON对象:

{
    "name": "test",
    "private_networking": true,
    "region": "nyc3",
    "size": "512mb",
    "image": "ubuntu-14-04-x64",
    "user_data":"#cloud-config
        config_data
        more_config"
    "ssh_keys":[ 12345,56789 ]
}

这两种方法在实践中都是完全相同的,所以使用最适合你的。

设置新用户帐户

我们需要做的第一件事是配置我们的新用户帐户。

这是几乎所有工作将发生的地方。 默认情况下,root帐户没有密码,因此我们不必“取消设置”任何密码。

创建新用户

要创建一个新的用户,我们使用users指令。 这将包含我们要创建的所有新帐户的列表。 由于我们只创建一个帐户,我们将有一个列表。 跟随我们联系指导,我们将调用此新帐户demo

记住,一定要开始了我们的cloud-config使用文件#cloud-config单独的第一行。 到目前为止,我们的文件将如下所示:

#cloud-config
users:
  - name: demo

如果我们想添加其他用户,我们可以通过在下面放置一个项目,并与此水平对齐,从一个破折号开始,像这样:

#cloud-config
users:
  - name: demo
  - name: second_user

每个破折号表示一个单独的用户帐户,我们可以在其中添加用户的详细信息(我们将暂时做)。 我们只创建一个用户,所以我们不会在本指南中有这个第二行。

添加授权密钥

为了在没有密码的情况下登录这个新帐户,我们需要提供一个或多个SSH公钥。 这些将被添加到新用户authorized_keys文件中.ssh在自己的主目录的目录。

这是通过完成ssh-authorized-keys的指令,这是一个分项,以一个users条目。 基本上,这意味着我们与对齐name指令,但不要给它一个破折号,因为它不是一个新的用户条目的开始。

ssh-authorized-keys条目实际上需要密钥列表。 这允许您向文件添加多个SSH公用密钥。 例如,如果您有笔记本电脑,桌面上,你在工作中的计算机SSH密钥对,您可以添加所有这些作为单独项目的ssh-authorized-keys列表。

要获取本地计算机的公钥的内容,您可以键入:

cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip user@example.com

然后,您可以粘贴完整的内容作为我们下一个项目ssh-authorized-keys条目。 SSH公钥可以公开发布,因此这不表示安全风险:

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip user@example.com

如果您想添加其他密钥,可以添加另一个破折号,然后再加上第二个公钥:

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - key_one
      - key_two

在此处添加您要用于登录此帐户的任何密钥。

设置Sudo访问

下一步是配置sudo我们新帐户的访问。 再次重申,我们将设置无密码sudo访问,因为我们将不会设置在该帐户的密码,由于安全限制。

要配置访问,我们实际上将执行两个单独的步骤。

首先,我们将创建我们要使用的条目sudoers文件。 我们的变化实际上将写入到一个单独的文件/etc/sudoers.d目录,该目录/etc/sudoers进行解析时包含。

我们需要创建该条目不会需要包括用户名,因为cloud-init是足够聪明,从入门的信息计算出的帐户名称。 我们需要使用的指令是sudo ,这是与我们的其他对准users级指令。

对于我们的指南,因为我们在配置无密码sudo能力,将是这样的:

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip user@example.com
    sudo: ['ALL=(ALL) NOPASSWD:ALL']

这将创建在一个文件/etc/sudoers.d称为目录90-cloud-init-users 在这个文件中,条目将如下所示:

demo ALL=(ALL) NOPASSWD:ALL

我们要做的第二件事情实际上是我们的用户添加到sudo组。 这不是绝对必要的,因为我们有具体到我们新帐户中的条目由解析sudo ,但它给了我们更多的灵活性。

后来,我们不妨为我们的用户手动设置一个密码,并要求密码sudo命令。 如果我们的用户已经是在sudo组,所有我们需要做的是设置了密码并删除该条目90-cloud-init-users文件。

要添加一个补充组,我们可以使用groups指令:

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip user@example.com
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo

这将使到一个更传统的过渡sudo设置更容易。 我们将在本指南的末尾告诉您如何做到这一点。

设置Shell环境

默认情况下,新创建的用户,其默认的shell设置非常基本的/bin/sh外壳。

这比大多数人都习惯更加缩减下来的环境,所以我们要手动指定bash为我们的新用户shell环境。

这可以通过完成shell的内部指令users级别项目。 所有我们需要做的是它指向的完整路径bash可执行文件:

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip user@example.com
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash

我们已经完成了新的用户配置。 我们现在可以进入锁定我们的SSH守护进程的可选步骤。

配置并锁定SSH守护程序(可选)

接下来的步骤可以有助于增加安全性。 您可以根据需要实施其中的任何一个或全部。 查看我们正在自动执行的指南,了解有关这些选项的更多信息。 我们将向您展示如何使用两种不同的方法实现每个项目。

所有这一切,我们需要做出将在变化/etc/ssh/sshd_config文件。 重申,我们有兴趣做的改变是:

  • (可选)更改SSH守护程序侦听的端口
  • (可选)限制root SSH登录(特别是如果您不通过DigitalOcean接口包括SSH密钥)
  • (可选)明确允许我们的新用户

这些设置可以通过在这些变化中实现sshd_config分别文件:

  • 端口4444
  • 没有的PermitRootLogin
  • 的AllowUsers 演示

有两种方法来进行这些更改。 第一种是完全通过提供我们在整个配置文件的文件重写cloud-config文件。 第二个是使用通用的Linux文本实用程序策略性地进行更改。

这两种各有优点,并且都表现出不同的指令cloud-config 我们将依次覆盖。

通过提供新的配置文件配置SSH守护程序

做出我们想要的更改的第一个策略是使用我们想要的确切内容完全重写文件。

这允许我们完全控制文件,而不管默认情况下是什么。 方法是直接的,很容易预见我们的行动的结果。

写一个新的文件到硬盘,我们可以使用write_files指令。 这是一个顶级的指令,所以应该放在外面users ,我们已经在先前被工作部分。

我们提供一个我们想要写的文件列表(用每个项目的破折号表示)。

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip user@example.com
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
write_files:
  - item_one
  - item_two

在我们的例子中,我们将只写一个文件。 对于每个文件,我们提供有关我们要做的chanegs的详细信息。 例如,你可以使用的参数是pathcontentownerpermissions ,甚至encoding

默认情况下,用这种方法创建的文件的所有者是root,权限是644 ,这正是我们想要的。 所以我们只需要提供的pathcontent指令。

path就是在文件系统写入文件的位置。

对于content ,我们将要提供的文件的全部内容,写入原样。 记住,我们可以使用管道字符(|)传递一个文本块,以保持其格式。

对于我们的内容sshd_config文件,我们将只使用默认内容,剥离的注释(简洁),与我们想要做的改变。 重写我们的文件的完整部分将如下所示:

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip user@example.com
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
write_files:
  - path: /etc/ssh/sshd_config
    content: |
         Port 4444
         Protocol 2
         HostKey /etc/ssh/ssh_host_rsa_key
         HostKey /etc/ssh/ssh_host_dsa_key
         HostKey /etc/ssh/ssh_host_ecdsa_key
         HostKey /etc/ssh/ssh_host_ed25519_key
         UsePrivilegeSeparation yes
         KeyRegenerationInterval 3600
         ServerKeyBits 1024
         SyslogFacility AUTH
         LogLevel INFO
         LoginGraceTime 120
         PermitRootLogin no
         StrictModes yes
         RSAAuthentication yes
         PubkeyAuthentication yes
         IgnoreRhosts yes
         RhostsRSAAuthentication no
         HostbasedAuthentication no
         PermitEmptyPasswords no
         ChallengeResponseAuthentication no
         X11Forwarding yes
         X11DisplayOffset 10
         PrintMotd no
         PrintLastLog yes
         TCPKeepAlive yes
         AcceptEnv LANG LC_*
         Subsystem sftp /usr/lib/openssh/sftp-server
         UsePAM yes
         AllowUsers demo

这将完全取代内容/etc/ssh/sshd_config与我们提供的新内容。 这是默认sshd_config Ubuntu的文件,只有我们上面提到的改装项目。

这是对SSH守护程序进行更改的一种方法。

通过重点更改配置SSH守护程序

我们可以修改第二种方式sshd_config文件是通过集中的编辑。 Linux系统附带了各种强大的文本处理工具,我们可以利用它们只做出我们需要的更改。

要运行任意命令,我们将使用一个名为指令runcmd ,这使我们能够在系统上运行的任何命令。 每个命令将是指令下的列表项。 这些可以作为表示整个命令的字符串,或者作为具有命令和所有选项作为元素的数组。

我们将使用sed命令,这是字符串替换的。 虽然可以通过多个操作到一个sed命令,我们会为每做一个操作sed命令。 这将使我们能够更容易地解决任何问题。 我们所有的sed命令将编辑sshd_config到位文件。

我们的第一个sed命令将改变配置侦听端口的线。 我们将通过搜索以“端口”开头的行来识别这一点。 我们会告诉sed替代整条生产线(由正则表达式指定^.*$与我们的) Port 4444的配置:

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip user@example.com
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
runcmd:
  - sed -i -e '/^Port/s/^.*$/Port 4444/' etc/ssh/sshd_config

我们的下一个sed行将通过搜索字符串在一行的开头修改“的PermitRootLogin”指令。 再次,我们将更换整个线路,这一次PermitRootLogin no

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip user@example.com
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
runcmd:
  - sed -i -e '/^Port/s/^.*$/Port 4444/' /etc/ssh/sshd_config
  - sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config

接下来的sed命令可以将一个行添加到文件的末尾,因为当前没有在文件中的“的AllowUsers”指令。 我们通过匹配最后一行(由“$”指定)和添加我们需要的行来实现。

之后,我们将需要重新启动SSH守护进程,以便传播我们的更改。 我们可以很容易地使用Upstart“restart”命令:

#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip user@example.com
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
runcmd:
  - sed -i -e '/^Port/s/^.*$/Port 4444/' /etc/ssh/sshd_config
  - sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config
  - sed -i -e '$aAllowUsers demo' /etc/ssh/sshd_config
  - restart ssh

这应该足以使我们需要的编辑,我们的文件和重新启动服务。

完成的产品

现在,我们已经实现了所有使用我们的调整目标cloud-config文件。 您可以使用控制面板创建服务器,也可以使用API​​来启动服务器。

如果您选择使用API​​,则示例数据有效内容可能如下所示:

{"name": "your_droplet_name",
"private_networking": true,
"region": "nyc3",
"size": "512mb",
"image": "ubuntu-14-04-x64",
"user-data": "#cloud-config
users:
  - name: demo
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIVv0RE6rDLNal1quXZ3nqAlANpl5qmhDQ+GS/sOtygSG4/9aiOA4vXO54k1mHWL2irjuB9XbXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IkaKdlK0hbC1ds0+8h83PTb9dF3L7hf3Ch/ghvj5++tWJFdFeG+VI7EDuKNA4zL8C5FdYYWFA88YAmM8ndjA5qCjZXIIeZvZ/z9Kpy6DL0QZ8T3NsxRKapEU3nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip user@example.com
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
runcmd:
  - sed -i -e '/^Port/s/^.*$/Port 4444/' /etc/ssh/sshd_config
  - sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config
  - sed -i -e '$aAllowUsers demo' /etc/ssh/sshd_config
  - restart ssh"}

故障排除

如果您有一些问题,让您的cloud-config文件才能正常工作,你可以检查日志文件的线索。

这些位于:

  • /var/log/cloud-init.log:为配置文件的云init的处理过程实际日志。
  • /var/log/cloud-init-output.log:由配置的处理产生的任何输出可以在这里找到。

您通常可以找到发生了什么,通过使用一些有用的信息grep来搜索这些文件。

如果您遇到了由于某些配置问题无法登录到您创建的服务器的情况,最好是销毁服务器并重新启动。 为了排除故障,有时需要临时设置测试服务器的超级用户口令cloud-config文件,这样就可以看到什么错。

这可以通过在您这样的事情要做cloud-config

#cloud-config
chpasswd:
  list: |
    root:yourpassword
  expire: False
. . .

这将允许您使用不依赖于SSH的DigitalOcean控制台登录。 请记住,您在此处放置的任何密码在系统整个生命周期内都可以被服务器上的每个用户读取,因此,在发现问题后,销毁该Droplet。 然后,您可以使用校正启动另一台服务器cloud-config文件。

设置传统Sudo访问

如果您想配置更多的传统,口令认证sudo访问您的服务器部署之后,你可以很容易地采取以下措施:

首先,您需要为新帐户设置密码。 要做到这一点,而无需输入当前的密码(不存在)的唯一途径是通过sudo 您将必须在命令结尾处指定新的用户帐户名称,以便不设置根密码:

sudo passwd demo

现在,你有你的帐户的密码,验证你是,实际上,在sudo组。 这可以通过输入:

groups
demo sudo

如果你是不是已经中sudo组,您可以通过键入自己添加:

sudo usermod -a -G sudo demo

现在,编辑90-cloud-init-users的文件visudo命令,通过将文件作为参数:

sudo visudo -f /etc/sudoers.d/90-cloud-init-users

注释掉或删除与您用户关联的行:

#demo ALL=(ALL) NOPASSWD:ALL

保存并关闭文件。 您的帐户现在就需要你的密码来执行sudo命令。

结论

使用cloud-config文件来完成服务器的初始化配置可以很容易并节省您的时间,从长远来看。 这些文件易于调整,并且构建多个不同的配置可以在快速设置服务器方面给予您极大的灵活性。

通过结合cloud-config机器已经联机后,用更传统的配置管理系统,可以快速,轻松地将新机究竟到所需的状态。