我编写了一个简单的剧本open-links.yml
,旨在在我的远程主机之一上运行脚本:
- name: Run Bash script
hosts: myhosts
gather_facts: false
vars:
au: "j"
tasks:
- name: Copy and run a script that opens a link
script: /home/{{ au }}/CS/SoftwareDevelopment/MySoftware/Bash/ansible/open-links.sh
open-links.sh
是一个用于在浏览器中打开链接的脚本:
#!/usr/bin/bash
# Link to open
link_to_open="https://calendar.google.com/calendar/u/0/r"
doas -u oumaima echo "From ${0}, $(whoami): It works, doesn't it"|tee ~/debug.log
doas -u oumaima brave-browser "${link_to_open}" > /dev/null 2>&1 &
#doas -u oumaima DISPLAY=:0 brave-browser "${link_to_open}" > /dev/null 2>&1 &
#doas -u oumaima DISPLAY=:0.0 brave-browser ${link_to_open} > /dev/null 2>&1 &
#neither of these two work, whatever the value of DISPLAY
虽然运行ansible-playbook -u root -i inventory.ini open-links.yml
给了我以下输出
PLAY [Run Bash script] **********************************************************************************
TASK [Copy and run a script that opens a link] ***********************************************************
changed: [fe80::cc08:9465:8dba:15a9%wlp4s0]
PLAY RECAP **********************************************************************************************
fe80::cc08:9465:8dba:15a9%wlp4s0 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
没有链接被打开。的位置debug.log
是/root/
,其内容是
From /root/.ansible/tmp/ansible-tmp-1702325377.165474-2513875-125933755232488/open-links.sh, root: It works, doesn't it
,它们都向我表明,如果确实有任何链接被打开,那么它可能会发生在root
。当我使用 ssh 登录到远程主机并手动运行时
link_to_open="https://calendar.google.com/calendar/u/0/r"
doas -u oumaima brave-browser "${link_to_open}" > /dev/null 2>&1 &
然后浏览器就会打开为用户指定的链接oumaima
。我知道链接已打开,因为远程主机位于同一个房间,并且我可以从用户帐户看到浏览器oumaima
。将 oumaima GUI 中发生的情况转发到我的控制站不是我想要的,并且让它超出了这个问题的范围。我只想打开链接。为什么使用 ansible-playbook -u root -i inventory.ini open-links.yml 运行脚本时不会发生这种情况
我知道我可以通过允许非 root 登录远程主机并运行 playbook 来解决这个问题oumaima
,如下所示ansible-playbook -u oumaima -i inventory.ini open-links.yml
:让此类解决方案超出此问题的范围。我想解决将剧本运行为root
.
关于主办方:与我的控制台位于同一房间、同一 LAN 上的一台笔记本电脑。控制台和远程主机上的 Ubuntu Desktop 22.04 LTS。
答案1
要使用 X11 显示器,您通常需要满足两件事:
- 一个 Xauthority 文件(
~/.Xauthority
或者环境变量指向的文件XAUTHORITY
),其中包含您要使用的显示的有效会话 cookie, - 以及
DISPLAY
指定您要使用的显示的环境变量。
如果您使用 X11 转发运行 SSH 会话,并且本地端在本地满足 X11 使用要求,并且远程端有xauth
可用的命令,那么远程端sshd
将自动为您设置这两个要求,从而显示最终将出现在您启动 SSH 客户端的本地屏幕上。
如果您远程运行 X11 程序并将其设置DISPLAY
为:0
,则意味着您正在尝试使其在直接连接到远程系统的显示器,如果您将系统用作广告牌,这可能很有用,但可能不会立即对您可见。为了成功,远程系统应该已经与您用来运行 X11 程序的任何用户帐户建立了登录的 GUI 会话,以便 Xauthority 文件存在并且是最新的。
当 Ansible 使用 SSH 时,默认情况下它可能不会请求 X11 转发,除非您明确配置它这样做。