首页 > 解决方案 > ansible-playbook 中的语法错误在哪里?

问题描述

我在使用 ansible-playbook 时遇到了一些(愚蠢的)问题。我不明白错误是因为语法错误,但另一个类似的剧本已经成功执行,而这个没有。

ERROR! 'copy' is not a valid attribute for a Play

The error appears to have been in '/home/manu/monitorizacion/node-exporter/playbooks/deploy-node-exporter.yml': line 2, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

---
- name: Upload project directory to '{{ docker_home }}'
  ^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes.  Always quote template expression brackets when they
start a value. For instance:

    with_items:
      - {{ foo }}

Should be written as:

    with_items:
      - "{{ foo }}"

问题是我有一个带有 2 个 include_tasks 的(install.yml)剧本

---
- hosts: wargame
 vars:
     project_home: ../../node-exporter/
     scripts_dir: /home/docker/node-exporter/textfile-collector/
     docker_home: /home/docker/node-exporter/
 tasks:
   - include_tasks: packages.yml
   - include_tasks: deploy-node-exporter.yml

packages.yml 很好,执行没有问题

---
- name: Instalar paquetes requeridos para Docker e instalación
  apt:
    update_cache: true
    name: "{{ packages }}"
  vars:
    packages:
      - lsb-core
      - apt-transport-https
      - ca-certificates
      - curl
      - gnupg2
      - python-setuptools
      - python-pip
      - git
      - smartmontools
- name: Instalar clave Docker
  apt_key:
    url: https://download.docker.com/linux/debian/gpg
- name: Instalar repositorio Docker
  apt_repository:
    repo: "deb [arch=amd64] https://download.docker.com/linux/debian {{ ansible_lsb.codename }} stable"
- name: Actualizar listado de paquetes
  apt:
    update_cache: yes
- name: Instalar Docker
  apt:
    name: docker-ce
- name: Instalar Docker-compose
  pip:
    name: docker-compose
- name: Grupo docker
  group:
    name: docker
    state: present
- name: Usuario docker
  user:
    name: docker
    group: docker

如您所见,最后执行的任务是“Usuario docker”

ok: [188.166.52.222] => {"append": false, "changed": false, "comment": "", "group": 998, "home": "/home/docker", "move_home": false, "name": "docker", "shell": "", "state": "present", "uid": 1002}

TASK [include_tasks] *****************************************************************************************************************************
fatal: [188.166.52.222]: FAILED! => {"reason": "no action detected in task. This often indicates a misspelled module name, or incorrect module path.\n\nThe error appears to have been in '/home/manu/monitorizacion/node-exporter/playbooks/deploy-node-exporter.yml': line 24, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n    mode: '0755'\n- name: Deploy node-exporter\n  ^ here\n"}

现在错误出现在 deploy-node-exporter.yml 但语法与 install.yml 相同

---
- name: Upload project directory to '{{ docker_home }}'
  copy: 
    src: "{{ project_home }}"
    dest: "{{ docker_home }}"
    directory_mode: yes
    follow: yes
    owner: docker
    group: docker
- name: Fix perms for dirs
  file:
    path: "{{ item }}"
    state: touch
    mode: '0755'
  with_items:
    - "{{ docker_home }}"
    - "{{ docker_home }}/textfile-collector"
    - "{{ docker_home }}/playbooks"
- name: Give exec perms to smartmon.sh
  file:
    path: "{{ scripts_dir }}/smartmon.sh"
    state: touch
    mode: '0755'
- name: Deploy node-exporter
  docker_compose:
    project_src: "{{ docker_home }}"
    build: no
    state: present
    recreate: always
  register: output
- name: Creates cron entry for smartmon.sh
  cron:
    name: Cron job for collecting smartctl stats
    minute: "*/15"
    user: root
    job: "{{ scripts_dir }}/smartmon.sh > {{ scripts_dir }}/smartmon.prom"

或者我是盲人,因为我无法找到语法错​​误,或者我认为这是一个可靠的问题

我当前安装的版本

ansible 2.7.7
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.7.3 (default, Apr  3 2019, 05:39:12) [GCC 8.3.0]

- - 更新 - -

我已将所有内容放在一个文件中

---
- hosts: myServer
  vars:
      project_home: ../../node-exporter/
      scripts_dir: /home/docker/node-exporter/textfile-collector/
      docker_home: /home/docker/node-exporter/
  tasks:
    - name: Instalar paquetes requeridos para Docker e instalación
      apt:
        update_cache: true
        name: "{{ packages }}"
      vars:
        packages:
         - lsb-core
          - apt-transport-https
          - ca-certificates
          - curl
          - gnupg2
          - python-setuptools
          - python-pip
          - git
          - smartmontools
    - name: Instalar clave Docker
      apt_key:
        url: https://download.docker.com/linux/debian/gpg
    - name: Instalar repositorio Docker
      apt_repository:
       repo: "deb [arch=amd64] https://download.docker.com/linux/debian {{ ansible_lsb.codename }} stable"
    - name: Actualizar listado de paquetes
      apt:
        update_cache: yes
    - name: Instalar Docker
      apt:
        name: docker-ce
    - name: Instalar Docker-compose
      pip:
        name: docker-compose
    - name: Grupo docker
      group:
        name: docker
        state: present
    - name: Usuario docker
      user:
        name: docker
        group: docker
    - name: Upload project directory to '{{ docker_home }}'
      copy: 
        src: "../../node-exporter/"
        dest: "/home/docker/node-exporter/"
        directory_mode: yes
        follow: yes
        owner: docker
        group: docker
    - name: Fix perms for dirs
      file:
       path: "{{ item }}"
       state: touch
       mode: "0755"
      with_items:
        - "/home/docker/node-exporter/"
        - "/home/docker/node-exporter/textfile-collector"
        - "/home/docker/node-exporter/playbooks"
    - name: Give exec perms to smartmon.sh
      file:
       path: "{{ scripts_dir }}/smartmon.sh"
       state: touch
       mode: "0755"

    - name: Creating cron entry for smartmon.sh
      cron:
       name: Cron job for collecting smartctl stats
       minute: "*/15"
       user: root
       job: "{{ scripts_dir }}/smartmon.sh > {{ scripts_dir }}/smartmon.prom"

在这个文件中我删除了

    - name: Deploying node-exporter
      docker_compose:
       project_src: "{{ docker_home }}"
       build: no
       state: present
       recreate: always
      register: output

现在它可以工作了(没有这部分代码)

┌─[root@hippi3c0w] - [~manu/monitorizacion/node-exporter/playbooks] - [sáb ago 31, 20:59]
└─[$] <git:(master*)> ansible-playbook install_new.yml --syntax-check

playbook: install_new.yml

但是当我将此部分添加到 yaml 文件时问题又回来了,所以问题毫无疑问是以下部分

    - name: Deploying node-exporter
      docker_compose:
       project_src: "{{ docker_home }}"
       build: no
       state: present
       recreate: always
      register: output

你知道可能是什么问题吗?也许docker_compose?

- - 更新 - -

这是由于ansible版本。2.7 不支持 docker_compose 指令。更新到 2.8.4,现在它可以正常工作了。

PLAY RECAP ***************************************************************************************************************************************
[MyIP]            : ok=16   changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

┌─[root@hippi3c0w] - [~manu/monitorizacion/node-exporter/playbooks] - [dom sep 01, 08:34]
└─[$] <git:(master*)> ansible --version; ansible-playbook install.yml --syntax-check
ansible 2.8.4
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.16+ (default, Jul  8 2019, 09:45:29) [GCC 8.3.0]

playbook: install.yml

标签: syntaxansible

解决方案


JFYI

在我的 ansible 版本中可以复制

  tasks:
   - name: Test copy
     copy:
      src: "/home/manu/test"
      dest: "/home/user"
      follow: yes
      owner: user
      group: user
      mode: 0755 
└─[$] <git:(master*)> ansible-playbook test.yaml --syntax-check

playbook: test.yaml
┌─[root@hippi3c0w] - [~manu/monitorizacion/node-exporter/playbooks] - [sáb ago 31, 20:33]
└─[$] <git:(master*)> ansible-playbook test.yaml -u user -v   
Using /etc/ansible/ansible.cfg as config file
/etc/ansible/hosts did not meet host_list requirements, check plugin documentation if this is unexpected
/etc/ansible/hosts did not meet script requirements, check plugin documentation if this is unexpected

PLAY [myserver] ***********************************************************************************************************************************

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

TASK [Test copy] *********************************************************************************************************************************
changed: [myIP] => {"changed": true, "checksum": "55ca6286e3e4f4fba5d0448333fa99fc5a404a73", "dest": "/home/user/test", "gid": 1001, "group": "user", "mode": "0755", "owner": "user", "path": "/home/user/test", "size": 3, "state": "file", "uid": 1001}

PLAY RECAP ***************************************************************************************************************************************
myIP             : ok=2    changed=1    unreachable=0    failed=0   

推荐阅读