我们希望听到您的声音!帮助我们深入了解 Ansible 生态系统的现状。
参加 2024 年 Ansible 项目调查

为 Terraform 提供 Ansible 魔法

为 Terraform 提供 Ansible 魔法

去年年底,我们发布了 Red Hat Ansible 认证集合 Terraform 集合。这是自动化领域的重要一步,因为这两个工具非常适合一起使用,并且利用 Ansible 在企业中编排其他工具的能力使这成为一个明智之举。Terraform 的基础设施即代码 (IaC) 配置和 Ansible 在配置即代码方面的优势相辅相成,不可忽视 - 我们携手共进!现在,组织可以利用现有的基础设施即代码清单,并通过 Terraform 和 Ansible 协同扩展自动化功能。  

现在,我们携手 Kyndryl 和 XLAB 的合作伙伴,为基础设施即代码增添更多价值和魔力 - 这一次,我们在 Red Hat Ansible 认证内容集合中添加了一些额外的功能:Terraform 的 Ansible 提供程序。

那么提供程序能帮我们做什么呢?

如果没有提供程序,我们将需要依赖不同云平台的清单插件,并使用过滤器从我们新构建的“Terraformed”基础设施中获取实例信息。这使我们能够更新清单,以便我们能够针对这些主机运行自动化任务。这在工作流程中非常流畅,特别是如果您使用的是带有工作流程的自动化控制器。但是,这种情况并非没有复杂性,那么那些不使用自动化控制器的 Terraform 用户怎么办?我们如何利用 Ansible 并将这两个工具结合在一起?Terraform 的 Ansible 提供程序可以帮助我们!

在集合中使用 Ansible 提供程序,我们能够在 main.tf 文件中定义 Ansible 清单的使用,并且一旦 Terraform 初始化和构建项目,我们就可以从状态文件中收集 Terraform 资源信息并将其推送到清单中。

让我们仔细看看

main.tf

terraform {
  required_providers {                     #### ansible provider
    ansible = {
      version = "~> 0.0.1"
      source  = "terraform-ansible.com/ansibleprovider/ansible"
    }
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}


resource "ansible_host" "my_ec2" {          #### ansible host details
  name   = aws_instance.my_ec2.public_dns
  groups = ["nginx"]
  variables = {
    ansible_user                 = "ansible",
    ansible_ssh_private_key_file = "~/.ssh/id_rsa",
    ansible_python_interpreter   = "/usr/bin/python3"

main.tf 中使用提供程序使我们能够表明我们希望使用 Ansible 清单,并允许我们为清单指定 Ansible 主机详细信息。然后,Terraform 可以初始化和规划项目,并嵌入详细信息。如果我们查看生成的 Terraform 状态文件,我们可以看到已定义的主机详细信息

terraform.tfstate                      #### Inside main.tf


"mode": "managed",
      "type": "ansible_host",
      "name": "my_ec2",
      "provider": "provider[\"terraform-ansible.com/ansibleprovider/ansible\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "groups": [
              "nginx"
            ],
            "id": "ec2-18-130-240-228.eu-west-2.compute.amazonaws.com",
            "name": "ec2-18-130-240-228.eu-west-2.compute.amazonaws.com",
            "variables": {
              "ansible_python_interpreter": "/usr/bin/python3",
              "ansible_ssh_private_key_file": "~/.ssh/id_rsa",
              "ansible_user": "ansible"
            }
          },

仔细查看清单,我们可以看到该插件已从 Terraform 状态文件中定义的资源中填充了实例数据。

…inventory.yml
---
plugin: cloud.terraform.terraform_provider
ansible-inventory -i inventory.yml --graph --vars

@all:
  |--@nginx:
  |  |--ec2-18-130-240-228.eu-west-2.compute.amazonaws.com
  |  |  |--{ansible_python_interpreter = /usr/bin/python3}
  |  |  |--{ansible_ssh_private_key_file = ~/.ssh/id_rsa}
  |  |  |--{ansible_user = ubuntu}
  |--@ungrouped:

现在,我们可以针对此清单运行剧本,并在主机上自动化配置或其他配置后任务,而不会出现任何麻烦。

Step 1: terraform plan
Step 2: terraform apply

Deploying with Terraform


Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
++ ansible-playbook -i inventory.yml playbook.yml

PLAY [Install nginx on remote host] *****************************************************************************************

TASK [wait_for_connection] **************************************************************************************************
The authenticity of host 'ec2-18-130-240-228.eu-west-2.compute.amazonaws.com (18.130.240.228)' can't be established.
ECDSA key fingerprint is SHA256:jRqiAGPDzuYGe+l7jNsmQays2qb/C/SJqtnH6pc42ns.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
ok: [ec2-18-130-240-228.eu-west-2.compute.amazonaws.com]

TASK [setup] ****************************************************************************************************************
ok: [ec2-18-130-240-228.eu-west-2.compute.amazonaws.com]

TASK [Install nginx] ********************************************************************************************************
changed: [ec2-18-130-240-228.eu-west-2.compute.amazonaws.com]

TASK [Start nginx] **********************************************************************************************************
ok: [ec2-18-130-240-228.eu-west-2.compute.amazonaws.com]

PLAY RECAP ******************************************************************************************************************
ec2-18-130-240-228.eu-west-2.compute.amazonaws.com : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

当您使用 Terraform 进行部署,同时利用 Ansible 进行云操作(如应用程序部署和 CI/CD 管道、生命周期管理和强制执行、操作系统修补和维护)时,此新提供程序非常有用。由于此提供程序是 Red Hat Ansible 认证内容集合的一部分,我们还提供了持续的维护和支持!