Packet.net 指南
简介
Packet.net 是一个裸金属基础设施主机,由 community.general 集合通过六个云模块支持。这六个模块是
community.general.packet_device:管理 Packet 上的服务器。您可以使用此模块创建、重启和删除设备。
community.general.packet_ip_subnet:为裸金属服务器分配 IP 子网
community.general.packet_project:在 Packet 主机中创建/删除项目
community.general.packet_sshkey:将公共 SSH 密钥从文件或值添加到 Packet 基础设施。每个随后创建的设备都将在 .ssh/authorized_keys 中安装此公共密钥。
community.general.packet_volume:在 Packet 主机中创建/删除卷
community.general.packet_volume_attachment:将卷附加/分离到 Packet 主机中的设备
注意,本指南假设您熟悉 Ansible 及其工作原理。如果您不熟悉,请在开始之前查看其文档。
需求
Packet 模块使用 packet-python 包 连接到 Packet API。您可以使用 pip 安装它。
$ pip install packet-python
为了检查 Ansible 在 Packet 上创建的设备的状态,最好安装一个 Packet CLI 客户端。否则,您可以通过 Packet 门户 检查它们。
要使用这些模块,您需要一个 Packet API 令牌。您可以通过 Packet 门户此处生成 API 令牌。最简单的身份验证方法是将 Packet API 令牌设置到环境变量中。
$ export PACKET_API_TOKEN=Bfse9F24SFtfs423Gsd3ifGsd43sSdfs
如果您不方便导出 API 令牌,您可以将其作为参数传递给模块。
在 Packet 上,设备和保留的 IP 地址属于 项目。为了使用 packet_device 模块,您需要指定要创建或管理设备的项目的 UUID。您可以在 Packet 门户此处(就在项目表格下方)或通过其中一个可用的 CLI 找到项目的 UUID。
如果您想在本教程中使用新的 SSH 密钥对,您可以将其生成到 ./id_rsa
和 ./id_rsa.pub
,方法如下:
$ ssh-keygen -t rsa -f ./id_rsa
如果您想使用现有的密钥对,只需将私钥和公钥复制到 playbook 目录即可。
设备创建
下面的代码块是一个简单的 playbook,它创建一个 0 型 服务器(plan
参数)。您必须提供 plan
和 operating_system
。location
默认值为 ewr1
(新泽西州帕西帕尼)。您可以通过 CLI 客户端 找到参数的所有可能值。
# playbook_create.yml
- name: Create Ubuntu device
hosts: localhost
tasks:
- community.general.packet_sshkey:
key_file: ./id_rsa.pub
label: tutorial key
- community.general.packet_device:
project_id: <your_project_id>
hostnames: myserver
operating_system: ubuntu_16_04
plan: baremetal_0
facility: sjc1
运行 ansible-playbook playbook_create.yml
后,您应该在 Packet 上配置了一个服务器。您可以通过 CLI 或 Packet 门户 进行验证。
如果收到错误消息“failed to set machine state present, error: Error 404: Not Found”,请验证您的项目 UUID。
更新设备
用于唯一标识 Packet 设备的两个参数是:“device_ids”和“hostnames”。这两个参数都接受单个字符串(稍后转换为一个元素列表)或字符串列表。
device_ids
和 hostnames
参数是互斥的。以下值都是可以接受的
device_ids:
a27b7a83-fc93-435b-a128-47a5b04f2dcf
hostnames:
mydev1
device_ids:
[a27b7a83-fc93-435b-a128-47a5b04f2dcf, 4887130f-0ccd-49a0-99b0-323c1ceb527b]
hostnames:
[mydev1, mydev2]
此外,主机名可以包含特殊的 %d
格式化程序以及 count
参数,使您可以轻松扩展遵循简单名称和数字模式的主机名;换句话说,hostnames: "mydev%d", count: 2
将扩展到 [mydev1, mydev2]。
如果您的 playbook 作用于现有的 Packet 设备,您只能传递 hostname
和 device_ids
参数。以下 playbook 显示如何通过设置 hostname
参数来重新启动特定的 Packet 设备。
# playbook_reboot.yml
- name: reboot myserver
hosts: localhost
tasks:
- community.general.packet_device:
project_id: <your_project_id>
hostnames: myserver
state: rebooted
您还可以使用 device_ids
参数标识特定的 Packet 设备。设备的 UUID 可以在 Packet 门户 中找到,或者使用 CLI。以下 playbook 使用 device_ids
字段删除 Packet 设备。
# playbook_remove.yml
- name: remove a device
hosts: localhost
tasks:
- community.general.packet_device:
project_id: <your_project_id>
device_ids: <myserver_device_id>
state: absent
更复杂的 Playbook
在此示例中,我们将使用 用户数据 创建一个 CoreOS 集群。
CoreOS 集群将使用 etcd 来发现集群中的其他服务器。在配置服务器之前,您需要为集群生成一个发现令牌。
$ curl -w "\n" 'https://discovery.etcd.io/new?size=3'
以下剧本将创建一个 SSH 密钥,3 台 Packet 服务器,然后等待 SSH 就绪(或等待 5 分钟)。请确保在运行 ansible-playbook
之前替换 user_data
中的发现令牌 URL 和 project_id
。此外,您可以随意更改 plan
和 facility
。
# playbook_coreos.yml
- name: Start 3 CoreOS nodes in Packet and wait until SSH is ready
hosts: localhost
tasks:
- community.general.packet_sshkey:
key_file: ./id_rsa.pub
label: new
- community.general.packet_device:
hostnames: [coreos-one, coreos-two, coreos-three]
operating_system: coreos_beta
plan: baremetal_0
facility: ewr1
project_id: <your_project_id>
wait_for_public_IPv: 4
user_data: |
#cloud-config
coreos:
etcd2:
discovery: https://discovery.etcd.io/<token>
advertise-client-urls: http://$private_ipv4:2379,http://$private_ipv4:4001
initial-advertise-peer-urls: http://$private_ipv4:2380
listen-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001
listen-peer-urls: http://$private_ipv4:2380
fleet:
public-ip: $private_ipv4
units:
- name: etcd2.service
command: start
- name: fleet.service
command: start
register: newhosts
- name: wait for ssh
ansible.builtin.wait_for:
delay: 1
host: "{{ item.public_ipv4 }}"
port: 22
state: started
timeout: 500
loop: "{{ newhosts.results[0].devices }}"
与大多数 Ansible 模块一样,Packet 模块的默认状态是幂等的,这意味着在重新运行剧本后,项目中的资源将保持不变。因此,我们可以保留剧本中的 packet_sshkey
模块调用。如果公钥已存在于您的 Packet 帐户中,则该调用将不会产生任何影响。
第二个模块调用在由 project_id
参数标识的项目中配置 3 台 Packet 类型 0(使用 plan
参数指定)服务器。所有服务器都使用 CoreOS beta(operating_system
参数)进行配置,并使用传递给 user_data
参数的 cloud-config 用户数据进行自定义。
packet_device
模块具有 wait_for_public_IPv
参数,用于指定要等待的 IP 地址版本(有效值为 4
或 6
,分别代表 IPv4 或 IPv6)。如果指定了该参数,Ansible 将等待设备的 GET API 调用包含指定版本的可互联网路由 IP 地址。在后续模块调用中引用已创建设备的 IP 地址时,最好使用 wait_for_public_IPv
参数,或在 packet_device
模块调用中使用 state: active
。
运行剧本
$ ansible-playbook playbook_coreos.yml
剧本退出后,您的新设备应该可以通过 SSH 访问。尝试连接到一台设备并检查 etcd 是否已正确启动。
tomk@work $ ssh -i id_rsa core@$one_of_the_servers_ip
core@coreos-one ~ $ etcdctl cluster-health
如有任何问题或意见,请告知我们! help@packet.net