返回介绍

9.9 变量

发布于 2024-01-29 22:54:23 字数 2543 浏览 0 评论 0 收藏 0

在实际应用场景中,我们希望一些任务、配置根据设备性能的不同而产生差异,比如使用本机CPU核数动态配置Nginx的worker_processes参数,可能有一组主机的应用配置文件几乎相同,但略有不同的配置项可以引用变量。在Ansible中使用变量的目的是方便处理系统之间的差异。

变量名的命名规则由字母、数字和下划线组合而成,变量必须以字母开头,如“foo_port”是一个合法的变量,“foo5”也是可以的,“foo-port”、“foo port”、“foo.port”和“12”都是非法的变量命名。在Inventory中定义变量见9.3.2节和9.3.3节,在playbook定义变量见9.6节,建议回顾一下,加深记忆。

9.9.1 Jinja2过滤器

Jinja2是Python下一个广泛应用的模板引擎,它的设计思想类似于Django的模板引擎,并扩展了其语法和一系列强大的功能,官网地址:http://jinja.pocoo.org/。下面介绍一下Ansible使用Jinja2强大的过滤器(Filters)功能。

使用格式:{{变量名|过滤方法}}。

下面是实现获取一个文件路径变量过滤出文件名的一个示例:

{{ path | basename }}

获取文件所处的目录名:

{{ path | dirname }}

下面为一个完整的示例,实现从“/etc/profile”中过滤出文件名“profile”,并输出重定向到/tmp/testshell文件中。

---
- hosts: 192.168.1.21
 vars:
  filename: /etc/profile
 tasks:
  - name: "shell1"
    shell: echo {{ filename | basename }} >> /tmp/testshell

更多的过滤方法见http://jinja.pocoo.org/docs/templates/#builtin-filters。

9.9.2 本地Facts

我们可以通过Facts来获取目标主机的系统信息,当这些信息还不能满足我们的功能需求时,可以通过编写自定义的Facts模块来实现。当然,还有一个更简单的实现方法,就是通过本地Facts来实现。只需在目标设备/etc/ansible/facts.d目录定义JSON、INI或可执行文件的JSON输出,文件扩展名要求使用“.fact”,这些文件都可以作为Ansible的本地Facts,例如,在目标设备192.168.1.21定义三个变量,供以后playbook进行引用。

【/etc/ansible/facts.d/preferences.fact】

[general]
max_memory_size=32
max_user_processes=3730
open_files=65535

在主控端运行ansible 192.168.1.21-m setup-a"filter=ansible_local"可看到定义的结果,返回结果如下:

192.168.1.21 | success >> {
  "ansible_facts": {
     "ansible_local": {
        "preferences": {
          "general": {
             "max_memory_size": "32",
             "max_user_processes": "3730",
             "open_files": "65535"
          }
        }
     }
  },
  "changed": false
}

注意返回JSON的层次结构,preferences(facts文件名前缀)→general(INI的节名)→key:value(INI的键与值),最后就可以在我们的模板或playbook中通过以下方式进行调用:

{{ ansible_local.preferences.general. open_files }}

9.9.3 注册变量

变量的另一个用途是将一条命令的运行结果保存到变量中,供后面的playbook使用。下面是一个简单的示例:

- hosts: web_servers
 tasks:
   - shell: /usr/bin/foo
    register: foo_result
    ignore_errors: True
   - shell: /usr/bin/bar
    when: foo_result.rc == 5

上述示例注册了一个foo_result变量,变量值为shell:/usr/bin/foo的运行结果,ignore_errors:True为忽略错误。变量注册完成后,就可以在后面playbook中使用了,当条件语句when:foo_result.rc==5成立时,shell:/usr/bin/bar命令才会运行,其中foo_result.rc为返回/usr/bin/foo的resultcode(返回码)。图9-8返回“rc=0”的返回码。

图9-8 命令执行结果

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文