我收到以下错误
ERROR: expecting dict; got: shell:"ls /mule/ansiple/mule-enterprise-standalone-3.4.1/*.txt" register:the_file
我想检查文件夹是否存在。
如果存在,我需要指定一些路径/ mule / acc
如果路径不存在则需要指向/ mule / bcc
以下是ansible playbook
---
# get name of the .txt file
- stat: path=/mule/ansiple/mule-enterprise-standalone-3.4.1
register:the_file
when: the_file.stat.exists == True
- shell:"ls /mule/ansiple/mule-enterprise-standalone-3.4.1/*.txt"
register:the_file
- debug: msg="{{ the_file }}"
- set_fact: app_folder="{{ the_file.stdout | replace('-anchor.txt','') }}"
- debug: msg="{{ app_folder }}"
- debug: msg="{{ the_file.stdout }}"
# delete the .txt file
- name: Delete the anchor.txt file
file: path="{{ the_file.stdout }}" state=absent
# wait until the app folder disappears
- name: Wait for the folder to disappear
wait_for: path="{{ app_folder }}" state=absent
# copy the zip file
- name: Copy the zip file
copy: src="../p" dest="/c"
答案 0 :(得分:1)
您需要学习YAML语法。每次冒号后,您都需要添加一个空格。该消息来自YAML解析器,告诉您它需要一个字典:
key1: value1
key2: value2
相反,它找不到键值对:
key1:value1
特别是它抱怨这一行:
- shell:"ls /mule/ansiple/mule-enterprise-standalone-3.4.1/*.txt"
应该是
- shell: "ls /mule/ansiple/mule-enterprise-standalone-3.4.1/*.txt"
但是你在另外两行看起来有同样的问题:
register:the_file
应该是:
register: the_file
如果有疑问错误来自Ansible任务或仅仅来自YAML解析错误,请将您的YAML定义粘贴到任何online YAML parser。
格式太多了。现在解决逻辑问题:
- stat: path=/mule/ansiple/mule-enterprise-standalone-3.4.1
register: the_file
when: the_file.stat.exists == True
除非您已从之前未显示的任务中注册the_file
,否则无法使用。 when
是决定是否应该运行任务的条件。您无法根据其结果执行任务。首先必须在结果可用之前运行。在评估条件时,the_file
根本不存在,这会导致错误,抱怨无对象没有密钥stat
或类似的东西
然后在下一个任务中,您再次使用相同的名称注册结果。
- shell: "ls /mule/ansiple/mule-enterprise-standalone-3.4.1/*.txt"
register: the_file
这只会覆盖以前的注册结果。也许你的意思是从第一个任务到第二个任务的条件。但即使这样也行不通。结果仍将从跳过的任务中注册,只是说明已跳过任务。您需要将结果存储在唯一的变量中,或者在单个任务中检查所有可能的文件位置。
清理你的剧本会是这样的:
---
# get name of the .txt file
- stat:
path: /mule/ansiple/mule-enterprise-standalone-3.4.1
register: the_file
when: the_file.stat.exists
- shell: ls /mule/ansiple/mule-enterprise-standalone-3.4.1/*.txt
register: the_file
- debug:
msg: "{{ the_file }}"
- set_fact:
app_folder: "{{ the_file.stdout | replace('-anchor.txt','') }}"
- debug:
msg: "{{ app_folder }}"
- debug:
msg: "{{ the_file.stdout }}"
- name: Delete the anchor.txt file
file:
path: "{{ the_file.stdout }}"
state: absent
- name: Wait for the folder to disappear
wait_for:
path: "{{ app_folder }}"
state: absent
- name: Copy the zip file
copy:
src: ../analytic-core-services-mule-3.0.0-SNAPSHOT.zip
dest: /mule/ansiple/mule-enterprise-standalone-3.4.1
...
答案 1 :(得分:1)
您几乎拥有YAML权限,但您的文件中存在一个YAML错误,该错误就行了:
register:the_file
因为前面的行开始了顶层序列的第一个元素作为映射,通过定义一个基于冒号的键值对(' :
')后跟空格,标量(或序列)之后不能跟随。 如果该文件是您的输入,那么YAML解析器会出现语法错误,部分消息如下所示:
register:the_file
^
could not find expected ':'
此:
- shell:"ls /mule/ansiple/mule-enterprise-standalone-3.4.1/*.txt"
register:the_file
是非常好的YAML。它将顶级序列的第二个元素定义为标量字符串:
shell:"ls /mule/ansiple/mule-enterprise-standalone-3.4.1/*.txt" register:the_file
(你可以在YAML中打破多行上的标量字符串)。
现在ansible并不喜欢这样,并且期望该元素以及可能所有顶级序列元素都是映射。对于映射,您需要有一个键值对,它与(register:the_file
)由YAML中的冒号空格字符对分隔/指示。所以ansible(不是YAML)可能想要:
shell: ls /mule/ansiple/mule-enterprise-standalone-3.4.1/*.txt
register: the_file
请注意,在YAML中,标量值ls /mule/ansiple/mule-enterprise-standalone-3.4.1/*.txt
周围的引号是不必要的。
可能还有其他东西可以从文件的结构中得到什么,但我会从上面的更改开始,看看ansible是否会引发更多错误:
# get name of the .txt file
- stat: path=/mule/ansiple/mule-enterprise-standalone-3.4.1
register: the_file
when: the_file.stat.exists == True
- shell: ls /mule/ansiple/mule-enterprise-standalone-3.4.1/*.txt
register: the_file
- debug: msg="{{ the_file }}"
- set_fact: app_folder="{{ the_file.stdout | replace('-anchor.txt','') }}"
- debug: msg="{{ app_folder }}"
- debug: msg="{{ the_file.stdout }}"
# delete the .txt file
- name: Delete the anchor.txt file
file: path="{{ the_file.stdout }}" state=absent
# wait until the app folder disappears
- name: Wait for the folder to disappear
wait_for: path="{{ app_folder }}" state=absent
# copy the zip file
- name: Copy the zip file
copy: src="../analytic-core-services-mule-3.0.0-SNAPSHOT.zip" dest="/mule/ansiple/mule-enterprise-standalone-3.4.1"