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),限制令牌访问,并完全控制令牌生命周期。

流程

  1. 创建 Terraform 配置(.tf)文件。包括一个 provider block。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
      ]
    }
  2. 添加配置参数,如上例中所示。您必须配置主机和凭证。在 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 环境变量来配置。
  3. (可选)您可以在这些配置参数的值中使用 表达式,但只能引用应用配置前已知的值。
  4. (可选)您还可以使用由 Terraform 定义并可用于所有供应商块 的别名 meta-argument别名 可让您为不同的资源使用不同的配置相同的供应商。

1.4.2. 使用 TF 操作和 Ansible Automation Platform

在 Ansible Automation Platform 中使用 Terraform (TF)操作在基础架构置备后触发自动配置。

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 帐户。您可以调整模式,以使用不同的云供应商。

  • 您已配置了作业模板:

    • 清单设置为 启动时提示
    • 与本地文件中可用的公钥匹配的机器凭据(私钥)。

流程

  1. 在 5.2. tf 文件中定义 aap_job_launch 操作。
  2. 添加生命周期作业块,以定义在正确的生命周期事件触发器期间调用哪些操作。

    示例

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
  }
}
  1. (必需)将本示例中的作业模板名称和清单名称改为您的对应变量。
  2. (可选)您可以将所有者设置为 Red Hat RHEL 镜像 ID,以便每次作业运行时都会使用最新的镜像。
  3. (可选)根据需要设置 附加参数。例如,您可以将 wait_for_completion 设置为 true,然后 Terraform 将等待到创建此作业并达到任何最终状态,然后再继续。您还可以设置 wait_for_completion_timeout_seconds 来控制超时限制。
  4. 更新并提交 Terraform 代码。
  5. 执行 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
  • 与本地文件中可用的公钥匹配的机器凭据(私钥)。

流程

  1. 登录到 Ansible Automation Platform 用户界面。
  2. 导航到 Automation Decisions Event Streams
  3. Create event stream
  4. Create event stream 页面中,编辑字段:

    • 名称 : 您的事件流的描述性、唯一名称(如 Terraform provider_Events)。
    • Organization : 选择此事件流将属于的机构(通常为 Default 或 your specific organization)。
    • event stream type : 选择与您要接收事件匹配的类型。此集成支持 基本事件流 (用户名/密码)。
    • 凭证 : 选择一个您预先创建用于使用此事件流进行身份验证的凭证。
    • headers :(可选)输入您要包含在转发到规则规则的事件有效负载中的以逗号分隔的 HTTP 标头键。保留此为空以包括所有标头。
    • 将事件转发到规则手册激活 : 此选项通常默认启用。禁用它可用于测试和诊断您的连接和传入的数据,而不会意外地触发任何自动化。
  5. Create event stream。然后导航到 Automation Decisions Event Streams,以验证事件流是否已创建并查看目前收到的事件数量。

    您还可以点击特定流来查看其详细配置,包括机构、事件流类型、关联的凭证和事件转发设置。

  6. 设置 规则手册激活。确保:

    1. 将事件流添加到规则手册中。
    2. (推荐)选择 启用 Rulebook 激活? 选项,以在创建后自动启动激活。
    3. 激活规则手册。
  7. 选择 Automation Decisions Rulebook Activations,以验证规则手册是否活跃并检查其状态。
1.4.2.3.2. 配置 TF 操作

要将事件流连接到 Terraform 操作,您可以在 Terraform 中配置主 TF 文件( {tf)。

流程

  1. 添加一个 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
        }
      }
    }
  2. (必需)配置以下参数:

    • event-Driven Ansible 事件流的event_stream_config: (Attributes) Details。您必须包括:

      • 用户名 :( 字符串)在执行 POST 到事件流 URL 时使用的用户名
      • Password : (字符串)在执行 POST 到事件流 URL 时使用的密码
      • URL : (字符串)用于接收事件 POST 的 URL
    • 限制 (字符串)Ansible Automation Platform 对作业执行的限制
    • organization_name :( 字符串)机构名称
    • template_type: (字符串)模板类型: jobworkflow_job
  3. (可选)您可以将所有者设置为 Red Hat RHEL 镜像 ID,以便每次作业运行时都会使用最新的镜像。
  4. (可选)根据需要设置 附加参数
  5. 配置与事件有效负载规格和目标规则手册映射的操作集成。

    示例:

- 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 事件后,您可以创建并应用计划来触发事件。

流程

  1. 运行 terraform init 以初始化您的工作目录。
  2. 使用 terraform 计划 提交来创建计划。以下示例将计划保存到名为 tfplan.out 的文件,但您可以为计划指定任何名称。保存计划是自动化的最佳做法,因为保存的计划严格强制执行。

    terraform plan -out=tfplan.out
  3. 检查计划输出。
  4. 应用已保存的计划。

    terraform apply tfplan.out

    这会创建事件并将其发送到指定的事件流。当创建每个资源时,会调用 TF 操作,并按顺序执行对应的 Ansible Automation Platform playbook。

验证

  1. 验证在 Terraform 用户界面中是否更新了运行。深入到资源上,以查看调用该操作和执行后事件。
  2. 在 Ansible Automation Platform 用户界面中,验证事件是否被(EDAName})成功接收,并触发适当的规则手册激活:

    1. 检查 Event Streams 仪表板,以查看收到 TF Actions 事件。
    2. 检查 Jobs 仪表板,以查看按顺序运行的作业以及 Success 状态。
    3. 检查 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 }}"
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部