You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Ansible Playbook在Ubuntu Server上为指定用户安装SDKMAN

问题描述

我需要用Ansible自动化在服务器上安装软件包,部分特定版本的包可通过SDKMAN安装。手动安装SDKMAN只需执行:

curl -s "https://get.sdkman.io" | bash

即可为当前用户完成安装,但我想用Ansible实现该流程自动化。

我尝试了以下修改后的命令:

- name: Download and install SDKMAN
  get_url:
    url=https://get.sdkman.io
    dest=/opt
    mode=755

- name: Load SDKMAN environment
  command: source "/opt/.sdkman/bin/sdkman-init.sh"
  changed_when: false

但该命令下载的是SDKMAN对应URL的index.html文件。我是Ansible新手,知道需修改但不确定具体方案。

于是我调整了步骤,将index.html重命名为sdkman-init.sh(确认该文件是SDKMAN的安装bash脚本):

- name: Download and install SDKMAN
  get_url:
    url=https://get.sdkman.io
    dest=/opt
    mode=755

- name: change dir
  file:
    path: /opt/.sdkman/bin
    state: directory

- name: rename file
  command: mv /opt/index.html /opt/.sdkman/bin/sdkman-init.sh

- name: make script executable
  command: chmod 777 /opt/.sdkman/bin/sdkman-init.sh

- name: now, run scipt for sdkman
  command: /opt/.sdkman/bin/sdkman-init.sh

- name: Load SDKMAN environment
  command: source "${HOME}/.sdkman/bin/sdkman-init.sh"
  changed_when: false
  environment:
    HOME: /home/myotheruser  # Use the appropriate variable for the user's home directory

我使用拥有root权限的admin用户执行任务,需要为无root权限的myotheruser安装SDKMAN。手动执行这些步骤可成功为admin用户安装,但Ansible却将其安装到root用户目录下,而非admin或目标用户myotheruser,不清楚该如何调整才能让脚本为myotheruser完成安装。

解决方案

核心问题分析

  1. 下载文件命名错误:get_url直接指定dest=/opt时,会把文件保存为index.html(目标为目录时,Ansible会使用URL默认文件名),需直接指定脚本文件名。
  2. 执行用户错误:默认情况下Ansible以当前执行用户(admin)权限运行任务,未指定切换用户时,脚本会以root身份执行,导致SDKMAN安装到root家目录。
  3. source命令不兼容command模块:source是bash内置命令,command模块不支持,需用shell模块并指定bash环境执行。

正确的Ansible Playbook步骤

- name: 为myotheruser安装SDKMAN
  hosts: your_target_hosts
  become: true
  vars:
    target_user: myotheruser
    target_home: "/home/{{ target_user }}"

  tasks:
    - name: 下载SDKMAN安装脚本
      get_url:
        url: https://get.sdkman.io
        dest: /tmp/get-sdkman.sh
        mode: '0755'

    - name: 以目标用户身份执行SDKMAN安装脚本
      shell: /tmp/get-sdkman.sh
      become_user: "{{ target_user }}"
      environment:
        HOME: "{{ target_home }}"

    - name: 初始化SDKMAN环境并验证安装
      shell: source "{{ target_home }}/.sdkman/bin/sdkman-init.sh" && sdk version
      become_user: "{{ target_user }}"
      args:
        executable: /bin/bash
      changed_when: false

    # 可选:清理临时安装脚本
    - name: 删除临时安装脚本
      file:
        path: /tmp/get-sdkman.sh
        state: absent

步骤说明

  • 指定脚本文件名:将安装脚本下载到/tmp/get-sdkman.sh,避免默认生成index.html。
  • 切换目标用户执行:通过become_user指定myotheruser,确保安装过程在该用户环境下进行,SDKMAN会自动安装到该用户的家目录.sdkman下。
  • 使用shell模块执行内置命令:初始化环境时,指定executable: /bin/bash确保source命令正常执行,同时通过sdk version验证安装成功。

内容的提问来源于stack exchange,提问作者Amartya Sinha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 13:28:45