又一个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第三方库


热门话题
java为什么运行按钮在Eclipse中不起作用?   java构造函数:实例变量是否为对象存储单独的值?   java使用jquery获取值   生产文件夹和源文件夹中的java单元测试   java递归问题这个解决方案正确吗?有更简单的解决方案吗?   java Android sqlite正在检索已选中中的行   javacom。谷歌。云数据存储。DatastoreException:请求缺少必需的身份验证凭据   java无法在Linux Ubuntu 12.04上运行maven2   在监视器的上下文中,被阻塞的线程在被notify()调用唤醒后在何处继续执行?   安卓如何从游标获取Bool(Java SQLite)   如何阻止rxjava runnable发出?   使用设备管理时应用程序中的java Android实例化异常