我的问题是为什么我不能使用相对路径来指定要运行的bash脚本?
我在best practice之后有一个无用的文件结构。
此角色的目录结构为:
.
├── files
│ └── install-watchman.bash
└── tasks
└── main.yml
main.yml包含以下内容:
- name: install Watchman
shell: "{{ role_path }}/files/install-watchman.bash"
- name: copy from files dir to target home dir
copy:
src: files/install-watchman.bash
dest: /home/vagrant/install-watchman.bash
owner: vagrant
group: vagrant
mode: 0744
- name: install Watchman
shell: files/install-watchman.bash
我希望这三个命令都能正常工作,但实际上第三个命令会失败:
TASK [nodejs : install Watchman] ***********************************************
changed: [machine1]
TASK [nodejs : copy from files dir to target home dir] ********
changed: [machine1]
TASK [nodejs : install Watchman] ***********************************************
fatal: [machine1]: FAILED! => {"changed": true, "cmd": "files/install-watchman.bash", "delta": "0:00:00.002997", "end": "2019-01-27 16:01:50.093530", "msg": "non-zero return code", "rc": 127, "start": "2019-01-27 16:01:50.090533", "stderr": "/bin/sh: 1: files/install-watchman.bash: not found", "stderr_lines": ["/bin/sh: 1: files/install-watchman.bash: not found"], "stdout": "", "stdout_lines": []}
to retry, use: --limit @/vagrant/ansible/site.retry
(如果有帮助,这是ansible的版本信息:)
vagrant@ubuntu-xenial:~$ ansible --version
ansible 2.7.6
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/home/vagrant/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.12 (default, Nov 12 2018, 14:36:49) [GCC 5.4.0 20160609]
答案 0 :(得分:1)
我对此进行了测试,以查看:https://github.com/farrellit/ansible-demonstrations/tree/master/shell-cwd
它使我相信,简短的答案可能是,可角色的shell
任务默认情况下将包含该角色的剧本的工作目录。
基本上可以归结为这样的角色(该目录的其余部分是使其运行的工具):
- shell: pwd
register: shellout
- debug: var=shellout.stdout
- shell: pwd
args:
chdir: "{{role_path}}"
register: shellout2
- debug: var=shellout2.stdout
显示为:
PLAY [localhost] ***********************************************************************************************************************************************************************************************************************
TASK [shelldir : command] **************************************************************************************************************************************************************************************************************
changed: [127.0.0.1]
TASK [shelldir : debug] ****************************************************************************************************************************************************************************************************************
ok: [127.0.0.1] => {
"shellout.stdout": "/code"
}
TASK [shelldir : command] **************************************************************************************************************************************************************************************************************
changed: [127.0.0.1]
TASK [shelldir : debug] ****************************************************************************************************************************************************************************************************************
ok: [127.0.0.1] => {
"shellout2.stdout": "/code/roles/shelldir"
}
PLAY RECAP *****************************************************************************************************************************************************************************************************************************
127.0.0.1 : ok=4 changed=2 unreachable=0 failed=0
当前角色的工作目录不是role_path
。以我为例,调用任务的是剧本的角色。对于包含在不同目录中的剧本或任务文件,情况可能会有所不同(如果您愿意,我会把它留作练习)。我将执行设置为从/tmp
开始运行,因此我认为运行ansible-playbook
的shell的当前工作目录无关紧要。
答案 1 :(得分:1)
Shell将在遥控器上执行命令。您已将脚本复制到遥控器上的/home/vagrant/install-watchman.bash
。因此,您也必须使用该位置在远程上执行。
- name: install Watchman
shell: /home/vagrant/install-watchman.bash
如果您的烦恼用户是“无聊”用户,则相对路径也将起作用
- name: install Watchman
shell: install-watchman.bash
旁注:
我建议尽可能使用command
代替shell
:shell vs command Module