Python自动化运维之Ansible的变量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/88090408

一 点睛

在实际应用场景中,我们希望一些任务、配置根据设备性能的不同而产生差异,比如使用本机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

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/88090408