扩展ansible角色?

Extend ansible role?

我正在编写我的第一个 ansible 剧本,并尝试使用现有角色配置 php 7。我找到了 2 个几乎满足我需求的角色,但它们都没有提供创建 php.ini 文件所需的灵活性。

  1. https://github.com/itcraftsmanpl/ansible-role-php7

此角色使用名为 php-fpm.yml 的任务使用

更改现有 php.ini 文件中的行
- name: Ensure timezone is set in fpm php.ini
  lineinfile: dest=/etc/php/7.1/fpm/php.ini
              regexp='date.timezone ='
              line='date.timezone = {{ php_timezone }}'
  1. https://github.com/geerlingguy/ansible-role-php/

此角色使用模板生成 php.ini 并插入某些预定义变量以使其可配置。

date.timezone = {{ php_date_timezone }}

问题:

是否可以在不覆盖上述角色的文件的情况下添加新的配置指令(比如设置 mysqli.max_persistent=XYZ)?还是我必须坚持角色提供的那些配置选项?

我通常应该如何在不篡改角色的文件库的情况下扩展已经存在的角色?

我现在的playbook.yml就这么简单:

- name: Install PHP 7
  hosts: all
  become: yes

  roles:
   - ansible-role-php7

您可以在实施中使用 include_role

例如/roles/myphp/tasks/main.yml:

- include_role:
    name: ansible-role-php7

- lineinfile:
    dest: /etc/php/7.1/fpm/php.ini
    regexp: 'mysqli.max_persistent ='
    line: 'mysqli.max_persistent = {{ mysqli_max_persistent }}'
  notify: restart php7-fpm

我遇到了同样的问题,我也通过在我的自定义 php 角色中使用 include_role 解决了这个问题。主要 php 角色是使用 ansible-galaxy 安装的,所以我的剧本结构如下所示:

roles/
  php/
    defaults/
      main.yml
    templates/
      xdebug_config.ini.j2
    tasks:
      main.yml
requirements.yml
site.yml

requirements.yml 文件中,我指定要安装的所有 galaxy 角色:

- src: geerlingguy.php

然后我通过执行安装所需的角色:

ansible-galaxy install -r requirements.yml

然后在我的 site.yml 中使用我自己的角色来扩展 geerlingguy.php 角色:

---
# Sample playbook

- name: "Development playbook"
  hosts: all
  become: yes
  roles:
    - role: php
      tags: php

然后在 roles/php/tasks/main.yml 中,我们使用 include_role 并为此角色设置扩展任务:

---
# Extends the geerlingguy.php role.

- name: Include base php role.
  include_role:
    name: geerlingguy.php

- name: Setup xdebug configuration.
  template:
    src: xdebug_config.ini.j2
    dest: /etc/php/7.0/fpm/conf.d/xdebug_config.ini
    mode: 0777

您可以使用 ansible.cfg 文件来确保 ansible 可以找到使用 ansible-galaxy 安装的角色,例如:

[defaults]
roles_path=/etc/ansible/roles