- 本书赞誉
- 前言
- 第一部分 基础篇
- 第1章 系统基础信息模块详解
- 第2章 业务服务监控详解
- 第3章 定制业务质量报表详解
- 第4章 Python 与系统安全
- 第二部分 高级篇
- 第5章 系统批量运维管理器 pexpect 详解
- 第6章 系统批量运维管理器 paramiko 详解
- 第7章 系统批量运维管理器Fabric详解
- 第8章 从零开发一个轻量级 WebServer
- 第9章 集中化管理平台 Ansible 详解
- 第10章 集中化管理平台 Saltstack 详解
- 第11章 统一网络控制器 Func 详解
- 第12章 Python 大数据应用详解
- 第三部分 案例篇
- 第13章 从零开始打造 B/S 自动化运维平台
- 第14章 打造 Linux 系统安全审计功能
- 第15章 构建分布式质量监控平台
- 第16章 构建桌面版 C/S 自动化运维平台
9.9 变量
在实际应用场景中,我们希望一些任务、配置根据设备性能的不同而产生差异,比如使用本机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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论