Ansible playbook lookup

Ansible 有很多方式可以定义变量,如下几种:
1、通过 Inventory 文件定义 
2、通过 /etc/ansible 下的文件定义主机以及组变量 
3、通过 ansible-playbook 命令行传入 
4、通过在 playbook 文件内使用 vars 
5、通过在 playbook 文件内使用 vars_files 
6、使用 register 传递变量 
7、通过 vars_prompt 交互式传入

但是这些变量都是静态的,Ansible 还支持从外部数据拉取信息,比如我们可以从数据库里读取信息然后定义给一个变量的形式,这就是 Ansible 的 lookups 插件。

lookup file

file 是比较常用的一种 lookups 方式,它的原理就是使用 python 的 codecs.open 打开文件然后把结果返回给变量。
下面 playbook 通过读取客户端 /etc/sysconfig/network 文件的内容,接着再打印出来:
格式:"{{ lookup('file','path') }}"
---
- hosts: 10.1.0.51
  gather_facts: False
  vars:
      value: "{{ lookup('file','/etc/sysconfig/network') }}" 【引用变量的形式{{ 调用lookup file }}】
  tasks:
      - name: display variable value
        debug: msg="value is {% for i in value.split("\n")%} {{ i }} {% endfor %}" 【调用dbug模块,打印信息】

lookup password

password 也是常用的一种 lookups 方式,它会对传入的内容进行加密处理。下面 playbook 通过在 playbook 中定义的字符串进行
加密,然后再进行输出,并且在当前目录下保存一份密码文件:
格式:"{{ lookup('password','密码文件') }}"
---
- hosts: 10.1.0.51
  gather_facts: False
  vars:
      password: "{{ lookup('password','pAssW0rd') }}"  
  tasks:
      - name: display password
        debug: msg="password is {{ password }}"
【在当前脚本目录对密码pAssW0rd加密,并生成一个文件名称为:pAssW0rd,该文件保存加密后的密文】

lookup pipe

pipe lookups 其实就是在控制机器上调用 subprocess.Popen 执行命令,然后将获取到的结果传递给变量,最后进行打印:
#!/usr/bin/ansible-playbook
---
- name: lookup_pipe
  hosts: local
  remote_user: root
  gather_facts: False
  vars:
    value: "{{ lookup('pipe','date +%F') }}"  【将`date +$F`命令的输出结果打印】
  
  tasks:
    - name: lookup_pipe test
      debug: msg="value is {{ value }}"

lookup template

template 与 file 方式有点类似,都是读取文件,但是 template 在读取文件之前需要把 jinja 模板渲染完之后再进行读取,当然,
gather_facts 参数需要设置为 True,不然无法获取到主机的信息。

template 调用当前目录下的 template.j2 文件并且进行渲染取值,再进行输出,下面通过指定一个 jinja 模板文件:
template.j2 模板文件:
worker_processes {{ ansible_processor_cores }};
IPaddress {{ ansible_eth0.ipv4.address }};

---
- hosts: local
  remote_user: root
  gather_facts: True
  vars:
      value: "{{ lookup('template','./template.j2') }}"
  tasks:
      - name: display template.j2
        debug: msg="value is  {% for i in value.split("\n") %} {{ i }} {% endfor %}"

你可能感兴趣的:(Ansible playbook lookup)