Python中如何使用saltstack修改minion的默认shell为/bin/bash?
saltstack 求助:如果修改 minion 的默认 shell ?
小弟在多台机器上部署了 minion,部署之前已经确认用户的$SHELL 变量为 /bin/bash,/etc/passwd 中的配置也一样是 /bin/bash,但是使用 cmd.run 执行命令时,minion 仍使用 /bin/sh 执行,master 使用 salt ‘*’ grains.item shell 命令查看时,所有 minion 返回的值也为 /bin/sh,请问如果做能将 minion 的默认 shell 改为 /bin/bash ?
Python中如何使用saltstack修改minion的默认shell为/bin/bash?
我们能不能先把「如何」两字打对啊……
# 使用SaltStack的state文件修改minion默认shell为/bin/bash
# 方法1:通过user.present状态模块(推荐)
# 创建 /srv/salt/shell_change.sls 文件
change_default_shell:
user.present:
- name: root # 要修改的用户,通常是root或其他用户
- shell: /bin/bash
# 如果只想对特定minion生效,可以添加目标匹配条件
# - target: 'minion-id'
# 执行命令:salt 'minion-id' state.apply shell_change
# 方法2:通过cmd.run直接执行命令
change_shell_via_cmd:
cmd.run:
- name: chsh -s /bin/bash
# 如果需要sudo权限
# - runas: root
# - sudo: True
# 方法3:直接修改/etc/passwd文件(不推荐,容易出错)
modify_passwd_file:
file.replace:
- name: /etc/passwd
- pattern: '^root:.*:/bin/sh$'
- repl: 'root:x:0:0:root:/root:/bin/bash'
- backup: True
# 方法4:使用grains设置并应用到所有minion(需要pillar配合)
# 在pillar中定义:
# users:
# root:
# shell: /bin/bash
# 然后在state中:
{% for user, args in pillar.get('users', {}).items() %}
{{ user }}_shell:
user.present:
- name: {{ user }}
- shell: {{ args.shell }}
{% endfor %}
执行步骤:
- 将上述任一方法保存为
.sls文件到salt文件服务器 - 运行
salt 'target-minion' state.apply filename(不加.sls扩展名) - 验证:
salt 'minion' cmd.run 'echo $SHELL'
注意: 修改root用户的shell需要确保minion上有/bin/bash且权限正确。建议先在测试环境验证。
一句话建议:用user.present状态模块最稳妥。
在红帽系中 ,/bin/sh 应该是指向 /bin/bash 的软连接吧 ubuntu 中可能是指向到 dash 的。
如果是我的话,我要么调整系统 sh 指向到 bash,要么重写个自定义的 grains 覆盖 shell 为 /bin/bash
salt.modules.cmdmod.run(cmd, cwd=None, stdin=None, runas=None, shell=’/bin/sh’, python_shell=None, env=None, clean_env=False, template=None, rstrip=True, umask=None, output_loglevel=‘debug’, log_callback=None, timeout=None, reset_system_locale=True, ignore_retcode=False, saltenv=‘base’, use_vt=False, bg=False, password=None, encoded_cmd=False, **kwargs)
注意其中 shell=’/bin/sh’
cmd.run 用的是 zsh 好像

