Jenkins执行Playbooks脚本的环境变量顺序问题

jenkins 执行 playbooks 脚步环境变量问题, 我期望/usr/local/bin优先于 /usr/bin

要在Jenkins中设置环境变量,请按照以下步骤操作:

  1. 在Jenkins主界面上,点击左侧导航栏的"Manage Jenkins"(管理Jenkins)。
  2. 然后选择"Configure System"(配置系统)选项。
  3. 向下滚动页面,找到"Global properties"(全局属性)部分。
  4. 在该部分中,勾选"Environment variables"(环境变量)复选框。
  5. 点击"Add"(添加)按钮,然后输入变量名称和值。例如,输入变量名称为 "PATH",值为 "/usr/local/bin:/usr/bin"。
  6. 点击"Save"(保存)按钮以保存更改。

这样设置后,Jenkins将优先使用/usr/local/bin目录下的命令,而不是/usr/bin目录下的命令。

另外,请确保您的Jenkins代理节点(如果有的话)也具有相同的环境变量设置。您可以在Jenkins主界面上的"Manage Jenkins"(管理Jenkins)> "Manage Nodes and Clouds"(管理节点和云)中配置代理节点的环境变量。

请注意,这些设置将对Jenkins中的所有作业生效。如果您只需要在特定的作业中设置环境变量,可以考虑使用Jenkins的Pipeline功能,并在流水线脚本中定义自定义环境变量。

在该部分中,勾选"Environment variables"(环境变量)复选框。 点击"Add"(添加)按钮,然后输入变量名称和值。例如,输入变量名称为 "PATH",值为 "/usr/local/bin:/usr/bin" 设置了没起作用啊

如果在Jenkins中设置环境变量后没有生效,您可以尝试以下步骤:

  1. 确保您已正确设置了环境变量名称和值。请确保您输入的变量名称是正确的,并且值是使用冒号分隔的路径列表,如 "/usr/local/bin:/usr/bin"。

  2. 确认您正在正确配置全局环境变量而不是作业特定的环境变量。全局环境变量将适用于Jenkins中的所有作业,而作业特定的环境变量只适用于特定作业。如果您希望在特定作业中设置环境变量,请确保您在正确位置进行配置。

  3. 检查是否有任何其他地方的环境变量设置覆盖了您在Jenkins中进行的设置。例如,可能存在其他脚本或配置文件在执行时覆盖了您的环境变量设置。请确保没有其他地方对相同的环境变量进行了修改。

  4. 如果您正在使用代理节点,请确保代理节点上也进行了相同的环境变量设置。在Jenkins的主界面上,点击"Manage Jenkins"(管理Jenkins)> "Manage Nodes and Clouds"(管理节点和云),然后找到您的代理节点并检查其环境变量设置。

如果尝试了上述步骤后仍然无效,您可以尝试重启Jenkins服务器以确保环境变量的更新生效。如果问题仍然存在,您可能需要进一步检查Jenkins日志或与系统管理员进行联系以获取更多支持。

怎么验证我设置的PATH 是否生效呢?

要验证您在Jenkins中设置的环境变量是否生效,可以执行以下步骤:

  1. 在Jenkins主界面上,点击左侧导航栏的"Manage Jenkins"(管理Jenkins)。
  2. 选择"Script Console"(脚本控制台)选项。

在脚本控制台中,您可以执行一些命令来验证环境变量的设置。以下是一个例子:

println System.getenv('PATH')

这行代码将打印出当前Jenkins进程中的PATH环境变量的值。如果您在Jenkins中成功设置了PATH环境变量,并且设置的值为"/usr/local/bin:/usr/bin",则应该在控制台输出中看到相同的值。

请注意,脚本控制台显示的是Jenkins服务器的环境变量,而不是代理节点的环境变量。如果使用了代理节点,请确保在相应的代理节点上进行了相同的环境变量设置,并在代理节点上运行脚本来验证环境变量的设置。

另外,如果您希望验证环境变量在作业执行期间是否生效,可以在作业配置中添加一个简单的Shell脚本步骤,其中包含以下内容:

echo $PATH

当作业运行时,它将打印出当前作业执行环境中的PATH环境变量的值。确认输出是否与您预期的值匹配即可验证环境变量是否生效。

playbooks 的脚步:

- name: "[env] echo path"
  shell: "echo $PATH"
  delegate_to: 127.0.0.1
  run_once: true

在jenkins项目日志看不到 echo $PATH的结果

在Jenkins项目日志中看不到echo $PATH命令的结果可能是因为该命令在Jenkins执行过程中没有输出到标准输出(stdout)或标准错误(stderr)流。为了在Jenkins项目日志中看到输出结果,您可以将命令的输出重定向到标准输出流。

以下是一种修改playbook脚本以查看echo $PATH结果的方法:

- name: "[env] echo path"
  shell: "echo $PATH"
  delegate_to: 127.0.0.1
  run_once: true
  register: result

- debug:
    var: result.stdout

在上面的示例中,我们使用register关键字将echo $PATH命令的输出保存在result变量中。然后,我们使用debug模块打印result.stdout变量的值,这将显示echo $PATH命令的输出结果。

运行修改后的playbook,并检查Jenkins项目日志,您应该能够在输出中看到echo $PATH的结果。

请注意,在Jenkins中运行Ansible playbook时,请确保已正确配置Ansible插件并设置了正确的Ansible环境。确保Jenkins服务器上安装了所需的Ansible版本,并且具有正确的权限和路径配置。

"result.stdout": "/sbin:/bin:/usr/sbin:/usr/bin" 与println System.getenv('PATH')不一样,怎么回事

result.stdoutSystem.getenv('PATH')打印出的结果可能不同的原因是两者查看环境变量的方式不同。

  • println System.getenv('PATH'):这是在Jenkins的Groovy脚本中使用内置的System.getenv()函数来获取环境变量。它返回的是Jenkins进程的环境变量,即Jenkins服务器或代理节点的环境变量。

  • result.stdout:这是通过在Ansible playbook中执行Shell命令来获取输出结果。delegate_to: 127.0.0.1指定了将命令委派给本地主机执行。因此,result.stdout显示的是本地主机的环境变量。

两个结果不一致可能是因为Jenkins服务器和本地主机的环境变量设置不同。Jenkins服务器和本地主机可能具有不同的用户配置文件、环境变量设置或操作系统默认路径。

要确保两个环境变量设置一致,可以尝试以下方法之一:

  1. 在Jenkins项目配置中设置自定义的环境变量:

    • 在Jenkins项目配置中,找到"Environment variables"(环境变量)部分。
    • 添加一个新的环境变量,并设置其值为您期望的$PATH值(例如:/sbin:/bin:/usr/sbin:/usr/bin)。
    • 保存并重新运行项目。
  2. 在Ansible playbook中指定正确的环境变量:

    • 在Ansible playbook中,使用environment关键字指定PATH环境变量的值。例如:
      - name: "[env] echo path"
        shell: "echo $PATH"
        delegate_to: 127.0.0.1
        run_once: true
        environment:
          PATH: "/sbin:/bin:/usr/sbin:/usr/bin"
        register: result
      
      - debug:
          var: result.stdout
      

无论您选择哪种方法,请确保Jenkins服务器和本地主机上的环境变量设置一致。这样,println System.getenv('PATH')result.stdout应该会显示相同的结果。

我在root下执行echo $PATH 输出

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk-11.0.2/bin:/root/bin

但是 在Jenkins中运行Ansible playbook时

"result.stdout": "/sbin:/bin:/usr/sbin:/usr/bin"

在Jenkins中运行Ansible playbook时,执行命令的环境可能会受到Jenkins的配置和运行方式的影响。为了确保在Jenkins中使用与root用户相同的环境变量,请尝试以下方法:

  1. 在Jenkins项目配置中设置自定义的环境变量:

    • 在Jenkins项目配置中,找到"Build Environment"(构建环境)部分。
    • 勾选"Set jdk and/or Maven/Ant properties"(设置jdk和/或Maven/Ant属性)选项。
    • 在"Properties File Path"(属性文件路径)字段中输入一个文件路径,例如:/path/to/env.properties
    • 在该文件中,添加一行以PATH=YOUR_ROOT_PATH的格式,例如:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk-11.0.2/bin:/root/bin
    • 保存并重新运行项目。
  2. 在Ansible playbook中指定完整的环境变量:

    • 在Ansible playbook中,使用environment关键字指定完整的环境变量。例如:
      - name: "[env] echo path"
        shell: "echo $PATH"
        delegate_to: 127.0.0.1
        run_once: true
        environment:
          PATH: "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk-11.0.2/bin:/root/bin"
        register: result
      
      - debug:
          var: result.stdout
      
  3. 在Jenkins服务器上设置全局的环境变量:

    • 登录到Jenkins服务器作为root用户。
    • 编辑/etc/environment文件,并将PATH环境变量设置为所需的值,例如:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk-11.0.2/bin:/root/bin"
    • 保存文件并重新启动Jenkins服务。

无论您选择哪种方法,请确保在Jenkins中使用与root用户相同的环境变量配置。这样,您应该能够在Jenkins项目日志中看到与在root用户下执行echo $PATH相同的结果。