使用 Ansible 命令模块时文件名太长
file name too long when using Ansible command module
我正在尝试使用 ansible 的 chef habitat 安装 chef automate。
这里是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 }}'"
但出现错误:
TASK [deploy chef-automatev2]
***************************************************************************fatal: [10.1.1.2]: FAILED! => {"changed": true, "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}]"],
"delta": "0:00:00.026909", "end": "2018-10-30 06:48:00.362616", "msg":
"non-zero return code", "rc": 94, "start": "2018-10-30
06:48:00.335707", "stderr": "Error: DeployError: Unable to install,
configure and start the service: Failed to unpack airgap artifact:
Failed to open install bundle file /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}]: 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: 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 name too long",
"stderr_lines": ["Error: DeployError: Unable to install, configure and
start the service: Failed to unpack airgap artifact: Failed to open
install bundle file /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}]: 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: 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 name too long"], "stdout":
"\nInstalling artifact", "stdout_lines": ["", "Installing artifact"]}
如果我使用:
- name: deploy chef-automatev2
command: "chef-automate deploy config.toml --accept-terms-and-mlsa --skip-preflight --airgap-bundle {{ file_automate.files }}"
我得到错误:
TASK [deploy chef-automatev2]
**************************************************************************** fatal: [10.1.1.20]: FAILED! => {"changed": true, "cmd":
["chef-automate", "deploy", "config.toml", "--accept-terms-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": "non-zero return code", "rc": 113, "start":
"2018-10-30 07:19:41.273593", "stderr": "Error: UnknownError: accepts
between 0 and 1 arg(s), received 62", "stderr_lines": ["Error:
UnknownError: accepts between 0 and 1 arg(s), received 62"], "stdout":
"", "stdout_lines": []} to retry, use: --limit
@/home/ec2-user/ANSIBLE/clusterOps/roles/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}}"
感谢马修
我得到剧本 运行:
TASK [deploy chef-automatev2] *************************************************************************
ok: [1.1.1.17] => (item=/home/ec2-user/automate-20181019225406.aib) => {
"msg": "printing aib filename"
}
现在的问题是如何在 "command" 或 "shell" ansible 模块中使用这个对象
以下是我如何解决在 shell 命令中使用对象的问题:
- 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}}"
如果您阅读错误消息,您会看到 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
中该对象的字段已经完全限定。
我正在尝试使用 ansible 的 chef habitat 安装 chef automate。
这里是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 }}'"
但出现错误:
TASK [deploy chef-automatev2] ***************************************************************************fatal: [10.1.1.2]: FAILED! => {"changed": true, "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}]"], "delta": "0:00:00.026909", "end": "2018-10-30 06:48:00.362616", "msg": "non-zero return code", "rc": 94, "start": "2018-10-30 06:48:00.335707", "stderr": "Error: DeployError: Unable to install, configure and start the service: Failed to unpack airgap artifact: Failed to open install bundle file /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}]: 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: 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 name too long", "stderr_lines": ["Error: DeployError: Unable to install, configure and start the service: Failed to unpack airgap artifact: Failed to open install bundle file /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}]: 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: 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 name too long"], "stdout": "\nInstalling artifact", "stdout_lines": ["", "Installing artifact"]}
如果我使用:
- name: deploy chef-automatev2
command: "chef-automate deploy config.toml --accept-terms-and-mlsa --skip-preflight --airgap-bundle {{ file_automate.files }}"
我得到错误:
TASK [deploy chef-automatev2] **************************************************************************** fatal: [10.1.1.20]: FAILED! => {"changed": true, "cmd": ["chef-automate", "deploy", "config.toml", "--accept-terms-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": "non-zero return code", "rc": 113, "start": "2018-10-30 07:19:41.273593", "stderr": "Error: UnknownError: accepts between 0 and 1 arg(s), received 62", "stderr_lines": ["Error: UnknownError: accepts between 0 and 1 arg(s), received 62"], "stdout": "", "stdout_lines": []} to retry, use: --limit @/home/ec2-user/ANSIBLE/clusterOps/roles/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}}"
感谢马修 我得到剧本 运行:
TASK [deploy chef-automatev2] *************************************************************************
ok: [1.1.1.17] => (item=/home/ec2-user/automate-20181019225406.aib) => {
"msg": "printing aib filename"
}
现在的问题是如何在 "command" 或 "shell" ansible 模块中使用这个对象
以下是我如何解决在 shell 命令中使用对象的问题:
- 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}}"
如果您阅读错误消息,您会看到 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
中该对象的字段已经完全限定。