簡體   English   中英

Ansible 使用 env_file 驗證 docker-compose 並發送到主機

[英]Ansible validate docker-compose with env_file and send to host

我創建了一個在模板文件夾中有兩個文件的角色: docker-compose.yml.j2env.j2

env.j2用於 docker-compose 文件:

version: "2"

services:
  service_name:
    image: {{ IMAGE | mandatory }}
    container_name: service_name
    mem_limit: 256m
    user: "2001"
    env_file: ".env"

現在我的問題是:是否有一些 ansible 模塊將 docker-compose 文件發送到主機並驗證它,因為 env 和 docker-compose 位於主機上的同一文件夾中?

此 ansible 任務示例返回錯誤,因為 env 文件不在模板文件夾中,而是在主機上。

- name: "Copy env file"
  ansible.builtin.template:
    src: "env.j2"
    dest: "/opt/db_backup/.env"
    mode: '770'
    owner: deployment
    group: deployment

- name: "Validate and copy docker compose file"
  ansible.builtin.template:
    src: "docker-compose.yml.j2"
    dest: "/opt/db_backup/docker-compose.yml"
    mode: '770'
    owner: deployment
    group: deployment
    validate: docker-compose -f %s config

這可能屬於template模塊validate參數文檔中鏈接的復雜驗證配置案例

在任何情況下,除非完全重構您的當前文件並在您的環境中傳遞更多變量(例如,允許.env位於當前目錄之外的位置),否則您無法驗證docker-compose.yml直到兩個文件都位於同一位置。

一個簡單的方案是將兩個文件復制到位,在對它們進行任何操作之前進行驗證,並在出現錯誤時回滾到以前的版本。 下面的例子遠非火箭證明,但會給你一個想法:

---
- hosts: localhost
  gather_facts: false

  vars:
    IMAGE: alpine:latest
    deploy_dir: /tmp/validate_compose

  tasks:
    - name: "make sure {{ deploy_dir }} directory exits"
      file:
        path: "{{ deploy_dir }}"
        state: directory

    - name: copy project file templates
      template:
        src: "{{ item }}"
        dest: "{{ deploy_dir }}/{{ item | regex_replace('^(.*)\\.j2', '\\g<1>') }}"
        mode: 0640
        backup: true
      loop:
        - .env.j2
        - docker-compose.yml.j2
      register: copy_files

    - block:
        - name: check docker-compose file validity
          command:
            cmd: docker-compose config
            chdir: "{{ deploy_dir }}"
      rescue:
        - name: rollback configuration to previous version for changed files
          copy:
            src: "{{ item.backup_file }}"
            dest: "{{ item.dest }}"
            remote_src: true
          loop: "{{ copy_files.results | selectattr('backup_file', 'defined') }}"

        - name: Give some info about error.
          debug:
            msg:
              - The compose file did not validate.
              - Please see previous error above for details
              - Files have been rolled back to the latest known version.

        - name: Fail
          fail:

    - name: Rest of the playbook using the above validated files
      debug:
        msg: Next tasks...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM