我正在尝试使用以下 Ansible 脚本(剧本的一部分)systemd
在 EC2(微型)实例上的 rails 应用程序上运行 unicorn:
---
- name: restart unicorn
command: psql -h {{ db_host }} -U {{ db_user }} -d {{ db }} -c "SELECT true FROM pg_tables WHERE tablename = 'order_cycles';"
register: table_exists
ignore_errors: yes
sudo: yes
sudo_user: "{{ unicorn_user }}"
notify: restart unicorn step 2
#TODO make sure both of these things run as one handler.
- name: restart unicorn step 2
service:
name: unicorn_{{ app }}
state: restarted
when: table_exists.stderr.find('does not exist') == -1
# If unicorn isn't actually started yet we probably need this:
notify: start unicorn
- name: start unicorn
service:
name: unicorn_{{ app }}
state: started
剧本中配置的用户是ubuntu
默认(EC2)用户,我在那里遇到Interactive authentication required
错误,所以我只是尝试直接在部署到服务器的命令行中排除故障,并遇到了这个障碍。
我可以用 sudo 来运行它:
$ sudo systemctl start unicorn_myapp.service
直接通过服务器的命令行,或者使用Ansible 的原始版本方法,成功了。
但是用户运行的 rails 服务器ubuntu
无法访问它(至少这是我正在探索的导致.sock failed (111: Connection refused
错误的途径)。
如果我不使用 sudo 运行它,则会要求输入密码,但据我所知,EC2 ubuntu 用户无需密码即可运行。
我知道一个解决方法可能是创建新用户并设置密码并以该用户身份运行 rails 和 systemctl/unicorn,但我不认为这是该问题的真正答案,更重要的是,由于剧本的开发人员最近出于user_password
安全原因将其从剧本中完全删除。
如果我能弄清楚如何systemd
以非 root 用户身份运行,也许我就能弄清楚如何让 Ansible 成功运行。
当然,我一开始就从错误的角度来处理这个问题,这也并非不可能,因为我对这个场景所涉及的几乎所有事情都相当陌生。
答案1
如果您有全局 sudo,请添加become: no
到不需要 sudo 权限的两个任务。