介绍
在
cloud-init
程序,可在近期发行(Ubuntu仅14.04和CentOS 7在写这篇文章的时候)能消耗,并从执行数据
user-data
的领域
DigitalOcean元数据服务 。 此过程的行为不同,具体取决于找到的信息的格式。 其中最流行的格式中的脚本
user-data
是
cloud-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
文件。如果这是一个常规脚本文件,第一行将指示应该用于执行该文件的解释器。 上面的文件有两个顶级指示,
users
和
runcmd
。这两者都作为键。这些键的值由键后的所有缩进行组成。 在的情况下,
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_private
,
rsa_public
,
dsa_private
,
dsa_public
,
ecdsa_private
和
ecdsa_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
指令,您可以用管理设置
nameservers
,
searchdomains
,
domain
和
options
项目。 该
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
指令。 此指令有四个子项可以设置。这些都是
delay
,
timeout
,
message
和
mode
。 该
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来完成基本服务器配置在这里。