Ansible 版本
user@server:/home$ ansible --version
ansible 2.1.1.0
在 Puppet 中:
exec { 'run gulp as www-data':
command => '/usr/local/lib/npm/bin/gulp'
cwd => '/var/www'
user => 'www-data'
}
这也有效:
sudo -u www-data /usr/local/lib/npm/bin/gulp
但当
- command: /usr/local/lib/npm/bin/gulp
args:
chdir: "{{ project_dir }}"
become: www-data
在 ansible 中使用,结果是:
FAILED! => {"changed": true, "cmd": ["/usr/local/lib/npm/bin/gulp"],
"delta": "0:00:00.631959", "end": "2016-09-15 09:57:41.167507", ...
如果
- command: /usr/local/lib/npm/bin/gulp
args:
chdir: "{{ project_dir }}"
运行时 gulp 命令以 root 用户身份执行,而它应该以 身份运行www-data
。
问题
如何sudo -u www-data /usr/local/lib/npm/bin/gulp
在 Ansible 中进行翻译,以便在 Puppet 和 Bash 中运行时结果相同?
答案1
我认为你需要设置become_user
:
- name: run gulp
command: /usr/local/lib/npm/bin/gulp
args:
chdir: "{{ project_dir }}"
become: True
become_user: www-data
看一下文档:
- name: Run a command as the apache user
command: somecommand
become: true
become_user: apache
答案2
你没有说你使用的是哪个版本的 Ansible。在 2.x 中你可以执行以下操作:
- name: run gulp
remote_user: www-data
command: /usr/local/lib/npm/bin/gulp
答案3
Henrik Pingel 对某些系统的局限性的暗示也是正确的,因为 www-data 在大多数系统上并不是一个完整用户。
但是如果 sudo 手动工作,您可以尝试在清单中主机的 ansible_become_method 变量中指定 ansible 应使用哪种方法成为另一个用户:
ansible_become_method=sudo
或者
ansible_become_method=su
也许这对您的特定系统来说已经足够了,而不需要 Henrik 评论中的链接中提到的一些更复杂的步骤。但是,如果不够,那么我看不出有任何解决方法,或者甚至可能创建另一个新用户并重新配置您的 Web 服务器/Web 脚本解释器以使用这个新的完整用户而不是 www-data,这就是我一直在做的事情,以便能够通过 ssh 登录并真正以与 Web 脚本相同的用户身份工作。