使用 Ansible 部署无服务器应用程序

无服务器是托管服务方向的又一步,并且与 Ansible 的无代理架构配合良好。
451 位读者喜欢这个。
A guide to packing and preparing for a tech conference

Opensource.com

Ansible 被设计为真正有效的最简单的部署工具。这意味着它不是一种完整的编程语言。您编写 YAML 模板来定义任务,并列出您需要自动化工作的任何任务。

大多数人认为 Ansible 是“'for' 循环中的 SSH”的增强版本,这对于简单的用例来说是正确的。但实际上 Ansible 关注的是任务,而不是 SSH。对于许多用例,我们通过 SSH 连接,但也支持 Windows 机器的 Windows 远程管理 (WinRM)、网络设备的不同协议以及云服务的通用语言 HTTPS API。

在云中,Ansible 可以在两个独立的层面上运行:控制层面和实例上资源。控制层面包括所有在操作系统上运行的东西。这包括设置网络、生成实例、配置更高级别的服务(如 Amazon 的 S3 或 DynamoDB)以及保持云基础设施安全并为客户服务所需的一切。

实例上工作是您已经了解的 Ansible 的用途:启动和停止服务、模板化配置文件、安装软件包以及您可以通过 SSH 完成的所有其他与操作系统相关的事情。

现在,无服务器怎么样? 根据您询问的对象,无服务器要么是持续涌向公共云的最终延伸,要么是一种全新的范例,其中一切都是 API 调用,而且以前从未这样做过。

Ansible 采取第一种观点。在“无服务器”成为一个术语之前,用户必须管理和配置 EC2 实例、虚拟私有云 (VPC) 网络以及其他一切。无服务器是托管服务方向的又一步,并且与 Ansible 的无代理架构配合良好。

在我们深入探讨 Lambda 示例之前,让我们先看一下配置 CloudFormation 堆栈的更简单任务

- name: Build network
  cloudformation:
    stack_name: prod-vpc
    state: present
    template: base_vpc.yml

编写这样的任务只需几分钟,但它将构建基础设施中涉及的最后一个半手动步骤——单击“创建堆栈”——带入包含其他一切的 playbook 中。现在,您的 VPC 只是在构建新区域时可以调用的另一个任务。

由于云提供商是关于您的帐户中真正发生的事情的真实来源,因此 Ansible 有多种方法可以拉回这些信息,并使用 ID、名称和其他参数来过滤和查询正在运行的实例或网络。例如,我们可以使用 cloudformation_facts 模块来从我们刚刚创建的模板中获取子网 ID、网络范围和其他数据。

- name: Pull all new resources back in as a variable
  cloudformation_facts:
    stack_name: prod-vpc
  register: network_stack

对于无服务器应用程序,除了任何其他 DynamoDB 表、S3 存储桶和任何其他内容之外,您肯定还需要 Lambda 函数的补充。幸运的是,通过使用 lambda 模块,可以以与上一个任务中的堆栈相同的方式创建 Lambda 函数

- lambda:
    name: sendReportMail
    zip_file: "{{ deployment_package }}"
    runtime: python3.6
    handler: report.send
    memory_size: 1024
    role: "{{ iam_exec_role }}"
  register: new_function

如果您有另一个您更喜欢的工具来交付应用程序的无服务器部分,那也可以。开源 Serverless Framework 有自己的 Ansible 模块,效果也一样好

- serverless:
    service_path: '{{ project_dir }}'
    stage: dev
  register: sls
- name: Serverless uses CloudFormation under the hood, so you can easily pull info back into Ansible
  cloudformation_facts:
    stack_name: "{{ sls.service_name }}"
  register: sls_facts

这还不是您需要的全部,因为无服务器项目也必须存在,您将在其中完成定义函数和事件源的繁重工作。对于此示例,我们将创建一个响应 HTTP 请求的单个函数。Serverless Framework 使用 YAML 作为其配置语言(Ansible 也是如此),因此这应该看起来很熟悉。

# serverless.yml
service: fakeservice

provider:
  name: aws
  runtime: python3.6

functions:
  main:
    handler: test_function.handler
    events:
      - http:
          path: /
          method: get

AnsibleFest 上,我将介绍这个示例和其他深入的部署策略,以充分利用您已经拥有的 Ansible playbook 和基础设施,以及新的无服务器实践。无论您是否能够到场,我都希望这些示例能够帮助您开始使用 Ansible——无论您是否有任何服务器需要管理。

AnsibleFest 是一个为期一天的会议,汇集了数百名 Ansible 用户、开发人员和行业合作伙伴。加入我们,了解产品更新、励志演讲、技术深入探讨、动手演示以及一天的交流活动。获取 9 月 7 日在旧金山举行的 AnsibleFest 的门票。使用折扣码 OPENSOURCE 节省 25% 的注册费

标签
User profile image.
Ryan 是一名高级软件工程师,大部分时间都花在云相关的开源工具上,包括 Ansible 和 Serverless Framework。

评论已关闭。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.