我正在尝试设置命令运行的环境,但无论我做什么,似乎都无法为command任务正确设置环境。
我在一个名为test-kitchen的角色中运行此任务
- name: Debug
command: echo $PATH > /tmp/pathdoc && echo $GEM_PATH > /tmp/gempath
environment:
PATH: "{{ lookup('env', 'PATH') }}:/usr/local/bin:"
GEM_PATH: "{{ rvm1_install_path }}/gems/ruby-{{ ruby_version }}:\
{{ rvm1_install_path }}/gems/ruby-{{ ruby_version }}@global"我从一个剧本中调用角色,看起来像这样。
- hosts: all
become: true
roles:
- kitchen-tester我已经尝试在角色变量、剧本变量以及现在的任务中设置变量,但无论我做什么,文件/tmp/pathdoc都会显示此路径/sbin:/bin:/usr/sbin:/usr/bin,而GEM_PATH变量甚至都没有设置。
我是不是错过了什么愚蠢的东西?Ansible v2.6
发布于 2018-07-11 14:34:24
几点观察:
以上场景的输出如下:
changed: [192.168.3.103] => {"changed": true, "cmd": ["echo", "$PATH", ">", "/tmp/pathdoc", "&&", "echo", "$GEM_PATH", ">", "/tmp/gempath"], "delta": "0:00:00.002654", "end": "2018-07-11 11:24:02.994448", "invocation": {"module_args": {"_raw_params": "echo $PATH > /tmp/pathdoc && echo $GEM_PATH > /tmp/gempath", "_uses_shell": false, "chdir": null, "creates": null, "executable": null, "removes": null, "warn": true}, "module_name": "command"}, "rc": 0, "start": "2018-07-11 11:24:02.991794", "stderr": "", **"stdout": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/bin: > /tmp/pathdoc && echo /tmp/gems/ruby-1:/tmp/gems/ruby-1@global > /tmp/gempath", "stdout_lines"**: **["/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/bin: > /tmp/pathdoc && echo /tmp/gems/ruby-1:/tmp/gems/ruby-1@global > /tmp/gempath"]**, "warnings": []}查看上面输出的stdout部分,您将注意到设置了GEM_PATH和PATH,但它们不是单独的echo命令,因为您认为它们只是一个echo命令,而字符串的其余部分是此命令的参数。另一件事是用&&对命令进行分组,这是我不知道的。我使用';‘,所以如果您确定&&可以用于分组,请使用它。
因此,对于预期结果,请使用shell或在命令中调用shell。
希望这能有所帮助。
关于Sudhakar
发布于 2018-07-07 06:30:54
文档中提到了command模块:
给定的命令将在所有选定的节点上执行。它不会通过外壳处理,因此$HOME等变量和“<”、“>”、“|”、“;”和“&”等操作将不起作用(如果需要这些功能,请使用外壳模块)。
请尝试使用shell模块:
外壳模块接受命令名,后跟一系列以空格分隔的参数。它与命令模块几乎完全相同,只是通过远程节点上的shell (/bin/sh)运行命令。
此外,请记住,lookup插件在Ansible主机上执行,而不是在远程主机上执行。
https://stackoverflow.com/questions/51218305
复制相似问题