为 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 认证内容集合的一部分,我们还提供了持续的维护和支持!