【问题标题】:Setting ansible environment in Role task在角色任务中设置 ansible 环境
【发布时间】:2018-07-11 14:34:23
【问题描述】:

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

【问题讨论】:

    标签: ansible


    【解决方案1】:

    几个观察:

    上述场景的输出是这样的:

    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": []}
    

    查看上述输出的标准输出部分,您会注意到 GEM_PATH 和 PATH 已设置,但它们不是单独的回显命令,因为您认为它们只是一个回显命令,其余字符串是该命令的参数。 另一件事是用 && 对命令进行分组,这是我不知道的。我用 ';'因此,如果您确定 && 可用于分组,请使用它。

    因此,为了预期的结果,请使用 shell 或在命令中调用 shell。

    希望对您有所帮助。

    问候 苏达卡

    【讨论】:

    • &&(逻辑AND)通常(但不一定)比;更好的选择,因为在多个命令序列中,它会在遇到错误时立即停止。
    【解决方案2】:

    command 模块的文档说:

    给定的命令将在所有选定的节点上执行。它不会通过 shell 处理,所以像 $HOME 这样的变量和像“”、“|”、“;”这样的操作而“&”将不起作用(如果您需要这些功能,请使用 shell 模块)。

    尝试改用shell 模块:

    shell 模块采用命令名称,后跟以空格分隔的参数列表。它几乎与命令模块完全相同,但通过远程节点上的 shell (/bin/sh) 运行命令。

    另外,请记住 lookup 插件在 Ansible 主机上执行,而不是远程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-18
      • 2014-01-17
      • 2019-08-30
      • 2015-08-26
      • 1970-01-01
      • 2021-05-28
      • 2020-06-01
      • 1970-01-01
      相关资源
      最近更新 更多