一 点睛
在实际应用场景中,我们希望一些任务、配置根据设备性能的不同而产生差异,比如使用本机CPU核数动态配置Nginx的worker_processes参数,可能有一组主机的应用配置文件几乎相同,但略有不同的配置项可以引用变量。在Ansible中使用变量的目的是方便处理系统之间的差异。
变量名的命名规则由字母、数字和下划线组合而成,变量必须以字母开头,如“foo_port”是一个合法的变量,“foo5”也是可以的,“foo-port”、“foo port”、“foo.port”和“12”都是非法的变量命名。
二 Jinja2过滤器
1 点睛
Jinja2是Python下一个广泛应用的模板引擎,它的设计思想类似于Django的模板引擎,并扩展了其语法和一系列强大的功能,官网地址: http://jinja.pocoo.org/。下面介绍一下Ansible使用Jinja2强大的过滤器 (Filters)功能。
2 格式
{{变量名|过滤方法}}
3 示例
实现获取一个文件路径变量过滤出文件名。
{{ 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
三 本地Facts
1 点睛
我们可以通过Facts来获取目标主机的系统信息,当这些信息还不能满足我们的功能需求时,可以通过编写自定义的Facts模块来实现。当然,还有一个更简单的实现方法,就是通过本地Facts来实现。只需在目标设备/etc/ansible/facts.d目录定义JSON、INI或可执行文件的JSON输出,文件扩展名要求使用“.fact”,这些文件都可以作为Ansible的本地Facts。
2 实战
第一步:在192.168.0.101机器上创建/etc/ansible/facts.d/preferences.fact,内容如下:
[general]
max_memory_size=32
max_user_processes=3730
open_files=65535
第二步:在主控端运行下面命令
[root@localhost nginx]# ansible 192.168.0.101 -m setup -a "filter=ansible_local"
192.168.0.101 | SUCCESS => {
"ansible_facts": {
"ansible_local": {
"preferences": {
"general": {
"max_memory_size": "32",
"max_user_processes": "3730",
"open_files": "65535"
}
}
}
},
"changed": false
}
3 说明
注意返回JSON的层次结构,preferences(facts文件名前缀)→general(INI的节名)→key:value(INI的键与值)。
最后就可以在我们的模板或playbook中通过以下方式进行调用。
{{ ansible_local.preferences.general. open_files }}
四 注册变量
1 点睛
变量的另一个用途是将一条命令的运行结果保存到变量中,供后面的playbook使用。
2 示例
- hosts: web_servers
tasks:
- shell: /usr/bin/foo
register: foo_result
ignore_errors: True
- shell: /usr/bin/bar
when: foo_result.rc == 5
3 说明
上述示例注册了一个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(返回码)。
下面示例说明返回码是“rc=0”
[root@localhost nginx]# ansible 192.168.0.101 -m command -a "echo 'return code test'"
192.168.0.101 | SUCCESS | rc=0 >>
return code test