使用 "become: true" 更改默认 shell 且 Ansible 不起作用

Using "become: true" to change default shell with Ansible not working

使用 become 更改用户的默认值 shell 未给出预期结果。使用:

- name: Change default shell to zsh
  shell: sudo chsh -s $(which zsh) $(whoami)

/etc/passwd 看起来像:

root:x:0:0:root:/root:/bin/bash
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/usr/bin/zsh

这是预期的结果,即将 ubuntu 用户的默认 shell 更改为 zsh。现在,我宁愿使用 become:

- name: Change default shell to zsh
  become: true
  shell: chsh -s $(which zsh)

但是 /etc/passwd 看起来像:

root:x:0:0:root:/root:/usr/bin/zsh
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash

请注意,zsh 仅为 root 设置。

我在这里错过了什么? become: trueshell: chsh -s $(which zsh)不等于sudo chsh -s $(which zsh) $(whoami)sudo chsh -s $(which zsh)吗?

如果我添加 $(whoami) 比如:

- name: Change default shell to zsh
  become: true
  shell: chsh -s $(which zsh) $(whoami)

我得到相同的结果,rootzsh 但不是我想要更改的用户。

这有效:

- name: Register current user (workaround to change default shell)
  shell: whoami
  register: current_user

- name: Change default shell to zsh
  become: true
  shell: "chsh -s $(which zsh) {{ current_user.stdout }}"

有关详细信息,请参阅上面的评论。简而言之,我必须先 运行 whoami 以便在 运行 宁 chsh.

时使用正确的用户

我会使用这样的东西:

- name: Ensure the user 'ubuntu' has a zsh shell.
  user:
    name: ubuntu
    shell: /bin/zsh
    state: present
  become: yes