переопределить переменные по умолчанию / main.yml с молекулой - PullRequest
0 голосов
/ 24 января 2020

У меня проблема с тем, что мои значения по умолчанию обычно хранятся в defaults/main.yml для выполнения ansible сценариев, но я не нашел способ переопределить их. Я использую молекулу для тестирования, и я хочу метод передачи переменных в мой molecule/default/molecule.yml или molecule/default/playbook.yml, чтобы я мог динамически установить phpVersion.

  • Здесь переменная статически установлен со значением по умолчанию
# defaults/main.yml
phpVersion: 7.0
  • , здесь используется переменная
#tasks/main.yml
---
- name: Check if OS is Ubuntu LTS
  fail: msg="Server must be Ubuntu LTS"
  when: ansible_distribution != 'Ubuntu'
    or (ansible_distribution_version != '14.04'
      and ansible_distribution_version != '16.04'
      and ansible_distribution_version != '18.04')

- name: Get default PHP version
  shell: >
    set -o pipefail && \
    /usr/bin/php -v | grep 'PHP '
  register: php_installed_default_version
  failed_when: false
  changed_when: false

- name: Add ondrej repo to allow multiple PHP versions
  apt_repository:
    repo: "ppa:ondrej/php"
    update_cache: yes

- name: Include php version specific playbook
  include_tasks: "php{{ item }}.yml"
  with_items: "{{ php_versions }}"
  when: php_versions is defined

- name: Set default PHP version to 7.0 (PHP CLI)
  shell: update-alternatives --set php /usr/bin/php{{ phpVersion }}
  register: command_result
  when: phpVersion == 7.0
    and php_installed_default_version is defined
    and php_installed_default_version.stdout is defined
    and (not php_installed_default_version.stdout | regex_search("PHP 7\.0"))
  changed_when: command_result.stdout == "to provide"

- name: Set default PHP version to 7.1 (PHP CLI)
  shell: update-alternatives --set php /usr/bin/php{{ phpVersion }}
  register: command_result
  when: phpVersion == 7.1
    and php_installed_default_version is defined
    and php_installed_default_version.stdout is defined
    and (not php_installed_default_version.stdout | regex_search("PHP 7\.1"))
  changed_when: command_result.stdout == "to provide"

- name: Set default PHP version to 7.2 (PHP CLI)
  shell: update-alternatives --set php /usr/bin/php{{ phpVersion }}
  register: command_result
  when: phpVersion == 7.2
    and php_installed_default_version is defined
    and php_installed_default_version.stdout is defined
    and (not php_installed_default_version.stdout | regex_search("PHP 7\.2"))
  changed_when: command_result.stdout == "to provide"

# find out what update alternatives spits out and parse some of that through the registered variable: did this task change or not.
 - name: Set default PHP version to 7.3 (PHP CLI)
  shell: update-alternatives --set php /usr/bin/php{{ phpVersion }}
  register: command_result
  when: phpVersion == 7.3
    and php_installed_default_version is defined
    and php_installed_default_version.stdout is defined
    and (not php_installed_default_version.stdout | regex_search("PHP 7\.3"))
  changed_when: command_result.stdout == "to provide"
  • , поэтому для запуска мои тесты я ввожу эту команду:

    $ MOLECULE_DISTRO=ubuntu1804-php70 molecule test --destroy=never

    • здесь у меня есть моя установка молекулы
# molecule/default/molecule.yml
---
dependency:
  name: galaxy
driver:
  name: docker
lint:
  name: yamllint
  options:
    config-data:
      ignore: venv
platforms:
  - name: instance
    image: "superelectron/docker-ubuntu-ansible-php:${MOLECULE_DISTRO:-ubuntu1804-php70}"
    command: ${MOLECULE_DOCKER_COMMAND:-""}
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    privileged: true
    pre_build_image: true
    instance_raw_config_args:
      - "vm.network 'forwarded_port', guest: 80, host: 8088"
provisioner:
  name: ansible
  log: true
  lint:
    name: ansible-lint
verifier:
  name: testinfra
  lint:
    name: flake8
  • и вот моя тестовая книга воспроизведения
# molecule/default/playbook.yml
---
- name: Converge
  hosts: all
  roles:
    - role: ansible-role-php
  vars:
    phpVersion: 7.0

Из molecule.yml и playbook.yml вы можете видеть, как БОЛЬШО было бы проходить что-то подобное для установки phpVersion:

phpVersion=7.0 MOLECULE_DISTRO=ubuntu1804-php70 molecule test --destroy=never

и чтобы playbook.yml установил переменную следующим образом:

vars:
    phpVersion: ${phpVersion}

Вопрос в том, как я могу динамически установить переменную, используемую в tasks / main.yml с молекулой, чтобы мои тесты динамически устанавливают phpVersion?

1 Ответ

0 голосов
/ 24 января 2020

Редактировать : на самом деле можно добиться большего, чем показано ниже, но у меня не было времени полностью его протестировать. Решение ниже все еще в силе. Выберите лучший для вас.

Вы можете фактически передать env vars молекуле ansible Provider из molecule.yml (см. do c, которая сама принимает env vars для шаблонов с откат к значениям по умолчанию.

Вот новая идея. В игровой книге с молекулами чище приведенное ниже решение, но нужны два различных env-переменных (один для командной строки и более одного, переданного молекулой в игровую книгу) .

In molecule.yml

provisioner:
  name: ansible
  log: true
  lint:
    name: ansible-lint
  env:
    MY_PHP: ${MOLECULE_PHP:-"7.0"}

В вашей книге игр молекулы:

vars:
   phpVersion: "{{ lookup('env', 'MY_PHP') }}"

И ваши команды:

# Default
molecule converge

# Override
MOLECULE_PHP=7.4 molecule converge

Это одно решение: у него есть два незначительных недостатка:

  • env lookup возвращает пустую строку для несуществующих переменных env. Вы не можете использовать фильтры default, так что потому что запасное значение немного более многословно
  • Вы должны повторить значение по умолчанию для своей роли в вашей книге игр vars.

В вашей книге игр молекулы:

vars:
  phpOverride: "{{ lookup('env', 'MY_PHP') }}"
  phpVersion: "{{ (phpOverride | length > 0) | ternary(phpOverride, '7.0') }}"

И в вашей командной строке:

# For default value
molecule converge

# With override
MY_PHP=7.4 molecule converge
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...