LINUX.ORG.RU
ФорумAdmin

Как в Ansible выполнить локальную команду для хоста оркестратора?

 , ,


0

2

Есть хост, на котором я запускаю ansible.

Я хочу написать задачу в плейбуке, которая бы запускала команду локально, без подключения через SSH.

Говоря точнее, мне нужно сделать задачу, которая запускала бы виртуальные машины VirtualBox. И сделать это нужно в текущей сессии пользователя, под которым и запускается команда ansible-playbook.

Если делать через модуль local_action, вот так:

local_action: command cmd='cd {{vm_images_path}} ; cd ./arm1/ ; VBoxManage startvm "Debain Linux - arm1"'

то ansible все равно пытается подсоединиться через ssh, и выполнить команду в другой сессии. А мне надо выполнить команду в текущей сессии, чтобы я видел окна запущенных виртуальных машин.

Как это сделать?

★★★★★

ansible-playbook --connection=local 127.0.0.1 playbook.yml

using inventory:

127.0.0.1 ansible_connection=local

using Ansible configuration file:

[defaults] transport = local

using playbook header:

- hosts: 127.0.0.1 connection: local

anonymous
()
Ответ на: комментарий от anonymous

Вроде стал соединяться напрямую. Но выполнить команду не могу.

Кусок плейбука с хелловердом:

  - name: Run virtual mashine
    local_action: command "echo Hello"

Ошибка:
TASK [Run virtual mashine] ************************
fatal: [surfinux -> localhost]: FAILED! => {"changed": false, "cmd": "'echo Hello'", "failed": true, "msg": "[Errno 2] Нет такого файла или каталога", "rc": 2}

Смотрю документацию вот здесь:

https://docs.ansible.com/ansible/latest/modules/command_module.html#command-m...

Вроде все должно работать, но не работает.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Netzschlange

Попробуйте delegate_to: localhost вместо local_action.

Попробовал так:

  - name: Run virtual mashine
    delegate_to: localhost
    command: "cat /etc/hosts"

Результат:
TASK [Run virtual mashine] ************************
changed: [surfinux -> localhost]
        to retry, use: --limit @./retry-files/step0000-startVM.plb.retry
Ошибки нету, но результата действия не вижу.

Чтобы увидеть хоть какое-то действие, меняю команду так, чтобы создавался файл:
    command: "cat /etc/hosts > /tmp/hosts.tmp.file"

И имею ошибку:

TASK [Run virtual mashine] ************************
fatal: [surfinux -> localhost]: FAILED! => {"changed": true, "cmd": ["cat", "/etc/hosts", ">", "/tmp/hosts.tmp.file"], "delta": "0:00:00.001897", "end": "2019-11-28 09:23:51.357019", "failed": true, "rc": 1, "start": "2019-11-28 09:23:51.355122", "stderr": "cat: '>': Нет такого файла или каталога\ncat: /tmp/hosts.tmp.file: Нет такого файла или каталога", "stdout": "127.0.0.1\tlocalhost\n192.168.0.95\tsurfinux.workgroup\tsurfinux\n\n# The following lines are desirable for IPv6 capable hosts\n::1     localhost ip6-localhost ip6-loopback\nff02::1 ip6-allnodes\nff02::2 ip6-allrouters", "stdout_lines": ["127.0.0.1\tlocalhost", "192.168.0.95\tsurfinux.workgroup\tsurfinux", "", "# The following lines are desirable for IPv6 capable hosts", "::1     localhost ip6-localhost ip6-loopback", "ff02::1 ip6-allnodes", "ff02::2 ip6-allrouters"], "warnings": []}

Xintrea ★★★★★
() автор топика

Ansible command vs shell

  • command — выполнит команду, не поддерживает перенаправления, glob (символы-джокеры) и прочее;
  • shell — полноценный интерпретатор;

+ запускайте ansible с -vvv, смотрите что и где он в реальности делает.

LeNiN ★★
()
Последнее исправление: LeNiN (всего исправлений: 1)
Ответ на: комментарий от Xintrea

Смотрю документацию вот здесь:

и там написано:

The command(s) will not be processed through the shell, so variables like $HOME and operations like «<», «>», «|», ";" and «&» will not work. Use the shell module if you need these features.

Что означает, что переменные окружения не настроены и поэтому нужно указывать полные пути к файлам, как к исполняемому так и к используемым.

Netzschlange
()

Вот, гифку спецом снял.
Тебе такой результат нужен?
P.S. На Warning не обращай внимания. Ubuntu с флешки запустил.

https://gfycat.com/temptingunsteadyamericanquarterhorse

Если, да - то у меня

- name: Test
  hosts: localhost
  gather_facts: no

  tasks:
  - name: Test
    shell: 'nautilis &'

i3wm
()
Последнее исправление: i3wm (всего исправлений: 1)
Ответ на: комментарий от Xintrea

Именно в варианте

local_action: command "echo Hello"  

Получал ошибку, а вот в след:

local_action: "command echo Hello" 

Вроде не получал, сейчас точно не скажу, нету Ansible под рукой)

i3wm
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.