1.4. 从 Terraform 集成
如果您已经置备了 Terraform Enterprise 的环境,您可以使用 Terraform 官方供应商来利用 Ansible Automation Platform 自动化功能。
1.4.1. 配置供应商 复制链接链接已复制到粘贴板!
您必须将供应商配置为允许 Terraform 引用和管理 Ansible Automation Platform 资源的子集。
供应商配置属于 Terraform 配置的根模块。子模块从 root 模块接收其提供程序配置。
先决条件
- 已安装并配置了 Terraform Enterprise 或 HCP Terraform。
您已从 Terraform registry 安装了
terraform-provider-aap的最新发行版本。注意Terraform registry 中的默认最新版本可能是一个预发布版本(如 1.2.3-beta)。选择一个支持的发行版本,它使用 1.2.3 格式而无需横线。
您已为 Ansible Automation Platform 创建用户名和密码或 API 令牌。也支持环境变量。
注意建议使用令牌身份验证,因为用户可以管理特定集成的令牌(如 Terraform),限制令牌访问,并完全控制令牌生命周期。
流程
创建 Terraform 配置(
.tf)文件。包括一个providerblock。block 标头中指定的名称是要配置的提供程序的本地名称。https://developer.hashicorp.com/terraform/language/providers/requirements#local-names此提供程序应已包含在required_providers块中。示例
# This example creates an inventory named `My new inventory` # and adds a host `tf_host` and a group `tf_group` to it, # and then launches a job based on the "Demo Job Template" # in the "Default" organization using the inventory created. # terraform { required_providers { aap = { source = "ansible/aap" } } } provider "aap" { host = "https://AAP_HOST" token = "my-aap-token" # Do not record credentials directly in the Terraform configuration. Provide your token using the AAP_TOKEN environment variable. } resource "aap_inventory" "my_inventory" { name = "My new inventory" description = "A new inventory for testing" organization = 1 variables = jsonencode( { "foo" : "bar" } ) } resource "aap_group" "my_group" { inventory_id = aap_inventory.my_inventory.id name = "tf_group" variables = jsonencode( { "foo" : "bar" } ) } resource "aap_host" "my_host" { inventory_id = aap_inventory.my_inventory.id name = "tf_host" variables = jsonencode( { "foo" : "bar" } ) groups = [aap_group.my_group.id] } data "aap_job_template" "demo_job_template" { name = "Demo Job Template" organization_name = "Default" } # In order for passing the inventory id to the job template execution, the Inventory on the job template needs to be set to "prompt on launch" resource "aap_job" "my_job" { inventory_id = aap_inventory.my_inventory.id job_template_id = aap_job_template.demo_job_template.id # This resource creation needs to wait for the host and group to be created in the inventory depends_on = [ aap_host.my_host, aap_group.my_group ] }添加配置参数,如上例中所示。您必须配置主机和凭证。在
aap供应商发行版本的 Terraform registry 中提供了受支持的模式的完整列表。-
Host: (字符串)AAP 服务器 URL。也可以使用AAP_HOST环境变量进行配置。 -
insecure_skip_verify: (Boolean)如果为true,请将提供程序配置为跳过 TLS 证书验证。也可以通过设置AAP_INSECURE_SKIP_VERIFY环境变量来配置。 -
Password : (字符串,问题单敏感)密码用于基本身份验证。
如果设置了令牌,则忽略。请注意,出于安全原因,不建议硬编码凭证。最佳实践是使用AAP_PASSWORD环境变量替代的。 -
超时: (Number) Timeout 为向 AAP 服务器发出的请求指定时间限制。如果没有提供,则默认为 5。超时值为零表示没有超时。也可以通过设置AAP_TIMEOUT环境变量来配置。 -
Token : (字符串,问题单敏感):用于令牌身份验证的令牌。
请注意,出于安全原因,不建议硬编码凭证。最佳实践是使用AAP_TOKEN环境变量替代的。 -
用户名:( 字符串)用于基本身份验证的用户名。如果设置了令牌,则忽略。也可以通过设置AAP_USERNAME环境变量来配置。
-
- (可选)您可以在这些配置参数的值中使用 表达式,但只能引用应用配置前已知的值。
-
(可选)您还可以使用由 Terraform 定义并可用于所有供应商块
的别名meta-argument。别名可让您为不同的资源使用不同的配置相同的供应商。
1.4.2. 使用 TF 操作和 Ansible Automation Platform 复制链接链接已复制到粘贴板!
在 Ansible Automation Platform 中使用 Terraform (TF)操作在基础架构置备后触发自动配置。
1.4.2.1. 关于 Terraform 操作和 Ansible Automation Platform 复制链接链接已复制到粘贴板!
Terraform (TF) 操作向 HCL 语言添加一个强制操作 块,允许您在置备基础架构后执行步骤,而无需保留声明性 Terraform 工作流。这会使整个基础架构和配置过程在 Terraform 配置中可见。
TF Actions 可用于触发用于配置管理的 Ansible 自动化,如向 Ansible Automation Platform 发送事件和有效负载来配置新置备的虚拟机。
Ansible Automation Platform 的 Terraform 供应商实现了两个操作:
- 直接启动作业:将作业 作为直接、直接执行请求运行到 Ansible Automation Platform。您必须明确定义 TF Action 应该调用哪些特定的 Ansible Automation Platform 作业模板。
- 使用 Event-Driven Ansible: 向 Ansible Automation Platform 发送事件,然后使用规则手册智能决定根据事件有效负载运行哪个 playbook。这可以实现更动态、可扩展和被动自动化。
1.4.2.2. 使用 TF 操作作为直接作业 复制链接链接已复制到粘贴板!
当您使用 TF Actions 通过 Ansible Automation Platform 直接启动作业时,此过程将精简和顺序。
这种方法的好处是一个干净的可预测状态:Ansible 作业在 Terraform 应用周期内启动,Terraform 收到一个明确的二进制状态。请注意,每个更改都会启动一个具有相同配置的独立作业。
当您要对新调配的服务器执行 Ansible 自动化时,此方法非常有用。例如,最后的恶意配置或在新主机上应用常规安全补丁作业。
先决条件
- 您已配置了 AAP Terraform 供应商来使用 Ansible Automation Platform 进行身份验证。
您已配置了 AWS Terraform 供应商,以通过 Amazon Web Services 进行身份验证。
注意以下示例使用 Amazon Web Services (AWS),并需要一个可能会收取费用的 AWS 帐户。您可以调整模式,以使用不同的云供应商。
您已配置了作业模板:
- 清单设置为 启动时提示。
- 与本地文件中可用的公钥匹配的机器凭据(私钥)。
流程
-
在 5.2.
tf文件中定义aap_job_launch操作。 添加生命周期作业块,以定义在正确的生命周期事件触发器期间调用哪些操作。
示例
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 6.0"
}
aap = {
source = "ansible/aap"
version = "~> 1.4.0"
}
}
}
provider "aap" {
# Configure authentication as needed.
}
provider "aws" {
region = "us-west-1"
# Configure authentication as needed.
}
variable "public_key_path" {
type = string
description = "Local path to a public key file to inject into the VM. Your AAP Job Template must have the matching private key configured as a machine credential."
}
resource "aws_key_pair" "key_pair" {
key_name = "aap-terraform-actions-demo-key"
public_key = file(var.public_key_path)
}
data "aws_ami" "rhel_ami" {
most_recent = true
filter {
name = "name"
values = ["RHEL-9*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["309956199498"] # Red Hat
}
resource "aws_instance" "instance" {
ami = data.aws_ami.rhel_ami.id
instance_type = "t2.micro"
associate_public_ip_address = true
key_name = aws_key_pair.key_pair.key_name
}
# Look up Organization ID
data "aap_organization" "organization" {
name = "Default"
}
# Create an inventory
resource "aap_inventory" "inventory" {
name = "Actions Demo Inventory"
organization = data.aap_organization.organization.id
}
data "aap_job_template" "job_template" {
name = "Demo Job Template"
organization_name = data.aap_organization.organization.name
}
#
# Direct job launch action example
#
resource "aap_host" "host" {
inventory_id = aap_inventory.inventory.id
name = resource.aws_instance.instance.public_ip
# Setting a value of 10 for SSH retries because terraform will mark the
# instance 'created' before it is ready to accept connections from Ansible.
variables = jsonencode(
{
"ansible_ssh_retries" : 10
}
)
# Configure a job launch after the host is created in inventory
lifecycle {
action_trigger {
events = [after_create]
actions = [action.aap_job_launch.job_launch]
}
}
}
action "aap_job_launch" "job_launch" {
config {
inventory_id = aap_inventory.inventory.id
job_template_id = data.aap_job_template.job_template.id
wait_for_completion = true
}
}
- (必需)将本示例中的作业模板名称和清单名称改为您的对应变量。
-
(可选)您可以将所有者设置为 Red Hat RHEL 镜像 ID,以便每次作业运行时都会使用最新的镜像。
-
(可选)根据需要设置 附加参数。例如,您可以将
wait_for_completion设置为true,然后 Terraform 将等待到创建此作业并达到任何最终状态,然后再继续。您还可以设置wait_for_completion_timeout_seconds来控制超时限制。 - 更新并提交 Terraform 代码。
- 执行 Terraform 计划并应用它。
1.4.2.3. 使用带有 Event-Driven Ansible 的 TF 操作 复制链接链接已复制到粘贴板!
event-Driven Ansible 是一个自动化功能,它允许 Ansible Automation Platform 对实时事件做出反应,而不是根据调度或手动请求触发。
1.4.2.3.1. 配置事件流 复制链接链接已复制到粘贴板!
要将 TF 操作与 Event-Driven Ansible 搭配使用,您必须首先在 Ansible Automation Platform 中配置事件流。TF 操作将事件发布到此流。
先决条件
- 您已配置了 AAP Terraform 供应商来使用 Ansible Automation Platform 进行身份验证。
您已配置了 AWS Terraform 供应商,以通过 Amazon Web Services 进行身份验证。
注意以下示例使用 Amazon Web Services (AWS),并需要一个可能会收取费用的 AWS 帐户。您可以调整模式,以使用不同的云供应商。
在 Default 组织中有一个名为 EDA Actions Demo Inventory 的 Ansible Automation Platform 清单。
您已配置了作业模板:
- 清单设置为 EDA Actions Demo Inventory。
- 与本地文件中可用的公钥匹配的机器凭据(私钥)。
流程
- 登录到 Ansible Automation Platform 用户界面。
-
导航到
。 - 点 。
在 Create event stream 页面中,编辑字段:
-
名称 : 您的事件流的描述性、唯一名称(如
Terraform provider_Events)。 -
Organization : 选择此事件流将属于的机构(通常为
Default或 your specific organization)。 - event stream type : 选择与您要接收事件匹配的类型。此集成支持 基本事件流 (用户名/密码)。
- 凭证 : 选择一个您预先创建用于使用此事件流进行身份验证的凭证。
- headers :(可选)输入您要包含在转发到规则规则的事件有效负载中的以逗号分隔的 HTTP 标头键。保留此为空以包括所有标头。
- 将事件转发到规则手册激活 : 此选项通常默认启用。禁用它可用于测试和诊断您的连接和传入的数据,而不会意外地触发任何自动化。
-
名称 : 您的事件流的描述性、唯一名称(如
点 。然后导航到
,以验证事件流是否已创建并查看目前收到的事件数量。 您还可以点击特定流来查看其详细配置,包括机构、事件流类型、关联的凭证和事件转发设置。
设置 规则手册激活。确保:
- 将事件流添加到规则手册中。
- (推荐)选择 启用 Rulebook 激活? 选项,以在创建后自动启动激活。
- 激活规则手册。
-
选择
,以验证规则手册是否活跃并检查其状态。
1.4.2.3.2. 配置 TF 操作 复制链接链接已复制到粘贴板!
要将事件流连接到 Terraform 操作,您可以在 Terraform 中配置主 TF 文件( {tf)。
流程
添加一个 lifecycle 块,将 Event-Driven Ansible 事件流调用到您的
storageclasstf文件。after_create操作将触发action.aap_eda_eventstream_post.create。示例
以下示例显示了添加到 AWS EC2 服务器的置备
生命周期块。调配新的服务器后,操作将运行。terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 6.0" } aap = { source = "ansible/aap" version = "~> 1.4.0" } } } provider "aap" { # Configure authentication as needed. } provider "aws" { region = "us-west-1" # Configure authentication as needed. } variable "public_key_path" { type = string description = "Local path to a public key file to inject into the VM. Your AAP Job Template must have the matching private key configured as a machine credential." } variable "event_stream_username" { type = string } variable "event_stream_password" { type = string } resource "aws_key_pair" "key_pair" { key_name = "aap-terraform-actions-demo-key" public_key = file(var.public_key_path) } data "aws_ami" "rhel_ami" { most_recent = true filter { name = "name" values = ["RHEL-9*"] } filter { name = "virtualization-type" values = ["hvm"] } owners = ["309956199498"] # Red Hat } resource "aws_instance" "instance" { ami = data.aws_ami.rhel_ami.id instance_type = "t2.micro" associate_public_ip_address = true key_name = aws_key_pair.key_pair.key_name } # Look up an inventory data "aap_inventory" "inventory" { name = "EDA Actions Demo Inventory" organization_name = "Default" } # # EDA Event launch action example # resource "aap_host" "host" { inventory_id = data.aap_inventory.inventory.id name = resource.aws_instance.instance.public_ip # Configure an EDA eventstream POST after the host is created in inventory lifecycle { action_trigger { events = [after_create] actions = [action.aap_eda_eventstream_post.event_post] } } } data "aap_eda_eventstream" "eventstream" { name = "TF Actions Event Stream" } action "aap_eda_eventstream_post" "event_post" { config { limit = "all" template_type = "job" job_template_name = "Demo Job Template" organization_name = "Default" event_stream_config = { username = var.event_stream_username password = var.event_stream_password url = data.aap_eda_eventstream.eventstream.url } } }(必需)配置以下参数:
event-Driven Ansible 事件流的
event_stream_config: (Attributes) Details。您必须包括:-
用户名:( 字符串)在执行 POST 到事件流 URL 时使用的用户名 -
Password : (字符串)在执行 POST 到事件流 URL 时
使用的密码 -
URL : (字符串)用于接收事件 POST 的 URL
-
-
限制: (字符串)Ansible Automation Platform 对作业执行的限制 -
organization_name:( 字符串)机构名称 -
template_type: (字符串)模板类型:job或workflow_job
-
(可选)您可以将所有者设置为 Red Hat RHEL 镜像 ID,以便每次作业运行时都会使用最新的镜像。
- (可选)根据需要设置 附加参数。
配置与事件有效负载规格和目标规则手册映射的操作集成。
示例:
- name: Dispatch TF Workflow Job Template Action
condition: event.payload.template_type == "workflow"
throttle:
once_after: 1 minute
group_by_attributes:
- event.payload.workflow_template_name
- event.payload.limit
- event.payload.organization_name
actions:
- debug:
msg: "Executing Workflow Template {{ event.payload.workflow_template_name }}"
- run_workflow_template:
name: "{{ event.payload.workflow_template_name }}"
organization: "{{ event.payload.organization_name }}"
- debug:
msg: "Executed Workflow Job Template {{ event.payload.workflow_template_name }}"
1.4.2.3.3. 创建并应用计划 复制链接链接已复制到粘贴板!
在将 Terraform 计划配置为包含 Event-Driven Ansible 事件后,您可以创建并应用计划来触发事件。
流程
-
运行
terraform init以初始化您的工作目录。 使用
terraform 计划提交来创建计划。以下示例将计划保存到名为tfplan.out的文件,但您可以为计划指定任何名称。保存计划是自动化的最佳做法,因为保存的计划严格强制执行。terraform plan -out=tfplan.out- 检查计划输出。
应用已保存的计划。
terraform apply tfplan.out这会创建事件并将其发送到指定的事件流。当创建每个资源时,会调用 TF 操作,并按顺序执行对应的 Ansible Automation Platform playbook。
验证
- 验证在 Terraform 用户界面中是否更新了运行。深入到资源上,以查看调用该操作和执行后事件。
在 Ansible Automation Platform 用户界面中,验证事件是否被(EDAName})成功接收,并触发适当的规则手册激活:
- 检查 Event Streams 仪表板,以查看收到 TF Actions 事件。
- 检查 Jobs 仪表板,以查看按顺序运行的作业以及 Success 状态。
- 检查 Inventory 仪表板,以查看更新。例如,如果您创建了新的服务器,请检查 Terraform 置备清单的 Hosts 选项卡。
1.4.2.3.4. 规则手册示例 复制链接链接已复制到粘贴板!
以下规则手册示例演示了如何使用 TF 操作和 Event-Driven Ansible 侦听 webhook 上的事件。
- name: Listen for events on a webhook
hosts: all
## Define our source for events
sources:
- ansible.eda.webhook:
host: 0.0.0.0
port: 5000
filters:
- ansible.eda.insert_hosts_to_meta:
host_path: payload.limit
## Define the conditions we are looking for
rules:
- name: Dispatch TF Job Template Action
condition: event.payload.template_type == "job"
throttle:
once_after: 1 minute
group_by_attributes:
- event.payload.job_template_name
- event.payload.limit
- event.payload.organization_name
actions:
- debug:
msg: "Executing Job Template {{ event.payload.job_template_name }}"
- run_job_template:
name: "{{ event.payload.job_template_name }}"
organization: "{{ event.payload.organization_name }}"
- debug:
msg: "Executed Job Template {{ event.payload.job_template_name }}"
- name: Dispatch TF Workflow Job Template Action
condition: event.payload.template_type == "workflow"
throttle:
once_after: 1 minute
group_by_attributes:
- event.payload.workflow_template_name
- event.payload.limit
- event.payload.organization_name
actions:
- debug:
msg: "Executing Workflow Template {{ event.payload.workflow_template_name }}"
- run_workflow_template:
name: "{{ event.payload.workflow_template_name }}"
organization: "{{ event.payload.organization_name }}"
- debug:
msg: "Executed Workflow Job Template {{ event.payload.workflow_template_name }}"