期待dict;得到:shell:错误

时间:2016-05-10 13:51:36

标签: yaml ansible ansible-playbook

我收到以下错误

ERROR: expecting dict; got: shell:"ls /mule/ansiple/mule-enterprise-standalone-3.4.1/*.txt" register:the_file
  1. 我想检查文件夹是否存在。

  2. 如果存在,我需要指定一些路径/ mule / acc

  3. 如果路径不存在则需要指向/ mule / bcc

  4. 以下是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"
    

2 个答案:

答案 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"