在角色任务中设置Ansible环境

时间:2018-07-06 22:21:36

标签: ansible

我正在尝试为运行命令设置环境,无论我做什么,我似乎都无法为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

2 个答案:

答案 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主机而不是远程主机上执行的。

相关问题