Слишком длинное имя файла при использовании командного модуля Ansible

Я пытаюсь установить автоматизацию шеф-повара, используя среду обитания шеф-повара с ansible.

вот соответствующий раздел main.yml

- name: get aib filename
    find:
      paths: /home/ec2-user
      file_type: file
      use_regex: yes
      patterns:
        - '^automate.*'
    register: file_automate

  - name: deploy chef-automatev2
    command: "sudo chef-automate deploy '/home/ec2-user/config.toml' --accept-terms-and-mlsa --skip-preflight --airgap-bundle '/home/ec2-user/{{ file_automate.files }}'"

но получаю ошибку:

ЗАДАЧА [развернуть chef-automatev2] *************************************************************************** фатально: [10.1.1.2]: СБОЙ! => {"updated": true, "cmd": ["sudo", "chef-automate", "deploy", "/home/ec2-user/config.toml", "--accept-rules-and-mlsa", "--skip-preflight", "--airgap-bundle", "/home/ec2-user/[{uuid: 0, uwoth: False, umtime: 1540882069.3233995, uinode: 82, uisgid: False, usize: 605693959, uisuid: False, uisreg: True, upw_name: uroot, ugid: 0, uischr: False, uwusr: True, uxoth: False, uislnk: False, unlink: 1, uissock: False, urgrp: True, ugr_name: uot, upath: u/home/ec2-user/automate-20181020020209.aib, uxusr: False, uatime: 1540882068.8493989, uisdir: False, uctime: 1540882074.7854095, uisblk: False, uwgrp: False, uxgr u68: False: True, uisfifo: False, umode: u0644, urusr: True}]"], "delta": "0:00:00.026909", "end": "2018-10-30 06:48:00.362616", "msg": " ненулевой код возврата ", "rc": 94, "start": "2018-10-30 06:48:00.335707", "stderr": " Ошибка: DeployError: Невозможно установить, настроить и запустить service: не удалось распаковать артефакт airgap: не удалось открыть файл комплекта установки / home / ec 2 пользователя /[{uuid: 0, uwoth: False, umtime: 1540882069.3233995, uinode: 82, uisgid: False, usize: 605693959, uisuid: False, uisreg: True, upw_name: uroot, ugid: 0, uischr: False, uwusr: True, uxoth: False, uislnk: False, unlink: 1, uissock: False, urgrp: True, ugr_name: uroot, upath: u/home/ec2-user/automate-20181020020209.aib, uxusr: False, uatime: 1540882068.8493989, uisdir: False, uctime: 1540882074.7854095, uisblk: False, uwgrp: False, uxgrp: False, udev: 64768, uroth: True, uisfifo: False, umode: u0644, urusr: true]} user/[{uuid: 0, uwoth: False, umtime: 1540882069.3233995, uinode: 82, uisgid: False, usize: 605693959, uisuid: False, uisreg: True, upw_name: uroot, ugid: 0, uischr: False, uwusr: True, uxoth: False, uislnk: False, unlink: 1, uissock: False, urgrp: True, ugr_name: uroot, upath: u/home/ec2-user/automate-20181020020209.aib, uxusr: False, uatime: 1540882068.8493989, uisdir: False, uctime: 1540882074.7854095, uisblk: False, uwgrp: False, uxgrp: False, udev: 64768, uroth: True, uisfifo: False, umode: u0644, urusr: True}]: имя файла слишком длинное ", "stderr_lines": [" Ошибка: DeployError: Невозможно установить, настроить и запустить службу: не удалось распаковать воздушную пробку Артефакт: не удалось открыть файл комплекта установки / home / ec2-user / [{uuid: 0, uwoth: False, umtime: 1540882069.3233995, uinode: 82, uisgid: False, использование: 605693959, uisuid: False, uisreg: True, upw_name: uroot, ugid: 0, uischr: False, uwusr: True, uxoth: False, uislnk: False, unlink: 1, uissock: False, urgrp: True, ugr_name: uroot, upath: u / home / ec2-user / automate -20181020020209.aib, uxusr: Ложь, uatime: +1540882068,8493989, uisdir: Ложь, uctime: +1540882074,7854095, uisblk: Ложь, uwgrp: Ложь, uxgrp: Ложь, Udev: 64768, uroth: Правда, uisfifo: ЛОЖЬ, режим пользователя: u0644, urusr: True}]: open /home/ec2-user/[{uuid: 0, uwoth: False, umtime: 1540882069.3233995, uinode: 82, uisgid: False, usize: 605693959, uisuid: False, uisreg: True, upw_name: uroot ugid: 0, uischr: False, uwusr: True, uxoth: False, uislnk: F alse, unlink: 1, uissock: False, urgrp: True, ugr_name: uroot, upath: u / home / ec2-user / automate-20181020020209.aib, uxusr: False, uatime: 1540882068.8493989, uisdir: False, uctime.7: 1540952074 uisblk: False, uwgrp: False, uxgrp: False, udev: 64768, uroth: True, uisfifo: False, umode: u0644, urusr: True}]: имя файла слишком длинное "], "stdout": "\n Установка артефакта ", "stdout_lines": ["", "Установка артефакта"]}

и если я использую:

 - name: deploy chef-automatev2
    command: "chef-automate deploy config.toml --accept-terms-and-mlsa --skip-preflight --airgap-bundle {{ file_automate.files }}"

я получаю ошибку:

ЗАДАЧА [развернуть chef-automatev2] **************************************************************************** фатально: [10.1.1.20]: СБОЙ! => {"ified ": true," cmd ": [" chef-automate "," deploy "," config.toml", "--accept-term-and-mlsa", "--skip-preflight", "--airgap-bundle", "[{uuid:", "0,", "uwoth:", "False", "umtime:", "1540883970.2111344,", "uinode:", "83,", "uisgid:", "False", "usize:", "605693959,", "uisuid:", "False", "uisreg:", "True", "upw_name:", "uroot,", "ugid:", "0", "uischr:", "False", "uwusr:", "True", "uxoth:", "False", "uislnk:", "False", "unlink:", "1,", "uissock:", "False", "urgrp:", "True", "ugr_name:", "uroot", "upath:", "u/home/ec2-user/automate-20181020020209.aib,", "uxusr:", "False ", "uatime:", "1540883969.7361338,", "uisdir:", "False ", "uctime:", "1540883975.674141,", "uisblk:", "False ", "uwgrp:", "False ", "uxgrp:", "False ", "udev:", "64768,", "uroth:", "True,", "uisfifo:", "False ", "umode:", "u0644,", "urusr:", "True}]"], "delta": "0:00:00.014548", "end": "2018-10-30 07:19:41.288141", "msg": "ненулевой код возврата", "rc": 113, "start": "2018-10-30 07:19:41.273593", "stderr": " Эрро r: UnknownError: принимает от 0 до 1 arg(s), получено 62", "stderr_lines": [" Ошибка: UnknownError: принимает от 0 до 1 arg(s), получено 62"], "stdout": "", "stdout_lines": []}, чтобы повторить попытку, используйте: --limit @/home/ec2-user/ANSIBLE/clusterOps/role /chef-automatev2/defaults/main.retry

удалось получить элемент словаря:

- hosts: chefclusterautomatev2
  remote_user: ec2-user
  become: yes
  become_method: sudo
  connection: ssh
  gather_facts: true
  tasks:

  - name: get aib filename
    find:
      paths: /home/ec2-user
    register: res

  - name: deploy chef-automatev2
    debug:
      msg: printing aib filename
    with_items: "{{ res.files | map(attribute='path') | first}}"

Благодаря Мэтью я добираюсь в playbook run:

TASK [deploy chef-automatev2] *************************************************************************
ok: [1.1.1.17] => (item=/home/ec2-user/automate-20181019225406.aib) => {
    "msg": "printing aib filename"
}

Теперь вопрос в том, как использовать этот объект в "командных" или "оболочечных" модулях.

Вот как я решил вопрос об использовании объекта в команде оболочки:

- hosts: localhost
  remote_user: a3x52zz
  connection: ssh
  gather_facts: true
  tasks:

  - name: get aib filename
    find:
      paths: /Users/a3x52zz/ansible-test
      file_type: "file"
      patterns: "automate*.aib"
    register: files_matched
  - debug:
      msg: "{{files_matched.files[1].path}}"

  - name: cat filename
    command: cat "{{files_matched.files[1].path}}"

1 ответ

Решение

Если бы вы прочитали сообщение об ошибке, вы бы увидели, что file_automate.files не содержит список имен файлов, а содержит список объектов Python, вероятно, в результате вызова stat:

  "cmd": [
    "sudo",
    "chef-automate",
    "deploy",
    "/home/ec2-user/config.toml",
    "--accept-terms-and-mlsa",
    "--skip-preflight",
    "--airgap-bundle",
    "/home/ec2-user/[{uuid: 0, uwoth: False, umtime: 1540882069.3233995, uinode: 82, uisgid: False, usize: 605693959, uisuid: False, uisreg: True, upw_name: uroot, ugid: 0, uischr: False, uwusr: True, uxoth: False, uislnk: False, unlink: 1, uissock: False, urgrp: True, ugr_name: uroot, upath: u/home/ec2-user/automate-20181020020209.aib, uxusr: False, uatime: 1540882068.8493989, uisdir: False, uctime: 1540882074.7854095, uisblk: False, uwgrp: False, uxgrp: False, udev: 64768, uroth: True, uisfifo: False, umode: u0644, urusr: True}]"
  ],

Если вы хотите просто список имен файлов, {{ file_automate.files | map(attribute="path") | list }} должен дать вам это, хотя вы хотите опустить ведущий /home/ec2-user/ потому что, как видно, path поле этого объекта в files уже полностью квалифицирован.

Другие вопросы по тегам