之前的文章介绍了ansible-playbook的静态变量,其实ansible还支持从外部数据拉取信息,即动态获取变量。
1.lookups file
原理:使用python的codecs.open打开文件然后把结果返回给变量。
新建lookup.yaml文件,内容如下:
---
- hosts: all
gather_facts: False
vars:
contents: "{{ lookup('file', '/etc/sysconfig/network-scripts/ifcfg-lo') }}"
tasks:
- name: debug lookups
debug: msg="The content is {% for i in contents.split("\n") %} {{ i }} {% endfor %}"
运行结果如下:

2.lookups password
这种方式可以对传入的数据进行加密,修改lookup.yaml文件,内容如下:
---
- hosts: all
gather_facts: False
vars:
contents: "{{ lookup('password', 'Ansible') }}"
tasks:
- name: debug lookups
debug: msg="First contents is {{ contents }} "
运行结果如下:

3.lookups pipe
原理:使用python的subprocess.Popen模块,在被管理节点上执行命令,然后把结果传递给变量。
修改lookup.yaml文件,内容如下:
---
- hosts: all
gather_facts: False
vars:
contents: "{{ lookup('pipe', 'date +%Y-%m-%d') }}"
tasks:
- name: debug lookups
debug: msg="The content is {% for i in contents.split("\n") %} {{ i }} {% endfor %}"
运行结果如下:

4.lookups redis_kv
该方式是从Redis数据库中get数据,因为需要控制节点连接Redis,所以需要安装Redis Python库。在本地安装了一个Redis服务器,然后给Ansible设置了一个值。修改lookup.yaml文件,内容如下:
---
- hosts: all
gather_facts: False
vars:
contents: "{{ lookup('redis_kv', 'redis://localhost:6379, ansible') }}"
tasks:
- name: debug lookups
debug: msg="The content is {% for i in contents.split("\n") %} {{ i }} {% endfor %}"
由于实验环境的限制,这里就不放运行后的截图了。
5.lookups template
template跟file方式有点类似,都是读取文件,但是template在读取文件之前需要把jinja模板渲染完后再读取,下面我们新建一个jinja模板文件lookups.j2,内容如下:
worker_processes {{ ansible_processor_cores }}
IPaddress {{ ansible_default_ipv4.address }}
修改lookup.yaml文件,内容如下:
---
- hosts: all
gather_facts: True
vars:
contents: "{{ lookup('template', 'template.j2') }}"
tasks:
- name: debug lookups
debug: msg="The content is {% for i in contents.split("\n") %} {{ i }} {% endfor %}"
gather_facts 参数需要设置为 True,不然无法获取到主机的信息。运行结果如下:
