如何使用 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: