使用 ansible 编辑当前用户的 shell

Edit current user's shell with ansible

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

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

user:
  name: shaka
  shell: /usr/bin/fish

不会运行。

我还检查了 chsh 命令,但可执行文件提示我输入密码。

如何在此类机器上更改我的 shell? (Debian 8, Ubuntu 16, Opensuse)

Ubuntu 16

~/.bashrc

中添加第一行

/usr/bin/fish && exit

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

  • ansible 期望
  • ansible 提示

首先我在提示下记录我的密码:

vars_prompt:
  - name: "my_password"
    prompt: "Enter password"
    private: yes

然后我使用模块 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"

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

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

如果您是 运行 本地 playbook,您可能不会指定用户并期望更改 shell 您作为 运行 playbook 的用户。

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

这是我更改用户 运行 的 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

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

这是我的做法:

- 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