"dest must be an existing dir " Ansible 中的错误

"dest must be an existing dir " error in Ansible

我正在尝试在 AWS ec2 实例中使用 ansible 自动安装 grafana apache_exporter。在尝试 运行 ansible 剧本时,我收到错误:"dest must be an existing dir "。谁能帮我解决这些问题。

---
- hosts: webservers
  remote_user: ubuntu
  become: yes
  vars:
    apache_exporter_version: 0.8.0
  tasks:
    - name: create group
      group:
        name: apache_exporter
        state: present
    - name: create user
      user:
        name: apache_exporter
        group: apache_exporter
        createhome: no
        system: yes
        state: present
    - name: create opt directory for prometheus
      file:
        path: /opt/apache_exporter
        state: directory
    - name: download apache exporter
      get_url:
         url: https://github.com/Lusitaniae/apache_exporter/releases/download/v{{ apache_exporter_version }}/apache_exporter-{{ apache_exporter_version }}.linux-amd64.tar.gz
        dest: /opt/apache_exporter
    - name: unarchive apache exporter
      unarchive:
        remote_src: yes
        src: /opt/apache_exporter/apache_exporter-{{ apache_exporter_version }}.linux-amd64.tar.gz
        dest: /opt/apache_exporter
        creates: /opt/apache_exporter/apache_exporter-{{ apache_exporter_version }}.linux-amd64  
    - name: create symlink to apache exporter
       file:
        path: /usr/local/bin/apache_exporter
        state: link
        src: /opt/apache_exporter/apache_exporter-{{ apache_exporter_version }}.linux-amd64/apache_exporter
    - name: install unit file to systemd
      template:
        src: apache_exporter.service
        dest: /etc/systemd/system/apache_exporter.service
    - name: configure systemd to use service
      systemd:
        daemon_reload: yes
        enabled: yes
        state: started
        name: apache_exporter.service

如错误所说,在Ansible unarchive模块中,dest参数设置的路径必须存在。如果不存在则需要创建。

另一个问题在你的 download apache exporter 任务中,你正在将文件下载到 /opt/apache_exporter 这是一个文件,但使用与 dest 相同的路径用于 unarchive任务。

您需要为这些路径使用单独的名称并预先创建目录。以下剧本应该可以解决您的问题。

- name: download apache exporter
  get_url:
    url: https://github.com/Lusitaniae/apache_exporter/releases/download/v{{ apache_exporter_version }}/apache_exporter-{{ apache_exporter_version }}.linux-amd64.tar.gz
    dest: /opt/apache_exporter.tar.gz
- name: create /opt/apache_exporter directory for unarchiving
  file:
    path: /opt/apache_exporter
    state: directory
- name: unarchive apache exporter
  unarchive:
    remote_src: yes
    src: /opt/apache_exporter/apache_exporter-{{ apache_exporter_version }}.linux-amd64.tar.gz
    dest: /opt/apache_exporter
    creates: /opt/apache_exporter/apache_exporter-{{ apache_exporter_version }}.linux-amd64

问题出现是因为我正在 运行宁干 运行 测试 "ansible-playbook --check" 参数,显然是因为文件模块没有在远程系统中创建目录。还解决了@sakibmoon

提到的 "download apache exporter" 部分中的问题
---
- hosts: webservers
  remote_user: ubuntu
  become: yes
  vars:
    apache_exporter_version: 0.8.0
  tasks:
    - name: create group
      group:
        name: apache_exporter
        state: present
    - name: create user
      user:
        name: apache_exporter
        group: apache_exporter
        createhome: no
        system: yes
        state: present
    - name: create opt directory for prometheus
      file:
        path: /opt/apache_exporter
        state: directory
    - name: download apache exporter
      get_url:
        url: https://github.com/Lusitaniae/apache_exporter/releases/download/v{{ apache_exporter_version }}/apache_exporter-{{ apache_exporter_version }}.linux-amd64.tar.gz
        dest: /opt/apache_exporter/apache_exporter-{{ apache_exporter_version }}.linux-amd64.tar.gz
    - name: unarchive apache exporter
      unarchive:
        remote_src: yes
        src: /opt/apache_exporter/apache_exporter-{{ apache_exporter_version }}.linux-amd64.tar.gz
        dest: /opt/apache_exporter
    - name: create symlink to apache exporter
      file:
        path: /usr/local/bin/apache_exporter
        state: link
        src: /opt/apache_exporter/apache_exporter-{{ apache_exporter_version }}.linux-amd64/apache_exporter
    - name: install unit file to systemd
      template:
        src: apache_exporter.service
        dest: /etc/systemd/system/apache_exporter.service
    - name: configure systemd to use service
      systemd:
        daemon_reload: yes
        enabled: yes
        state: started
        name: apache_exporter.service