2017-04-21 99 views
0

我试图去与一些更先进的Ansible的剧本,并打了一堵墙。我试图让Ansible去做这个/ bin/bash'for'循环。循环一个shell命令insible

for i in $(</filename.txt);do '/some/command options=1 user=usera server=$i';done 

filesnames.txt包含50-100个主机名。

我不能使用jinja模板作为命令必须运行,而不仅仅是配置文件更新。

任何帮助将不胜感激。

由于提前, 杰里米

回答

2
  1. 可以使用神社模板,但不同
  2. 您的特定代码没有做的事情是最明智的
  3. 多行代码,你应该使用shell模块。多码片呼叫的

例如:

- name: run multiline stuff 
    shell: | 
    for x in "${envvar}"; do 
     echo "${x}" 
    done 
    args: 
    executable: /bin/bash 

注意到我明确设置executable,这将确保bash-isms会工作。

我刚刚使用envvar作为例子,可用的任意环境变量。

,如果你需要通过特定的ENV变量,你应该使用通话environment子句shell模块,请参阅:http://docs.ansible.com/ansible/playbooks_environment.html

对于简单的变量,你可以使用在外壳的价值:echo "myvar: {{myvar}}"

如果你想在bash代码中使用一个安全的列表/元组变量,你可以先将它变成bash变量。例如如果你有一个mylist中的东西列表,你可以展开它并分配给一个bash数组,然后遍历它。呼叫的到shell shell代码将是:

mylist_for_bash=({{mylist|join(" ")}}) 
    for myitem in "${mylist_for_bash[@]}"; do 
     echo "my current item: ${myitem}" 
    done 

另一种方法是把它作为字符串环境变量,它在代码转换成一个阵列后面。

注: 当然这一切工作正常只SPACELESS值 我从来没有通过阵列容纳空间项目

+0

@杰里米 - 休伊,最佳实践,使用'shellcheck',例如把你的scriptlet写入一个文件,然后运行:'shellcheck myfile.sh' 这会打印出各种警告信息。 https://github.com/koalaman/shellcheck –

+0

那么,'$ {envvar}'是适用于Ansible角色的../var目录中的一个列表吗? –

+0

@JeremyHuey我刚刚用它作为示例,提供了一些可用的环境变量。如果您需要传递特定的env变量,则应该使用'shell'模块调用的'environment'子句,请参阅:http://docs.ansible.com/ansible/playbooks_environment.html –