如何使用ansible循环文件中的每一行?

时间:2015-11-05 10:14:21

标签: ansible ansible-playbook

我正在寻找与with_items:类似的内容,但这样可以从文件中获取项目列表,而不必将其包含在剧本文件中。

我怎样才能在ansible中做到这一点?

4 个答案:

答案 0 :(得分:21)

我设法找到了一个简单的替代方案:

- debug: msg="{{item}}"
  with_lines: cat files/branches.txt

答案 1 :(得分:11)

假设您有一个像

这样的文件
item 1
item 2
item 3

并且您想要安装这些项目。只需使用register将文件内容提供给变量。并将此变量用于with_items。确保您的文件每行有一个项目。

---
- hosts: your-host
  remote_user: your-remote_user
  tasks:
  - name: get the file contents
    command: cat /path/to/your/file
    register: my_items
  - name: install these items
    pip: name:{{item}}
    with_items: my_items.stdout_lines

答案 2 :(得分:7)

我很惊讶没有人提到ansible Lookups,我认为这正是你想要的。

它会从文件,管道 csv 中读取您想要在剧本中使用但不想包含在剧本中的内容 , redis 等来自您的本地控制计算机(不是来自远程计算机,这很重要,因为在大多数情况下,这些内容与您本地计算机上的Playbook一起),以及它适用于ansible循环。

---
- hosts: localhost
  gather_facts: no
  tasks:
    - name: Loop over lines in a file
      debug:
        var: item
      with_lines: cat "./files/lines"

with_lines这里实际上是循环查找行,看看lines查找是如何工作的,看到代码here,它只运行你给它的任何命令(所以你可以给它就像echo,cat等),然后输出分割成行并返回它们。

有许多强大的查找功能,要获得全面的列表,请查看lookup plugins folder

答案 3 :(得分:1)

最新Ansible recommends loop而非with_something。正如Ikar Pohorský所指出的,它可以与lookupsplitlines()结合使用:

- debug: msg="{{item}}"
  loop: "{{ lookup('file', 'files/branches.txt').splitlines() }}"

files/branches.txt应该相对于剧本