我正在使用Ansible 2.8.4-1.el7
来自动化一些任务。自从我开始学习该工具以来,大部分时间都在阅读官方文档(更具体地说,我在关注these examples)。
我只是试图执行一个管理Tomcat实例的脚本:
- name: Stop service
command: "{{ script_manager }} stop"
args:
chdir: "{{ path_base }}/bin/"
我要预先设置这些变量:
path_base: /some/path/tomcat9_dev/
script_manager: tomcat9_dev
...但是我仍然收到此错误消息:
TASK [tomcat : Stop service] ***************************************************
fatal: [tld.server.name]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "cmd": "tomcat9_dev stop", "msg": "[Errno 2] No such file or directory", "rc": 2}
似乎没有先更改到该目录即可执行命令。有任何线索吗?
我知道该位置存在,我可以SSH进入服务器并
cd
进入服务器。
更新:如果我执行"{{ path_base }}/bin/{{ script_manager }} stop"
,则效果很好。无论如何,有什么更好的方法?
答案 0 :(得分:4)
当前目录不是* nix OS中PATH的一部分。将目录更改为正确的位置是不够的。
如果您确实要这样调用脚本,则必须在用户的PATH中添加{{ path_base }}/bin/
。
同时,您可以通过相对于当前目录调用脚本来利用chdir
:
- name: Stop service
command: "./{{ script_manager }} stop"
args:
chdir: "{{ path_base }}/bin/"
更进一步,您是IMO的走错误的道路:tomcat应该是机器上的注册服务,您应该使用相关模块进行操作:通用service
或特定systemd
之一,runit
,sysvinit
...
服务示例:
- name: Make sure tomcat_dev is stopped
service:
name: tomcat_dev
state: stopped