Ansible-如何在相对路径上运行脚本

时间:2019-01-27 16:21:04

标签: ansible

我的问题是为什么我不能使用相对路径来指定要运行的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]

2 个答案:

答案 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代替shellshell vs command Module