用分子覆盖默认值/main.yml 变量



我遇到了一个问题,我的默认值通常存储在defaults/main.yml中以运行 ansible 脚本,但我还没有找到覆盖它们的方法。我正在使用分子进行测试,我想要一种将变量传入我的molecule/default/molecule.ymlmolecule/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.ymlplaybook.yml你可以看到传递这样的东西来设置 phpVersion 是多么棒:

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

并让 playbook.yml 设置一个这样的变量:

vars:
phpVersion: ${phpVersion}

问题是,我怎样才能用分子动态设置任务/main.yml 中使用的变量,以便我的测试动态设置 phpVersion?

编辑:实际上可能比下面做得更好,但我没有时间完全测试它。下面的解决方案仍然有效。选择最适合您的。

您实际上可以从molecule.yml将 env vars 传递给分子 ansible provisionner(请参阅文档,它本身接受 env var 进行模板化,并回退到默认值。

这是新想法。在下面的解决方案的分子剧本中更干净,但需要两个不同的环境变量(一个用于命令行,一个由分子传递到剧本(。

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查找为不存在的 env var 返回一个空字符串。您不能使用default筛选器,因此查找回退值会更详细一些
  • 您必须在剧本变量中重复角色的默认值。

在您的分子手册中:

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

最新更新