Ansible играть, чтобы загрузить файл ftp, используя lftp - PullRequest
0 голосов
/ 04 апреля 2020

Я установил ftp-сервер, используя ansible, и проверил, работает ли он вручную, выполнив lftp с моего локального хоста.

Я загрузил файл с помощью put и смог найти файл на ftp-сервере, когда я сделал ls.

Я написал пьесу для загрузки файла на FTP-сервер, и она всегда возвращалась успешно. Однако я не могу найти файл, который я загрузил, используя мою игру. Затем я отредактировал свою игру для отображения регистра результатов и нашел предупреждение. См. Ниже

---
- name: test ftp upload
  hosts: localhost
  tasks:
    - name: install lftp
      yum:
        name: lftp
    - name: upload file
      shell: >
        lftp ansible1.example.com<<EOF
        cd pub
        put /etc/hosts
        bye
        EOF
      register: result

    - name: display result
      debug:
        var: result

Ниже приведен вывод, полученный после запуска воспроизведения

PLAY [test ftp upload] ****************************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************************
ok: [localhost]

TASK [install lftp] *******************************************************************************************************************************************************************
ok: [localhost]

TASK [upload file] ********************************************************************************************************************************************************************
changed: [localhost]

TASK [display result] *****************************************************************************************************************************************************************
ok: [localhost] => {
    "result": {
        "changed": true,
        "cmd": "lftp ansible1.example.com<<EOF cd pub put /etc/hosts bye EOF\n",
        "delta": "0:00:00.010150",
        "end": "2020-04-04 09:15:26.305530",
        "failed": false,
        "rc": 0,
        "start": "2020-04-04 09:15:26.295380",
        "stderr": "/bin/sh: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')",
        "stderr_lines": [
            "/bin/sh: warning: here-document at line 0 delimited by end-of-file (wanted `EOF')"
        ],
        "stdout": "",
        "stdout_lines": []
    }
}

PLAY RECAP ****************************************************************************************************************************************************************************
localhost                  : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Я не могу понять предупреждение в части EOF, и если это является причиной загрузки файла не происходит. Потому что я использую приведенный ниже скрипт оболочки (который в основном такой же, как и в игре) для загрузки файла, и он отлично работает.

lftp ansible1.example.com<<EOF
cd pub
put /etc/hosts
bye
EOF

1 Ответ

1 голос
/ 04 апреля 2020

Вы использовали неверный индикатор стиля скалярного блока (см. документация ) для своей команды оболочки.

Вам необходимо сохранить новые строки в своем фрагменте кода оболочки. В этом случае вы должны использовать буквенный индикатор скалярного блока: |

Вы использовали свернутый индикатор скалярного блока (>), который в основном преобразует новые строки в пробелы (хотя это немного более сложный, как объяснено в этом другом источнике ). Таким образом, ваш текущий фрагмент кода оболочки расширяется до одной строки в вашей оболочке (вы можете отладить значение, чтобы убедиться в этом):

lftp ansible1.example.com<<EOF cd pub put /etc/hosts bye EOF

Следующее должно решить вашу текущую проблему:

    - name: upload file
      shell: |
        lftp ansible1.example.com<<EOF
        cd pub
        put /etc/hosts
        bye
        EOF
      register: result
...