如何在Ansible中将命令输出存储到数组中?

时间:2017-02-16 19:16:28

标签: arrays linux ansible ansible-facts

基本上,我希望能够处理"通配符文件名"在Linux中使用ansible。本质上,这意味着使用ls命令,其中包含文件名的一部分,后跟" *"这样它只会列出某些文件。

但是,我无法将输出正确存储在变量中,因为可能会返回多个文件名。因此,我希望能够存储这些结果,无论一个任务期间阵列中可能有多少结果。然后,我希望能够在以后的任务中从数组中检索所有结果。此外,由于我不知道可能会返回多少文件,因此我无法为每个文件名执行任务,并且数组更有意义。

这背后的原因是随机存储位置中的文件经常更改,但它们始终具有相同的上半部分。它们的下半部分名称是随机的,我根本不想将其硬编码到ansible中。

我完全不确定如何在ansible中正确实现/操作数组,所以下面的代码就是我尝试"尝试"去完成。如果返回多个文件名,显然它不会按预期运行,这就是我在这个主题上寻求帮助的原因:

- hosts: <randomservername>
  remote_user: remoteguy
  become: yes
  become_method: sudo
  vars:
    aaaa: b
  tasks:

 - name: Copy over all random file contents from directory on control node to target clients.  This is to show how to manipulate wildcard filenames.
    copy:
      src: /opt/home/remoteguy/copyable-files/testdir/
      dest: /tmp/
      owner: remoteguy
      mode: u=rwx,g=r,o=r
    ignore_errors: yes

  - name: Determine the current filenames and store in variable for later use, obviously for this exercise we know part of the filenames.
    shell: "ls {{item}}"
    changed_when: false
    register: annoying
    with_items: [/tmp/this-name-is-annoying*, /tmp/this-name-is-also*]

  - name: Run command to cat each file and then capture that output.
    shell: cat {{ annoying }}
    register: annoying_words

  - debug: msg=Here is the output of the two files.  {{annoying_words.stdout_lines }}

  - name: Now, remove the wildcard files from each server to clean up.
    file:
      path: '{{ item }}'
      state: absent
    with_items:
    - "{{ annoying.stdout }}"

我知道YAML格式有点过时了,但是如果它已经修复了,那么这个&#34;会#34;正常运行,它只是不能给我输出我正在寻找的输出。因此,如果有50个文件,我希望ansible能够操纵它们,和/或能够将它们全部删除等等等。

如果有人在这里可以让我知道如何在上面的测试代码片段中正确使用数组,这将是太棒了!

3 个答案:

答案 0 :(得分:6)

Ansible将activityNode = new XmlSlurper(false,false).parseText(innerNodeTemplate).declareNamespace(android:'android') shell个操作模块的输出存储在commandstdout个变量中。后者以列表的形式包含标准输出的单独行。

要迭代元素,请使用:

stdout_lines

您应该记住,在某些情况下解析with_items: - "{{ annoying.stdout_lines }}" 输出可能会导致问题。

答案 1 :(得分:0)

您可以尝试以下方法吗?

- name: Run command to cat each file and then capture that output.
   shell: cat {{ item.stdout_lines }}
   register: annoying_words
   with_items:
    - "{{ annoying.results }}"

答案 2 :(得分:0)

annoying.stdout_lines已经是一个列表。

摘自stdout_lines的文档

  

返回stdout时,Ansible总是提供一个字符串列表,每个字符串在原始输出中每行包含一个项目。

要将列表分配给另一个变量,请执行以下操作:

    ..
      register: annoying
    - set_fact:
        varName: "{{annoying.stdout_lines}}"
    # print first element on the list
    - debug: msg="{{varName | first}}"