首页 > 解决方案 > 从 Ansible 中的产品列表构建字符串

问题描述

我需要为许多已定义的 php 版本安装 php 扩展列表。

基本上我有一个带有 php 版本的列表和另一个带有一组扩展的列表:

php_defaults_modules:
  - curl
  - mbstring
  - gd
  - json
  - imap
  - readline
  - xml
  - zip
  - mysql
  - pgsql

php_version:
 - 7.4
 - 7.2

我为数据包安装编写了以下任务:

- name: "Install base modules"
  apt:
    name: "php{{ item[0] }}-{{ item[1] }}"
    state: present
  notify:
    - Reload FPM
  loop: "{{  php_version |product( php_defaults_modules)|list }}"

但这需要太多时间,因为检查操作是针对每个数据包完成的。这就是为什么我更喜欢生成一条线来传输到 apt。相当于:

apt install php7.2-curl php7.2-mb [...] php7.4-mysql php 7.4-pgsql

我尝试了类似的东西

- name: Define base modules
  set_fact:
    php_extensions: "{{ php_extensions }} + '[ php{{ item[0] }}-{{ item[1] }} ] '"
  loop: "{{  php_version |product( php_defaults_modules) | list }}"

但显然这不是解决方案。

有没有办法让安装和检查更快?

谢谢

标签: ansible

解决方案


这是我的解决方案,不是建立一个列表,而是一个字符串然后拆分它。也许不是最好的解决方案,但它有效:

- name: Define base modules
  set_fact:
    php_extensions: ""

- name: Define base modules
  set_fact:
    php_extensions: "{{ php_extensions }} php{{ item[0] }}-{{ item[1] }}"
  loop: "{{ php_version |product( php_defaults_modules ) | list }}"

- name: Install php packages
  apt:
    name: "{{ php_extensions.split() }}"
  notify:
    - Reload FPM

推荐阅读