我正在寻找与with_items:
类似的内容,但这样可以从文件中获取项目列表,而不必将其包含在剧本文件中。
我怎样才能在ansible中做到这一点?
答案 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ý所指出的,它可以与lookup
和splitlines()
结合使用:
- debug: msg="{{item}}"
loop: "{{ lookup('file', 'files/branches.txt').splitlines() }}"
files/branches.txt
应该相对于剧本