问题描述
想知道是否可以像在动态清单中一样,使用数据库的结果来填充host_vars
和group_vars
,以便在Ansible中动态生成这些变量。实际上,用户已经在playbook中使用了查询和注册查询结果的方法来实现这一点。用户还在评论中提到了他们的用例和环境变量存储在Redis中的情况。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
使用动态清单
最优雅的方法是使用动态清单,而不是静态清单和动态群组变量。这将允许您根据数据库结果动态生成主机清单。
使用自定义事实(Custom Facts)
另一种选择是使用自定义事实。这些是位于客户端机器上的/etc/ansible/facts.d
目录中的脚本。与动态清单类似,这些脚本可以是可执行脚本(因此可以查询Redis或其他内容),但是它们仅为特定主机定义变量。虽然这不是完全符合您的要求,因为您需要为每个单独的主机查询数据库,而不是整个组,但它可以产生类似的效果。
以下是使用自定义事实的步骤:
- 在目标主机上创建一个脚本,该脚本将从数据库查询所需的变量,并将其以JSON格式输出到标准输出。
- 将脚本复制到
/etc/ansible/facts.d
目录中,并确保它具有适当的执行权限。 - 在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版本。根据具体情况,您可能需要对示例代码进行调整和定制。
正文完