Ansible中变量和事实的区别及使用方法

105次阅读
没有评论

问题描述

在使用 Ansible 一段时间后,有一个关于变量和事实(facts)之间区别的疑问。他想知道在使用 set_fact 和在 vars 中设置变量是否有差异,以及是否会在某些情况下产生不同的效果。

解决方案

请注意以下操作可能涉及版本差异,操作前请备份数据。

变量和事实的区别

在 Ansible 中,事实(facts) 是有关执行 Ansible 操作的目标系统收集的数据。它们是变量的一种形式,但由 Ansible 设置(类似于系统定义变量)。事实是在执行 Playbook 时的“收集事实”(Gathering Facts)阶段收集的,这由gather_facts设置控制。Ansible 将其称为从系统中发现的变量。当然,你也可以设置自定义事实。

一些示例包括:
ansible_hostname – 目标系统的完全限定域名(FQDN)
ansible_os_family – 目标系统的操作系统家族(RedHat、Debian等)

另一方面,变量 是根据我们的需求设置的(类似于用户定义变量)。

一些示例包括:
my_fav_fruits: [ 'orange', 'apple', 'banana' ] – 你的喜爱水果,可能会有所不同。
config_dir: '/etc/my_app/conf.d' – 我的应用程序配置文件所在目录。

使用 set_factvars 的差异

根据你的编辑内容,确实存在使用 set_fact 和在 vars 中设置变量的区别。下面的解释将更加详细地说明差异。

假设你有以下变量:

vars:
  nginx_ssl: '/etc/nginx/ssl'
  nginx_conf_file: '/etc/nginx/nginx.conf'

如果在不同的情况下,你需要根据系统不同而改变变量的值,set_factvars 的区别就会体现出来。例如,以下 Play 将展示它们的不同效果:

- hosts: localhost
  vars:
    nginx_ssl: '/etc/nginx/ssl'
    nginx_conf_file: '/etc/nginx/nginx.conf'
  tasks:
    - name: 设置在 Debian 上的 nginx 路径为 /opt
      set_fact:
        nginx_ssl: '/opt/nginx/ssl'
        nginx_conf_file: '/opt/nginx/nginx.conf'
      when: ansible_distribution == 'Debian'
    - debug:
        msg: 'ssl: {{ nginx_ssl }} and conf: {{ nginx_conf_file }}'

在上面的示例中,set_fact 设置的变量将优先生效(在 Debian 上),输出将是:

"msg": "ssl: /opt/nginx/ssl and conf: /opt/nginx/nginx.conf"

在其他发行版上,将会使用 vars 中声明的值。

关于变量的优先级

值得注意的是,通过 set_fact 设置的变量优先级更高,因此它们会覆盖同名的 vars 中的变量。这在需要根据特定条件改变变量值时非常有用。

请根据你的需求,合理选择在 Play 中使用 set_fact 还是 vars 来定义变量。

结论

通过上述解释,我们可以了解到在 Ansible 中变量和事实的区别,以及如何在 Play 中使用 set_factvars 来定义变量,从而更好地适应不同的场景需求。

注意:上述解决方案中的代码示例可能受到版本差异影响,建议在实际应用中根据具体情况进行调整和测试。

正文完