在Ansible中动态创建host_vars和group_vars文件

70次阅读
没有评论

问题描述

想知道是否可以像在动态清单中一样,使用数据库的结果来填充host_varsgroup_vars,以便在Ansible中动态生成这些变量。实际上,用户已经在playbook中使用了查询和注册查询结果的方法来实现这一点。用户还在评论中提到了他们的用例和环境变量存储在Redis中的情况。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

使用动态清单

最优雅的方法是使用动态清单,而不是静态清单和动态群组变量。这将允许您根据数据库结果动态生成主机清单。

使用自定义事实(Custom Facts)

另一种选择是使用自定义事实。这些是位于客户端机器上的/etc/ansible/facts.d目录中的脚本。与动态清单类似,这些脚本可以是可执行脚本(因此可以查询Redis或其他内容),但是它们仅为特定主机定义变量。虽然这不是完全符合您的要求,因为您需要为每个单独的主机查询数据库,而不是整个组,但它可以产生类似的效果。

以下是使用自定义事实的步骤:

  1. 在目标主机上创建一个脚本,该脚本将从数据库查询所需的变量,并将其以JSON格式输出到标准输出。
  2. 将脚本复制到/etc/ansible/facts.d目录中,并确保它具有适当的执行权限。
  3. 在Ansible playbook中,您可以直接使用这些自定义事实作为变量,就像使用其他事实一样。

以下是一个简单的示例,假设您的自定义事实脚本名为custom_vars.sh,位于/etc/ansible/facts.d目录中:

#!/bin/bash
# custom_vars.sh

# Query the database or perform any necessary action to get your variables
# For example, querying Redis and formatting the output as JSON
variables=$(redis-cli GET your_key)
echo '{"custom_variable": "'"$variables"'"}'

然后,您可以在Ansible playbook中使用这些自定义事实:

---
- name: Playbook example
  hosts: your_target_hosts
  tasks:
    - name: Debug custom variable
      debug:
        var: ansible_local.custom_variable

使用动态清单和自定义脚本

根据您的评论,您可以考虑将变量放入清单脚本中,然后使用自定义脚本来创建group_vars文件。这将允许您在静态清单中放置变量,并在需要时生成group_vars文件。这种方法在您有特定需求时可能更加适用。

请注意,这些解决方案的可行性取决于您的环境和需求,以及Ansible版本。根据具体情况,您可能需要对示例代码进行调整和定制。

正文完