又一个Terraform Ansible动态清单脚本

yatadis的Python项目详细描述


一个ansible dynamic inventory 接受Terraform状态文件的脚本 作为输入。

与其他terraform ansible动态清单脚本相比,这个 一个目标是可以配置以匹配您的环境。它实现了 这使用Jinja2模板来指定 terraform资源属性应该映射到ansible inventory 名称、组和主机变量。

基本用法

ansible使用--list--host选项,但没有其他参数。为此,亚塔迪斯 接受环境变量中的所有选项:*tf_state:a 本地terraform.tfstate文件的路径(默认值:terraform.tfstate in 当前目录)*tf_ansible_inventory_name_模板:a Jinja2应用于的模板字符串 每个terraform资源生成可扩展的库存名称(默认值: {{ resource_name }}它是来自 地形是独一无二的)。*小组模板: 应用的Jinja2模板字符串 到每个terraform资源以生成以换行分隔的 资源应属于的ansible组(默认值:all 它只是将所有主机分配给all组)* tf_ansible_resource_filter_模板:a Jinja2应用于的模板字符串 每个terraform资源应该产生True(包括 资源)或False(排除资源)。(默认值: {{ type in ["aws_instance","azure_instance","clc_server","digitalocean_droplet","google_compute_instance","openstack_compute_instance_v2","softlayer_virtualserver","triton_machine","ucs_service_profile","vsphere_virtual_machine"] }} 它适合于限制来自各种类型的实例/计算机资源 关于地形提供者。*tf_ansible_host_vars_模板:a Jinja2应用于的模板字符串 每个terraform资源应该生成一个以换行符分隔的 主机变量设置的格式为<host_var>=<value>。(默认值:A 将ansible_host设置为 实例/机器以及设置所有资源属性的前缀 使用tf_-有关详细信息,请参见源代码)。

如果您对默认值满意,并且可以安排tfu状态 要设置为terraform.tfstate路径的环境变量 文件,然后您可以在ansible中安装yatadis.py脚本 清点目录,确保它是可执行的,并且 它所依赖的python模块安装在 运行ansible。

实际上,您很可能希望从包装器中调用yatadis.py 安装到资源清册中的脚本(如bash脚本) 目录代替yatadis.py本身并设置这些变量 恰如其分。例如,这里有一个简单的shell脚本 在设置terraform.tfstate文件的路径后调用yatadis.py:

#!/bin/bash

export TF_STATE=/path/to/terraform.tfstate
/path/to/yatadis.py $@

您还可以在命令行上指定这些选项中的任何一个(对于 测试目的)-命令行参数只是环境 不带“tf”前缀的变量名:

./yatadis.py --list --state /path/to/terraform.tfstate

向ansible组添加terraform资源

默认值可能是您所需要的全部,因为 每个terraform计算资源都将作为ansible提供 前缀为“tf”的主机变量,您可以使用ansible dynamic 组(使用group_by module添加 主机到基于这些主机变量值的组)。

例如,您可以在站点行动手册中添加以下内容:

- hosts: all
  tasks:
    - group_by: key=tf_image_{{ tf_image_name }}

如果您有一个terraform图像名称为^{tt12}的资源$ 那么它现在应该是Ansible集团的成员了 tf_image_ubuntu_16.04

或者,yatadis可以为您将主机分配给ansible组 不需要Ansible的动态组功能。

为此,您需要设置TF_ANSIBLE_GROUPS_TEMPLATEJinja2模板,以便它返回 主机应属于的组的换行分隔列表。

例如,将所有实例添加到以资源命名的组 提供程序,前缀为tf_provider_,可以使用以下命令 包装脚本:

#!/bin/bash
export TF_ANSIBLE_GROUPS_TEMPLATE='{{ ["all", "tf_provider_"+provider] | join("\n") }}'
export TF_STATE=/path/to/terraform.tfstate
/path/to/yatadis.py $@

模板上下文

提供给jinja2模板的上下文是类似于dict的资源 对象contai与地形状态资源相同的字段 领域。另外还有一个名为“name”的顶级条目 包含资源名称(即资源项的键值)。 最后,除了attributes部分之外 “flatmap”格式,因为它在terraform状态文件中),还有一个 expanded_attributes已展开的节 嵌套的dist和list结构。

高级主机变量模板化

作为一种特殊情况,因为ansible主机变量可以包含复杂的数据 结构,如果主机变量模板输出的值是dict 或者是一个列表,它们将被作为这样而不是字符串来计算,所以 生成的ansible主机变量项可以包含复杂的数据 结构。

例如,下面的(无趣的)示例将指定 foo_dict和abc123_列出每个资源的主机变量:

#!/bin/bash
export TF_ANSIBLE_HOST_VARS_TEMPLATE=$(cat <<EOF
foo_dict={'foo': 1, 'bar': 2, 'baz': 3}
abc123_list=['a', 'b', 'c', 1, 2, 3]
EOF
)
export TF_STATE=/path/to/terraform.tfstate
/path/to/yatadis.py $@

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
安卓工作室组织。json。JSONException:类型为java。无法将lang.String转换为JSONObject   java将数据从Jenkins参数化构建传递到testng。运行时的xml   java关注使用所有者框架异步打开JDialog   Android java:broadcastReceiver上的蓝牙连接事件未触发   在java中同时处理写入和读取的文件io   javascript如何替换目标数组字符串并将其更改为用户输入字符串   如何终止或停止java小程序中的其他线程   如何通过SeleniumJava连接到putty以执行一组命令并在putty窗口中验证输出   java为什么空列表上的循环会挂起?   java当我单击run时,什么也没有发生   swing Java多监视器问题   proguard java模块版本不匹配   java在facebook sdk 4.0上获取可标记好友+   java Android Fragmens和滑动示例   java导入。VS代码中的jar库   存储在SQL表中的java下载/显示文件   java项目Euler(第14页):递归问题   java如何在springboot中跳过失败的bean以避免报告失败:771>>应用程序启动失败