---
- 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。