使用 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 模块:
这将帮助您避免使用 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 模块:
这将帮助您避免使用 awk。