无法从 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 &
nohup
和 screen
在这里有点多余,如果您不想稍后重新连接到会话 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 切换到特定用户 运行 我的脚本作为。
我正在尝试通过 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 &
nohup
和 screen
在这里有点多余,如果您不想稍后重新连接到会话 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 切换到特定用户 运行 我的脚本作为。