如何使用 Ansible 自动化读取 Linux 远程主机上的 /proc/cpuinfo 文件。文件将以 Base64 编码的形式读取,并通过 Ansible 的过滤器进行解码。

ansible.builtin.slurp 从远程节点读取文件内容。 该模块会获取远程文件中的数据,并将其以 Base64 编码的形式返回。

今天我们来谈谈 Ansible 的 slurp 模块。它的全名是 ansible.builtin.slurp,属于 Ansible 自带的“builtin”模块集合,并且与 Ansible 一起发布。 这个模块非常稳定,已经存在多年,并支持 Linux 和 Windows 目标。 它的主要功能是从远程位置读取文件。请注意,读取操作会获取一个包含远程文件数据的 Base64 编码的二进制块。

参数

  • src(字符串):远程文件路径 该模块只有一个参数 src,且为必填项。 src 参数指定远程主机上的源文件路径。它必须是一个文件,而不是目录。

示例:使用 Ansible Playbook 从远程主机读取文件

代码文件: slurp.yml

---
- name: slurp module demo
  hosts: all
  become: false
  vars:
    remotefile: "/proc/cpuinfo"
  tasks:
    - name: slurp remote file
      ansible.builtin.slurp:
        src: "{{ remotefile }}"
      register: slurpfile

    - name: print remote file
      ansible.builtin.debug:
        msg: "{{ slurpfile['content'] | b64decode }}"

执行命令:

ansible-pilot $ ansible-playbook -i virtualmachines/demo/inventory read\ file\ from\ remote\ hosts/slurp.yml

执行结果:

PLAY [slurp module demo] ******************************************

TASK [Gathering Facts] ******************************************
ok: [demo.example.com]

TASK [slurp remote file] *****************************************
ok: [demo.example.com]

TASK [print remote file] *****************************************
ok: [demo.example.com] => {
    "msg": "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 158\nmodel name\t: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz\nstepping\t: 10\ncpu MHz\t\t: 2591.998\ncache size\t: 12288 KB\nphysical id\t: 0\nsiblings\t: 1\ncore id\t\t: 0\ncpu cores\t: 1\napicid\t\t: 0\ninitial apicid\t: 0\nfpu\t\t: yes\nfpu_exception\t: yes\ncpuid level\t: 22\nwp\t\t: yes\nflags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq monitor ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase avx2 invpcid rdseed clflushopt md_clear flush_l1d\nbugs\t\t: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit srbds\nbogomips\t: 5183.99\nclflush size\t: 64\ncache_alignment\t: 64\naddress sizes\t: 39 bits physical, 48 bits virtual\npower management:\n\n"
}

PLAY RECAP ******************************************************
demo.example.com           : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

脚本的幂等性验证

多次运行 Playbook 时,结果保持一致,不会对远程主机产生额外更改:

ansible-pilot $ ansible-playbook -i virtualmachines/demo/inventory read\ file\ from\ remote\ hosts/slurp.yml

执行结果与第一次相同,表明该操作是幂等的。

手动验证

通过 SSH 登录到远程主机,手动查看 /proc/cpuinfo 文件内容,确认与 Ansible 输出一致:

ansible-pilot $ ssh devops@demo.example.com
Last login: Tue Jan 25 14:29:36 2022 from 192.168.0.102
[devops@demo ~]$ cat /proc/cpuinfo 
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model  : 158
model name : Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
stepping : 10
cpu MHz  : 2591.998
cache size : 12288 KB
physical id : 0
siblings : 1
core id  : 0
cpu cores : 1
apicid  : 0
initial apicid : 0
fpu  : yes
fpu_exception : yes
cpuid level : 22
wp  : yes
flags  : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq monitor ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase avx2 invpcid rdseed clflushopt md_clear flush_l1d
bugs  : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit srbds
bogomips : 5183.99
clflush size : 64
cache_alignment : 64
address sizes : 39 bits physical, 48 bits virtual
power management: