使用 ansible 编辑当前用户的 shell

hug*_*aka 3 linux sysadmin bash shell ansible

我正在尝试将我的点文件和一些个人配置文件推送到服务器(我不是 root 或 sudoer)。Ansible 以我的用户身份连接,以便编辑我的主文件夹中的文件。

我想将我的默认 shell 设置为usr/bin/fish. 我不允许编辑/etc/passwd所以

user:
  name: shaka
  shell: /usr/bin/fish
Run Code Online (Sandbox Code Playgroud)

不会跑。

我还检查了chsh命令,但我的密码的可执行提示。

我怎么能在这样的机器上改变我的外壳?(Debian 8、Ubuntu 16、Opensuse)

小智 9

我知道这是旧的,但我想发布这个,以防其他人像我一样回到这里寻求建议:

如果您正在运行本地剧本,您可能不会指定用户并期望更改运行剧本的用户的外壳。

问题是您不能在不提升权限 ( become: yes) 的情况下更改 shell ,但是当您这样做时 - 您是以 root 身份运行的。这只是改变了 root 用户的 shell。您可以通过查看 /etc/passwd 并查看 root shell 是什么来仔细检查是否是这种情况。

这是我更改运行剧本的用户外壳的秘诀:

- name: set up zsh for user
  hosts: localhost
  become: no
  vars:
    the_user: "{{ ansible_user_id }}"
  tasks:
    - name: change user shell to zsh 
      become: yes
      user:
        name: "{{ the_user }}"
        shell: /bin/zsh
Run Code Online (Sandbox Code Playgroud)

这会将变量the_user设置为当前正在运行的用户,但会使用 root 更改该用户的 shell。


hug*_*aka 8

我最终使用了两个 ansible 模块:

  • 安塞布尔期望
  • ansible提示

首先,我根据提示记录我的密码:

vars_prompt:
  - name: "my_password"
    prompt: "Enter password"
    private: yes
Run Code Online (Sandbox Code Playgroud)

然后我使用该模块expect将密码发送到 chsh 命令:

tasks:
  - name: Case insensitve password string match
    expect:
      command: "chsh -s /usr/bin/fish"
      responses:
        (?i)password: "{{ my_password }}"
      creates: ".shell_is_fish"
Run Code Online (Sandbox Code Playgroud)

设置creates一个锁定文件以避免再次触发该任务。这可能很危险,因为 shell 可能会在之后更改,而 ansible 不会更新它(因为锁仍然存在)。您可能想避免这种行为。


tra*_*nag 6

我是这样做的:

- name: Set login shell of user {{ ansible_env.USER }} to `/bin/zsh` with `usermod`
  ansible.builtin.command: usermod --shell /bin/zsh {{ ansible_env.USER }}
  become: true
  changed_when: false
Run Code Online (Sandbox Code Playgroud)