使用 Ansible 从静态配置文件动态设置配置文件中的变量

Using Ansible to dynamically set a variable in a configuration file from a static config file

提问人:NotAProfessional 提问时间:8/24/2023 更新时间:8/24/2023 访问量:48

问:

我正在尝试使用 Ansible 自动执行配置文件中的变量。 我有一个模板配置文件,其中包含以下行“config_version={{osVersion}}” 此 playbook 针对 RHEL 7 和 8 机器运行,理想情况下,我希望 ansible 获取它运行 playbook 的主机的版本和主要版本,然后使用每个机器版本填充该 {{osVersion}}

我试图找到这个特定的用例,但似乎什么都没有出现。关于如何做到这一点。

总而言之,模板包含这个“config_version={{osVersion}}” 我想让该模板放在机器上,检查机器的版本,然后将版本写入一个或多个主机的配置文件。

ansible ansible 模板

评论


答:

1赞 Vladimir Botka 8/24/2023 #1

您必须连接到远程主机才能了解操作系统。要连接远程主机,必须先读取清单。当您查看变量优先级时,您会看到ansible_distribution_version(和其他主机事实)可能从优先级 12 中可用。向上播放 VAR。默认情况下,事实收集处于启用状态(隐式)。查看DEFAULT_GATHERING

  • 例如,该剧
shell> cat pb.yml
- hosts: test_24
  vars:
    test: "{{ ansible_distribution_version }}"
  tasks:
    - debug:
        var: test

给出(删节)

shell> ANSIBLE_GATHERING=implicit ansible-playbook pb.yml

  test: '8.4'

然后,您可以写入文件

    - copy:
        dest: /tmp/test.conf
        content: |
          config_version={{ ansible_distribution_version }}

shell> ssh admin@test_24 cat /tmp/test.conf
config_version=8.4
  • 如果不收集事实,则不会定义变量ansible_distribution_version
shell> ANSIBLE_GATHERING=explicit ansible-playbook pb.yml

  test: VARIABLE IS NOT DEFINED!

您可以使用模块设置随时在游戏中收集或更新事实。

看: