Как выполнить команду, определенную в удаленном файле с ansible? - PullRequest
0 голосов
/ 09 января 2020

Теперь на удаленном хосте есть file:/root/.c, который определяет следующую команду псевдонима:

alias d="mysql -hxxxx -P3306 -uroot  --default-character-set=utf8 db2"

Затем на локальном хосте я выполняю:

ansible 10.10.130.30 -m shell -a "source /root/.c && d -e 'show databases;'"
10.10.130.30 | FAILED | rc=127 >>
/bin/sh: d: command not foundnon-zero return code

Как ansible может выполнить команду d?

1 Ответ

0 голосов
/ 09 января 2020

Псевдонимы не раскрываются в неинтерактивной оболочке .

Псевдонимы действительно предназначены только для удобства интерактивных сеансов. Если вы хотите упростить выполнение неинтерактивных соединений, таких как Ansible, длинной командой, просто поместите ее в сценарий оболочки. Например, сделайте /root/connect-to-db.sh со следующим содержимым:

#!/bin/sh
mysql -hxxxx -P3306 -uroot --default-character-set=utf8 db2 "$@"

Сделайте его исполняемым (chmod 755 connect-to-db.sh), а затем выполните команду ansible следующим образом:

ansible 10.10.130.30 -m command -a "/root/connect-to-db.sh -e 'show databases'"

Если вам действительно нужно расширение псевдонима для работы, вы можете выполнить sh то, что вы хотите, с помощью следующего playbook:

---
- hosts: 10.10.130.30
  gather_facts: false
  tasks:
    - shell: |
        shopt -s expand_aliases
        . /root/.c
        d
      register: output

    - debug:
        msg: "{{ output.stdout_lines }}"

Это не будет работать с ad-ho c ansible команда, потому что псевдонимы не доступны в той же строке или в той же функции, где они определены . Нам нужен многострочный сценарий оболочки, чтобы команда shopt вступила в силу до получения /root/.c.

...