使用 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
我正在尝试将我的点文件和一些个人配置文件推送到服务器(我不是 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