简介云配置脚本

该DigitalOcean元数据服务包括一个名为“用户数据”字段,可用于指定为您的服务器联机将要运行的脚本。该CloudInit程序,它运行这些脚本,可以处理被称为“云配置”一个特殊的脚本类型。在本指南中,我们将探讨如何建立云计算的配置文件,并利用他们的力量的最佳途径。

介绍

cloud-init程序,可在近期发行(Ubuntu仅14.04和CentOS 7在写这篇文章的时候)能消耗,并从执行数据user-data的领域DigitalOcean元数据服务 。 此过程的行为不同,具体取决于找到的信息的格式。 其中最流行的格式中的脚本user-datacloud-config文件格式。 Cloud-config文件是专门用于由cloud-init进程运行的特殊脚本。这些通常用于服务器第一次引导时的初始配置。在本指南中,我们将讨论cloud-config文件的格式和用法。

关于Cloud-Config的一般信息

cloud-config的格式实现了许多常见的配置项的声明语法,从而轻松完成许多任务。它还允许您为任何超出预定义声明能力的任何命令指定任意命令。 这种“两全其美”的办法让文件的作用类似于常见任务的一个配置文件,同时保持脚本进行更复杂的功能的灵活性。

YAML格式化

该文件使用YAML数据序列化格式写入。 YAML格式被创建为易于理解的人类和容易解析程序。 YAML文件通常在阅读它们时非常直观,但是知道管理它们的实际规则是很好的。 YAML文件的一些重要规则是:
  • 带空格的缩进表示项目的结构和关系。更缩进的项目是第一个项目的子项目,其上方具有较低缩进级别。
  • 列表成员可以通过引号破折号标识。
  • 通过使用冒号(:)后跟空格和值创建关联数组条目。
  • 文本块缩进。要指示该块应按原样读取,并保持格式,请在块之前使用管道字符(|)。
让我们这些规则,并进行实例分析cloud-config文件,只顾格式:
#cloud-config
users:
  - name: demo
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDf0q4PyG0doiBQYV7OlOxbRjle026hJPBWD+eKHWuVXIpAiQlSElEBqQn0pOqNJZ3IBCvSLnrdZTUph4czNC4885AArS9NkyM7lK27Oo8RV888jWc8hsx4CD2uNfkuHL+NI5xPB/QT3Um2Zi7GRkIwIgNPN5uqUtXvjgA+i1CS0Ku4ld8vndXvr504jV9BMQoZrXEST3YlriOb8Wf7hYqphVMpF3b+8df96Pxsj0+iZqayS9wFcL8ITPApHi0yVwS8TjxEtI3FDpCbf7Y/DmTGOv49+AWBkFhS2ZwwGTX65L61PDlTSAzL+rPFmHaQBHnsli8U9N6E4XHDEOjbSMRX user@example.com
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcthLR0qW6y1eWtlmgUE/DveL4XCaqK6PQlWzi445v6vgh7emU4R5DmAsz+plWooJL40dDLCwBt9kEcO/vYzKY9DdHnX8dveMTJNU/OJAaoB1fV6ePvTOdQ6F3SlF2uq77xYTOqBiWjqF+KMDeB+dQ+eGyhuI/z/aROFP6pdkRyEikO9YkVMPyomHKFob+ZKPI4t7TwUi7x1rZB1GsKgRoFkkYu7gvGak3jEWazsZEeRxCgHgAV7TDm05VAWCrnX/+RzsQ/1DecwSzsP06DGFWZYjxzthhGTvH/W5+KFyMvyA+tZV4i1XM+CIv/Ma/xahwqzQkIaKUwsldPPu00jRN user@desktop
runcmd:
  - touch /test.txt
通过查看这个文件,我们可以学习一些重要的事情。 首先,每个cloud-config文件必须以#cloud-config独上的第一行。 这个信号,这应该被解释为云init程序cloud-config文件。如果这是一个常规脚本文件,第一行将指示应该用于执行该文件的解释器。 上面的文件有两个顶级指示, usersruncmd 。这两者都作为键。这些键的值由键后的所有缩进行组成。 在的情况下, users键,数值是单一列表项。 我们知道这是因为压痕的一个新的水平是一个破折号( - ),它指定一个列表项,因为只有一个在这个缩进层次冲刺。 在的情况下users的指令,这顺便指出,我们仅限定一个单一的用户。 列表项本身包含具有更多键值对的关联数组。这些是兄弟元素,因为它们都存在于相同的缩进级别。每个用户属性都包含在我们上面描述的单个列表项中。 需要注意的一些事情是,你看到的字符串不需要引用,没有不必要的括号来定义关联。解释器可以相当容易地确定数据类型和缩进表示项之间的关系,都对人类和方案。 现在,你应该有YAML格式的工作知识和舒适的使用手感,我们上面所讨论的规则,信息工作。 现在,我们可以开始探索一些最常见指令的cloud-config

用户和组管理

在系统上定义新的用户,可以使用users ,我们在示例文件中看到了上面的指令。 用户定义的一般格式是:
#cloud-config
users:
  - first_user_parameter
    first_user_parameter

  - second_user_parameter
    second_user_parameter
    second_user_parameter
    second_user_parameter
每个新用户都应以破折号开头。每个用户定义键值对中的参数。以下键可用于定义:
  • name :帐户的用户名。
  • primary-group :用户的主组。默认情况下,这将是一个与用户名匹配的组。此处指定的任何组必须已存在或必须显式创建(我们将在本节稍后讨论)。
  • groups :任何补充组可以在这里列出,以逗号分隔。
  • gecos:一个关于用户补充信息字段。
  • shell:应为用户设置的外壳。 如果不设置此,非常基本sh外壳将被使用。
  • expiredate:该帐户应到期,YYYY-MM-DD格式的日期。
  • sudo :sudo的字符串使用,如果你想定义sudo的特权,没有用户名字段。
  • lock-passwd :这是默认设置为“真”。将此设置为“False”以允许用户使用密码登录。
  • passwd:该帐户的哈希密码。
  • ssh-authorized-keys :应该添加到该用户的完整的SSH公共密钥列表authorized_keys文件在自己.ssh目录。
  • inactive :一个布尔值,将帐户设置为无效。
  • system :如果“真”,这个帐户将是系统帐户没有主目录。
  • homedir:用于覆盖缺省/home/<username> ,这是其他方式创建和设置。
  • ssh-import-id:SSH的ID从LaunchPad的进口。
  • selinux-user :这可以用来设置应该使用此帐户的登录SELinux的用户。
  • no-create-home :设置为“true”,以避免创建/home/<username>的用户目录。
  • no-user-group :设置为“true”,以避免使用相同的名称作为用户创建一个组。
  • no-log-init :设置为“真”不启动用户登录数据库。
除了一些基本的信息,如name钥匙,你只需要定义你在哪里默认偏离或提供所需的数据的区域。 有一件事是重要的用户知道的是, passwd领域不应在生产系统中使用,除非你有立即修改给定值的机制。 与提交的用户数据的所有信息,哈希仍然可以访问任何用户系统上的服务器的整个生命周期。在现代硬件上,这些哈希值很容易在很短的时间内被破解。暴露甚至哈希是一个巨大的安全风险,不应该在任何不是一次性的机器上采取。 举一个例子用户定义,我们可以用这个例子的一部分, cloud-config上面我们看到:
#cloud-config
users:
  - name: demo
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDf0q4PyG0doiBQYV7OlOxbRjle026hJPBWD+eKHWuVXIpAiQlSElEBqQn0pOqNJZ3IBCvSLnrdZTUph4czNC4885AArS9NkyM7lK27Oo8RV888jWc8hsx4CD2uNfkuHL+NI5xPB/QT3Um2Zi7GRkIwIgNPN5uqUtXvjgA+i1CS0Ku4ld8vndXvr504jV9BMQoZrXEST3YlriOb8Wf7hYqphVMpF3b+8df96Pxsj0+iZqayS9wFcL8ITPApHi0yVwS8TjxEtI3FDpCbf7Y/DmTGOv49+AWBkFhS2ZwwGTX65L61PDlTSAzL+rPFmHaQBHnsli8U9N6E4XHDEOjbSMRX user@example.com
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcthLR0qW6y1eWtlmgUE/DveL4XCaqK6PQlWzi445v6vgh7emU4R5DmAsz+plWooJL40dDLCwBt9kEcO/vYzKY9DdHnX8dveMTJNU/OJAaoB1fV6ePvTOdQ6F3SlF2uq77xYTOqBiWjqF+KMDeB+dQ+eGyhuI/z/aROFP6pdkRyEikO9YkVMPyomHKFob+ZKPI4t7TwUi7x1rZB1GsKgRoFkkYu7gvGak3jEWazsZEeRxCgHgAV7TDm05VAWCrnX/+RzsQ/1DecwSzsP06DGFWZYjxzthhGTvH/W5+KFyMvyA+tZV4i1XM+CIv/Ma/xahwqzQkIaKUwsldPPu00jRN user@desktop
要定义组,您应该使用groups指令。这个指令相对简单,因为它只需要一个你想创建的组的列表。 对此的可选扩展是为您正在创建的任何组创建子列表。此新列表将定义应放置在此组中的用户:
#cloud-config
groups:
  - group1
  - group2: [user1, user2]

更改现有用户的密码

对于已经存在(用户帐户root帐户是最相关的),一个口令可以通过使用被suppled chpasswd指令。 注意 :此指令应在调试的情况下使用,因为,再次,该值将提供给该系统的服务器的寿命的持续时间上的每个用户。 这甚至在本节更相关,因为这项指令提交的密码必须以纯文本形式给出。 基本语法如下所示:
#cloud-config
chpasswd:
  list: |
    user1:password1
    user2:password2
    user3:password3
  expire: False
该伪指令包含两个关联数组键。该list键将包含列出帐户名称以及您想指定相关密码块。 该expire关键是确定是否密码必须在第一次启动或无法改变一个布尔值。默认值为“True”。 有一点要注意的是,你可以设置一个密码,以“随机”或“R”,这将产生一个随机的密码,并将它写入/var/log/cloud-init-output.log 。请记住,此文件可供系统上的任何用户访问,因此它不会更安全。

将文件写入磁盘

为了将文件写入到磁盘,你应该使用write_files指令。 应该写入的每个文件由指令下的列表项表示。这些列表项将是定义每个文件的属性的关联数组。 此数组中唯一必需的键path ,它定义在哪里写的文件, content ,其中包含你想将文件包含的数据。 配置一个可用密钥write_files项目有:
  • path:绝对路径在哪里文件应写入文件系统的位置。
  • content:应放置在文件中的内容。 (|)的“内容”行,后面包含内容的缩进块多行输入,你应该使用管道字符开始块。二进制文件应该包含“!! binary”和管道字符之前的空格。
  • owner :应给予文件的所有权的用户帐户和组。这些应该以“username:group”格式提供。
  • permissions :应为这个文件中给出八进制的权限设置。
  • encoding:文件的可选编码规范。对于Base64文件,可以是“b64”,对于Gzip压缩文件,可以是“gzip”,对于组合,可以是“gz + b64”。保留此选项将使用默认的常规文件类型。
例如,我们可以写一个文件/test.txt的内容:
Here is a line.
Another line is here.
该部分cloud-config ,将做到这一点是这样的:
#cloud-config
write_files:
  - path: /test.txt
    content: |
      Here is a line.
      Another line is here.

在服务器上更新或安装软件包

要管理包,需要记住一些相关的设置和指令。 要更新基于Debian的发行版的APT的数据库,你应该设置package_update指令为“true”。 这是调用的代名词apt-get update命令行。 默认值实际上是“true”,所以你只需要担心这个指令,如果你想禁用它:
#cloud-config
package_update: false
如果你想升级所有软件包您的服务器上启动时的第一次后,可以设置package_upgrade指令。 这类似于一个apt-get upgrade手动执行。 默认情况下,此属性设置为“false”,因此如果您需要此功能,请确保将其设置为“true”:
#cloud-config
package_upgrade: true
要安装其他软件包,可以使用“packages”指令简单地列出软件包名称。每个列表项应该代表一个包。与上面的两个命令不同,此伪指令将与yum或apt管理的发行版同时运行。 这些项目可以采用两种形式之一。第一个是简单的包名称的字符串。第二种形式是具有两个项目的列表。此新列表的第一个项目是软件包名称,第二个项目是版本号:
#cloud-config
packages:
  - package_1
  - package_2
  - [package_3, version_num]
该“套餐”指令将设置apt_update为true,覆盖所有以前的设置。

为用户帐户和SSH守护程序配置SSH密钥

您可以管理SSH密钥users指令,但你也可以在一个专门指定它们ssh_authorized_keys部分。这些将被添加到第一个定义的用户的authorized_keys文件。 这利用了内密钥规范的相同的一般格式users指令:
#cloud-config
ssh_authorized_keys:
  - ssh_key_1
  - ssh_key_2
您还可以提前生成SSH服务器的私钥,并将它们放在文件系统上。如果您想事先向客户端提供有关此服务器的信息,允许服务器在上线时立即信任服务器,这可能非常有用。 要做到这一点,我们可以使用ssh_keys指令。 这可能需要使用RSA,DSA或ECDSA密钥的密钥对rsa_privatersa_publicdsa_privatedsa_publicecdsa_privateecdsa_public分项。 由于格式化和换行符对于私钥很重要,因此在指定这些时,请务必使用带管道密钥的块。此外,您必须包括开始键和结束对你的钥匙是有效的关键线路。
#cloud-config
ssh_keys:
  rsa_private: |
    -----BEGIN RSA PRIVATE KEY-----
    your_rsa_private_key
    -----END RSA PRIVATE KEY-----

  rsa_public: your_rsa_public_key

设置受信任的CA证书

如果您的基础结构依赖于由内部证书颁发机构签名的密钥,则可以通过注入证书信息来设置新计算机以信任您的CA证书。为此,我们使用了ca-certs指令。 此指令有两个子项。首先是remove-defaults ,当其设置为true,将删除所有的默认包含正常的证书信任信息。这通常不需要,如果你不知道你在做什么,可能会导致一些问题,所以谨慎使用。 第二项是trusted ,这是一个列表,每个包含可信CA证书:
#cloud-config
ca-certs:
  remove-defaults: true
  trusted:
    - |
      -----BEGIN CERTIFICATE-----
      your_CA_cert
      -----END CERTIFICATE-----

配置resolv.conf以使用特定DNS服务器

如果您已经配置您希望使用自己的DNS服务器,您可以通过使用管理您的服务器的resolv.conf文件resolv_conf指令。这目前仅适用于基于RHEL的分发。 根据resolv_conf指令,您可以用管理设置nameserverssearchdomainsdomainoptions项目。 该nameservers指令应该把你的域名服务器的IP地址列表。 该searchdomains指令采用域和子域的列表,当用户指定一台主机,但不是域搜索英寸 该domain设置应该用于任何解析的请求域, options包含一套可在resolv.conf文件中定义的选项。 如果您使用的是resolv_conf指令,你必须确保manage-resolv-conf指令也被设置为true。否则将忽略您的设置:
#cloud-config
manage-resolv-conf: true
resolv_conf:
  nameservers:
    - 'first_nameserver'
    - 'second_nameserver'
  searchdomains:
    - first.domain.com
    - second.domain.com
  domain: domain.com
  options:
    option1: value1
    option2: value2
    option3: value3

运行任意命令更多的控制

如果没有了管理措施的cloud-config提供适合你想做什么,你也可以运行任意命令。 你可以用做runcmd指令。 此伪指令接收要执行的项目列表。这些项目可以以两种不同的方式指定,这将影响它们的处理方式。 如果列表项目是一个简单的字符串,整个项目将被传递给sh shell进程来运行。 另一种选择是通过一个列表,其中每一个将在一个类似的方式如何被执行项execve过程命令。第一个项目将被解释为要运行的命令或脚本,并且以下项目将作为该命令的参数传递。 大多数用户可以使用这些格式,但是灵活性允许您选择最佳选项,如果您有特殊要求。任何输出将被写入标准输出,到/var/log/cloud-init-output.log文件:
#cloud-config
runcmd:
  - [ sed, -i, -e, 's/here/there/g', some_file]
  - echo "modified some_file"
  - [cat, some_file]

关闭或重新启动服务器

在某些情况下,您需要在执行其他项目后关闭或重新启动服务器。您可以通过设置做到这一点power_state指令。 此指令有四个子项可以设置。这些都是delaytimeoutmessagemode 。 该delay规定应该怎么长成未来会出现重启或关机。 默认情况下,这将是“现在”,意味着该过程将立即开始。 要添加一个延迟,用户应指定,以分钟的时间应该通过使用量+<num_of_mins>格式。 该timeout参数接受一个无单位的值表示的秒数等待云初始化启动前完成delay倒计时。 该message字段允许您指定将被发送到系统的所有用户的消息。 该mode规定了电源的事件来启动类型。这可以是“关闭”关闭服务器,“重新启动”重新启动服务器,或“停止”,让系统决定哪个是最好的操作(通常关闭):
#cloud-config
power_state:
  timeout: 120
  delay: "+5"
  message: Rebooting in five minutes. Please save your work.
  mode: reboot

结论

在运行时,上面的例子代表了一些可比较常见的配置项cloud-config文件。还有一些额外的功能,我们没有在本指南中介绍。这些包括配置管理设置,配置其他存储库,甚至在服务器初始化时使用外部URL注册。 您可以了解更多有关其中一些选项通过检查/usr/share/doc/cloud-init/examples目录。 对于一个实用的指南,以帮助您熟悉cloud-config文件,你可以按照我们的教程如何使用cloud-config来完成基本服务器配置在这里。