Scaleway 指南

简介

Scaleway 是一个由 community.general 集合支持的云提供商,通过一组插件和模块。这些模块是

插件是

注意

本指南假设您熟悉 Ansible 及其工作原理。如果您不熟悉,请在开始之前查看 ansible_documentation

要求

Scaleway 模块和清单脚本使用 Scaleway REST API 连接到 Scaleway API。要使用模块和清单脚本,您需要一个 Scaleway API 令牌。您可以通过 Scaleway 控制台的凭据页面生成 API 令牌。验证自己的身份的最简单方法是在环境变量中设置 Scaleway API 令牌

$ export SCW_TOKEN=00000000-1111-2222-3333-444444444444

如果您不希望导出您的 API 令牌,您可以使用 api_token 参数将其作为参数传递给模块。

如果您想在本教程中使用新的 SSH 密钥对,您可以将其生成到 ./id_rsa./id_rsa.pub,如下所示

$ ssh-keygen -t rsa -f ./id_rsa

如果您想使用现有的密钥对,只需将私钥和公钥复制到剧本目录中即可。

如何添加 SSH 密钥?

连接到 Scaleway 计算节点使用安全外壳。SSH 密钥存储在帐户级别,这意味着您可以在多个节点中重复使用相同的 SSH 密钥。配置 Scaleway 计算资源的第一步是至少配置一个 SSH 密钥。

community.general.scaleway_sshkey 是一个管理 Scaleway 帐户上的 SSH 密钥的模块。您可以通过在剧本中包含以下任务来将 SSH 密钥添加到您的帐户

- name: "Add SSH key"
  community.general.scaleway_sshkey:
    ssh_pub_key: "ssh-rsa AAAA..."
    state: "present"

ssh_pub_key 参数包含您的 ssh 公钥作为字符串。以下是剧本中的示例

- name: Test SSH key lifecycle on a Scaleway account
  hosts: localhost
  gather_facts: false
  environment:
    SCW_API_KEY: ""

  tasks:

    - community.general.scaleway_sshkey:
        ssh_pub_key: "ssh-rsa AAAAB...424242 [email protected]"
        state: present
      register: result

    - ansible.builtin.assert:
        that:
          - result is success and result is changed

如何创建计算实例?

现在我们已经配置了一个 SSH 密钥,下一步是启动服务器! community.general.scaleway_compute 是一个可以创建、更新和删除 Scaleway 计算实例的模块

- name: Create a server
  community.general.scaleway_compute:
    name: foobar
    state: present
    image: 00000000-1111-2222-3333-444444444444
    organization: 00000000-1111-2222-3333-444444444444
    region: ams1
    commercial_type: START1-S

以下是上面显示的示例的参数详细信息

  • name 是实例的名称(将在您的 Web 控制台中显示的名称)。

  • image 是您要使用的系统映像的 UUID。每个可用区都提供了所有映像的列表。

  • organization 表示您的帐户所附加到的组织。

  • region 表示您的实例所在的可用区(对于此示例,为 par1ams1)。

  • commercial_type 表示商业产品的名称。您可以查看 Scaleway 定价页面,以找到适合您的实例。

请查看此简短的剧本,以查看使用 scaleway_compute 的工作示例

- name: Test compute instance lifecycle on a Scaleway account
  hosts: localhost
  gather_facts: false
  environment:
    SCW_API_KEY: ""

  tasks:

    - name: Create a server
      register: server_creation_task
      community.general.scaleway_compute:
        name: foobar
        state: present
        image: 00000000-1111-2222-3333-444444444444
        organization: 00000000-1111-2222-3333-444444444444
        region: ams1
        commercial_type: START1-S
        wait: true

    - ansible.builtin.debug:
        var: server_creation_task

    - ansible.builtin.assert:
        that:
          - server_creation_task is success
          - server_creation_task is changed

    - name: Run it
      community.general.scaleway_compute:
        name: foobar
        state: running
        image: 00000000-1111-2222-3333-444444444444
        organization: 00000000-1111-2222-3333-444444444444
        region: ams1
        commercial_type: START1-S
        wait: true
        tags:
          - web_server
      register: server_run_task

    - ansible.builtin.debug:
        var: server_run_task

    - ansible.builtin.assert:
        that:
          - server_run_task is success
          - server_run_task is changed

动态清单插件

Ansible 附带 community.general.scaleway。您现在可以通过此插件获取 Scaleway 资源的完整清单,并根据不同的参数进行过滤(目前支持 regionstags)。

让我们创建一个示例!假设我们要获取所有带有标签 web_server 的主机。创建一个名为 scaleway_inventory.yml 的文件,内容如下

plugin: community.general.scaleway
regions:
  - ams1
  - par1
tags:
  - web_server

此清单表示我们想要获取 ams1par1 区域中带有标签 web_server 的所有主机。配置此文件后,您可以使用以下命令获取信息

$ ansible-inventory --list -i scaleway_inventory.yml

输出将是

{
    "_meta": {
        "hostvars": {
            "dd8e3ae9-0c7c-459e-bc7b-aba8bfa1bb8d": {
                "ansible_verbosity": 6,
                "arch": "x86_64",
                "commercial_type": "START1-S",
                "hostname": "foobar",
                "ipv4": "192.0.2.1",
                "organization": "00000000-1111-2222-3333-444444444444",
                "state": "running",
                "tags": [
                    "web_server"
                ]
            }
        }
    },
    "all": {
        "children": [
            "ams1",
            "par1",
            "ungrouped",
            "web_server"
        ]
    },
    "ams1": {},
    "par1": {
        "hosts": [
            "dd8e3ae9-0c7c-459e-bc7b-aba8bfa1bb8d"
        ]
    },
    "ungrouped": {},
    "web_server": {
        "hosts": [
            "dd8e3ae9-0c7c-459e-bc7b-aba8bfa1bb8d"
        ]
    }
}

正如您所见,我们得到了不同的主机组。par1ams1 是基于位置的分组。web_server 是基于标签的分组。

如果未定义过滤器参数,插件会假设需要所有可能的值。这意味着对于您的 Scaleway 计算节点上存在的每个标签,都会创建一个基于每个标签的分组。

Scaleway S3 对象存储

对象存储 允许您存储任何类型的对象(文档、图像、视频等)。由于 Scaleway API 与 S3 兼容,因此 Ansible 通过 amazon.aws 模块原生支持它:amazon.aws.s3_bucket, amazon.aws.s3_object

您可以在 scaleway_s3 集成测试中找到许多示例。

- hosts: myserver
  vars:
    scaleway_region: nl-ams
    s3_url: https://s3.nl-ams.scw.cloud
  environment:
    # AWS_ACCESS_KEY matches your scaleway organization id available at https://cloud.scaleway.com/#/account
    AWS_ACCESS_KEY: 00000000-1111-2222-3333-444444444444
    # AWS_SECRET_KEY matches a secret token that you can retrieve at https://cloud.scaleway.com/#/credentials
    AWS_SECRET_KEY: aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
  module_defaults:
    group/amazon.aws.aws:
      s3_url: '{{ s3_url }}'
      region: '{{ scaleway_region }}'
  tasks:
   # use a fact instead of a variable, otherwise template is evaluate each time variable is used
    - ansible.builtin.set_fact:
        bucket_name: "{{ 99999999 | random | to_uuid }}"

    # "requester_pays:" is mandatory because Scaleway does not implement related API
    # another way is to use amazon.aws.s3_object and "mode: create" !
    - amazon.aws.s3_bucket:
        name: '{{ bucket_name }}'
        requester_pays:

    - name: Another way to create the bucket
      amazon.aws.s3_object:
        bucket: '{{ bucket_name }}'
        mode: create
        encrypt: false
      register: bucket_creation_check

    - name: add something in the bucket
      amazon.aws.s3_object:
        mode: put
        bucket: '{{ bucket_name }}'
        src: /tmp/test.txt  #  needs to be created before
        object: test.txt
        encrypt: false  # server side encryption must be disabled