Ansible使用awk提取外壳输出


---
- name: Data Collection
hosts: all
tasks:
- name: List all users
shell: "cat /etc/passwd | awk -F: '{print $1}'"
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仅使用一次(即,仅更新单行(。我们可以利用Ansibleloop来解决这个问题。

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

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

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

我建议您为此使用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=2ahUKEwipviwo_btAhVjShUIHVkXBpQQFjAAegQIAxAC&usg=AOvVaw3TsoMUpdCHNOdEqU6VDLGk

这将帮助您避免使用awk。

相关内容

  • 没有找到相关文章

最新更新