Packet.net 指南

简介

Packet.net 是一个裸金属基础设施主机,由 community.general 集合通过六个云模块支持。这六个模块是

注意,本指南假设您熟悉 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 参数)。您必须提供 planoperating_systemlocation 默认值为 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_idshostnames 参数是互斥的。以下值都是可以接受的

  • 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 设备,您只能传递 hostnamedevice_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。此外,您可以随意更改 planfacility

# 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 地址版本(有效值为 46,分别代表 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