使用 awk Ansible 提取 shell 输出

Ansible extract shell output using awk

---
- name: Data Collection
  hosts: all
  tasks:
    - name: List all users
      shell: "cat /etc/passwd | awk -F: '{print }'"
      register: users
    - lineinfile:
        dest: /tmp/users.csv
        create: yes
        line: "The {{ inventory_hostname}}, {{ users.stdout }}"
      delegate_to: localhost

没有给出预期的输出,因为我在 shell 模块中使用 awk / grep 时遇到语法错误。请参考预期的输出。

172.17.254.201, root
172.17.254.201, bin
172.17.254.201, nobody
172.17.254.201, test1
172.17.254.201, test2
172.17.254.202, root
172.17.254.202, bin
172.17.254.202, nobody
172.17.254.202, test1
172.17.254.202, test2
..

您确定错误与 shell 任务有关吗?我能够 运行 它没有错误。

所提供示例的一个问题是 lineinfile 仅使用一次(即仅更新一行)。我们可以利用 Ansible loop.

来解决这个问题
---
- name: Data Collection
  hosts: all
  tasks:
    - name: List all users
      shell: "cat /etc/passwd | awk -F: '{print }'"
      register: users
    - lineinfile:
        dest: /tmp/users.csv
        create: yes
        line: "{{ inventory_hostname}}, {{ item }}"
      loop: "{{ users.stdout_lines }}"
      delegate_to: localhost

如果您在清单文件中使用 DNS 记录但想要 .csv 文件中的 IP 地址,那么您需要将 inventory_hostname 替换为 host_vars 查找(可能) hostvars[inventory_hostname]['ansible_default_ipv4']['address'].

如果没有,上面的例子应该足够了。

我建议您为此使用 Ansible getent 模块:

https://www.google.com/url?sa=t&source=web&rct=j&url=https://docs.ansible.com/ansible/latest/collections/ansible/builtin/getent_module.html&ved=2ahUKEwipvfiwo_btAhVjShUIHVkXBpQQFjAAegQIAxAC&usg=AOvVaw3TsoMUpdCHNOdEqU6VDLGk

这将帮助您避免使用 awk。