无法从 ansible 剧本调用 shell 脚本

Not able to call a shell script from an ansible playbook

我正在尝试通过 ansible 剧本在后台 运行 两个 shell 脚本。 剧本 运行ning 成功,显示所有任务 运行 成功。

但这两个 shell 脚本不是 运行ning。 我已经检查过这个:

ps -ef | grep sh

这两个 shell 脚本是 运行 sage 服务所必需的,我正在尝试自动化 使用ansible的年龄服务器配置。 剧本如下所示:

---
- hosts: localhost
  remote_user: root

  tasks:
   - name : update system
     shell : apt-get update

   - name : install dependencies
     shell : apt-get install -y m4 build-essential gcc gfortran libssl-dev

   - name : install python-software-properties
     shell : apt-get install python-software-properties

   - name : add sage ppa repo
     shell : apt-add-repository ppa:aims/sagemath

   - name : update system
     shell : apt-get update

   - name : install dvipng
     shell : apt-get install dvipng

   - name : install sage binary
     shell : apt-get install sagemath-upstream-binary

   - name : run create sage script
     shell : . ./create_sagenb &

   - name : run start sage script
     shell : . ./start_sage &

这是 create_sagenb 的样子:

#!/bin/bash
# Creating Sage notebook
screen -S "Sage_Server" sage -c 'notebook(interface="",directory="/root/.sage/sage_notebook.sagenb",port=80,accounts=true)'

这是 start_sage 的样子:

#!/bin/bash
# Creating Sage notebook
address=$(hostname --ip-address)
screen -S "Sage_Server" sage -c "notebook(interface=" "'$address'" ",port=80,accounts=true)"

当您注销 - 或者在这种情况下 Ansible 完成其任务并关闭 ssh 连接时,退出信号将自动发送到所有子进程。由于屏幕没有分离,我猜它也会在注销时终止。这就像你在输入 "exit",而不是简单地断开连接。

您应该可以使用 nohup 来防止这种情况发生,例如:

- name : run create sage script
  shell : nohup ./create_sagenb &

nohupscreen 在这里有点多余,如果您不想稍后重新连接到会话 Sage_Server,也许您可​​以删除 screen

但我认为您应该考虑创建一个初始化脚本,例如 start-stop-daemon。看看这个:https://www.project-insanity.org/blog/2012/09/27/install-sage-5-3-on-debian-squeeze-initscript/

这就是我在 Ansible 中成功调用屏幕会话的方式:

- name: Invoke script
  command: /usr/bin/screen -d -m sudo -u myuser /usr/local/bin/myuser.sh -i -y

这会在分离模式(-d 和 -m 组合)下启动屏幕会话,然后我使用 sudo 切换到特定用户 运行 我的脚本作为。