尝试将 shell 命令加载为变量,以便我可以将输出添加到文件并将其用于循环。
我需要做的是将循环值作为变量传递到 getent 字符串中,然后将其添加到文件中。的输出
getent passwd {{item}} |sed -E 's/:[^ ]*:(.)[^ ]* ([^:]*).*/\L,\1\2/'
应该
user1,uone user2,utwo
这是我所拥有的,但它会将错误的信息转储到文件中。
- hosts: all
remote_user: root
gather_facts: no
tasks:
- name: Add user variable
ansible.builtin.shell: getent passwd {{item}} |sed -E 's/:[^ ]*:(.)[^ ]* ([^:]*).*/\L,\1\2/'
register: getent_result
ignore_errors: true
loop:
- user1
- user2
- name: Add user to file.txt
ansible.builtin.lineinfile:
path: "/path/to/file/file.txt"
regexp: '^{{item}}'
line: '{{getent_result}}'
insertafter: 'EOF'
create: yes
loop:
- user1
- user2
文件中的内容是这样的。
{'msg': 'All items completed', 'changed': True, 'results': [{'stderr_lines': [], 'ansible_loop_var': 'item', 'end': '2023-05-18 13:30:53.434569', 'stderr': '', 'stdout': 'user1,uone', 'changed': True, 'rc': 0, 'start': '2023-05-18 13:30:53.420151', 'failed': False, 'cmd': "getent passwd user1 |sed -E 's/:[^ ]*:(.)[^ ]* ([^:]*).*/\\L,\\1\\2/'", 'item': 'user1', 'delta': '0:00:00.014418', 'invocation': {'module_args': {'creates': None, 'executable': None, '_uses_shell': True, 'strip_empty_ends': True, '_raw_params': "getent passwd user1 |sed -E 's/:[^ ]*:(.)[^ ]* ([^:]*).*/\\L,\\1\\2/'", 'removes': None, 'argv': None, 'warn': True, 'chdir': None, 'stdin_add_newline': True, 'stdin': None}}, 'stdout_lines': ['user1,uone'], 'ansible_facts': {'discovered_interpreter_python': '/usr/bin/python'}}, {'stderr_lines': [], 'ansible_loop_var': 'item', 'end': '2023-05-18 13:30:54.332020', 'stderr': '', 'stdout': 'user2,utwo', 'changed': True, 'rc': 0, 'failed': False, 'cmd': "getent passwd user2 |sed -E 's/:[^ ]*:(.)[^ ]* ([^:]*).*/\\L,\\1\\2/'", 'item': 'user2', 'delta': '0:00:00.011729', 'invocation': {'module_args': {'creates': None, 'executable': None, '_uses_shell': True, 'strip_empty_ends': True, '_raw_params': "getent passwd user2 |sed -E 's/:[^ ]*:(.)[^ ]* ([^:]*).*/\\L,\\1\\2/'", 'removes': None, 'argv': None, 'warn': True, 'chdir': None, 'stdin_add_newline': True, 'stdin': None}}, 'stdout_lines': ['user2,utwo'], 'start': '2023-05-18 13:30:54.320291'}]}
而不是这个
user1,uone
user2,utwo
问题是您正在编写
getent_result
的全部内容。相反,您想从循环的每次迭代的结果中提取stdout
。
- name: Add user to file.txt
ansible.builtin.lineinfile:
path: "/path/to/file/file.txt"
regexp: "^{{ item.stdout | split(',') | first }}"
line: "{{ item.stdout }}"
insertafter: "EOF"
create: yes
loop: "{{ getent_result.results }}"
仅迭代stdout
- lineinfile:
path: /tmp/file.txt
line: "{{ item }}"
insertafter: EOF
create: true
loop: "{{ getent_result.results|map(attribute='stdout')|select }}"
备注: