我正在尝试为运行命令设置环境,无论我做什么,我似乎都无法为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
我尝试在角色vars,剧本vars和现在的任务中设置变量,但是无论我做什么,文件/tmp/pathdoc
都会显示此路径/sbin:/bin:/usr/sbin:/usr/bin
,甚至没有设置GEM_PATH变量。
我想念一些愚蠢的东西吗? Ansible v2.6
答案 0 :(得分:0)
很少观察到
上述情况的输出是这样的:
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。
希望有帮助。
问候 苏达喀尔
答案 1 :(得分:-1)
文档说command
模块:
给定的命令将在所有选定的节点上执行。它不会通过外壳进行处理,因此$ HOME之类的变量以及“ <”,“>”,“ |”,“;”和“&”之类的操作将不起作用(如果需要这些功能,请使用shell模块)
尝试使用shell
模块:
shell模块采用命令名称,后跟空格分隔的参数列表。几乎与命令模块完全一样,但是通过远程节点上的外壳程序(/ bin / sh)运行命令。
此外,请记住lookup
插件是在Ansible主机而不是远程主机上执行的。