使用 shell 命令将循环变量输出添加到 Ansible 剧本中的文件

问题描述 投票:0回答:2

尝试将 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
loops variables ansible
2个回答
1
投票

问题是您正在编写

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 }}"

0
投票

仅迭代stdout

    - lineinfile:
        path: /tmp/file.txt
        line: "{{ item }}"
        insertafter: EOF
        create: true
      loop: "{{ getent_result.results|map(attribute='stdout')|select }}"

备注:

© www.soinside.com 2019 - 2024. All rights reserved.