Ansible 将模板复制到具有不同值的不同目录

Ansible Copy Template to different directory with different value

我正在创建一个 Ansible 角色。有一个任务将启动 2 docker 个容器。有一个 docker-compose.yml.j2 文件。 docker-compose.yml.j2 文件将被复制到 2 个不同的目录中。当 docker-compose.yml.j2 被复制到 2 个不同的目录时,组合文件中的 docker 服务名称将根据 docker-compose.yml.j2 文件被复制到哪个目录而改变。在这里我卡住了 -

chain_name: ['goerli', 'ropsten']
ropsten _directory: '$HOME/goerli-chain-stack'
goerli_directory: '$HOME/ropsten-chain-stack'
- name: Copy Docker Compose file to goerli & ropsten directory
  template: 
    src: docker-compose.yml.j2
    dest: "{{ item }}/docker-compose.yml"
  with_items:
    - "{{ goerli_directory }}"
    - "{{ ropsten_directory }}"   
version: '2.0'
services:
  {% if {{ goerli_directory }} %} goerli: {% else {{ ropsten _directory }} %} ropsten: {% endif %}:
    image: {{ parity_version }}    
    restart: always
    command:
      --config /parity/config/parity.toml
    volumes:
      - ./config:/parity/config:ro
      - ./chain-data:/home/parity/.local/share/io.parity.ethereum/

docker-compose.yml.j2 文件被复制到文件夹 goerli_directory 时,chain_name 将是 goerliropsten_directory 也是如此,chain_name 将是 ropsten.

我怎样才能做到这样 -

version: '2.0'
services:
    goerli: # or ropsten
    image: {{ parity_version }}    
    restart: always
    command:
      --config /parity/config/parity.toml
    volumes:
      - ./config:/parity/config:ro
      - ./chain-data:/home/parity/.local/share/io.parity.ethereum/

你可以过去

version: '2.0'
services:
    {% if item == goerli_directory %}goerli{% else %}ropsten{% endif %}:
    image: {{ parity_version }}    
    restart: always
    command:
      --config /parity/config/parity.toml
    volumes:
      - ./config:/parity/config:ro
      - ./chain-data:/home/parity/.local/share/io.parity.ethereum/

因为变量 item,这是您当前正在循环的项目,可以在您的模板中访问,并且等于那些 goerli_directoryropsten_directory 变量的内容因为它们是在您的 with_items.

中处理的

甚至使用更优雅的 Jinja inline if expression:

version: '2.0'
services:
    {{ 'goerli' if item == goerli_directory else 'ropsten' }}:
    image: {{ parity_version }}    
    restart: always
    command:
      --config /parity/config/parity.toml
    volumes:
      - ./config:/parity/config:ro
      - ./chain-data:/home/parity/.local/share/io.parity.ethereum/

如果您想使用 chain_name 变量,请使用 vars lookup:

任务将变为:

- name: Copy Docker Compose file to goerli & ropsten directory
  template: 
    src: docker-compose.yml.j2
    dest: "{{ lookup('vars', item ~ '_directory') }}/docker-compose.yml"
  loop: "{{ chain_name }}" 

并且 docker-compose 模板被简化并通过:

version: '2.0'
services:
    {{ item }}:
    image: {{ parity_version }}    
    restart: always
    command:
      --config /parity/config/parity.toml
    volumes:
      - ./config:/parity/config:ro
      - ./chain-data:/home/parity/.local/share/io.parity.ethereum/