vars_prompt & Environment Variables
Keep on Learning!
If you liked what you've learned so far, dive in! Subscribe to get access to this tutorial plus video, code and script downloads.
We missed a deploy step! We're not clearing Symfony's cache. That sounds like
a job for a new task! Call it "Clear Cache". It's easy: we just need to run a command:
{{ symfony_console_path }} cache:clear --env=prod
:
- hosts: vb | |
// ... lines 3 - 10 | |
tasks: | |
// ... lines 12 - 188 | |
- name: Clear cache | |
command: '{{ symfony_console_path }} cache:clear --env=prod' | |
// ... lines 191 - 206 |
Easy! Except... that --env=prod
part is interesting. Sometimes I might want
to deploy our app in the prod
environment - like if we're deploying to production.
But other times, like if we're deploying to some test machine, I might want to deploy
our app in the dev
environment.
What I'm saying is: I want that environment to be configurable. And actually, this is important in two places: here, and when installing the Composer dependencies.
Symfony Composer Deps in the prod Environment
Google for "Symfony deploy" to find a page on Symfony.com. Scroll down to a section about installing and updating your vendors. Ah, so it recommends that when you deploy, you use:
composer install --no-dev
That's actually what the composer
module tried to do by default. But then we -
via a no_dev
option - told it to stop that nonsense!
- hosts: vb | |
// ... lines 3 - 10 | |
tasks: | |
// ... lines 12 - 149 | |
- name: Install Composer's dependencies | |
composer: | |
// ... line 152 | |
no_dev: no | |
// ... lines 154 - 206 |
We had to do that because some of the Composer post-install commands in a Symfony
app require the packages in the require-dev
section.
In reality, this --no-dev
flag is not a big deal. But, we can use it... as long
as we set an environment variable: SYMFONY_ENV=prod
. Yep, those problematic post-install
commands are setup to look for this environment variable, and not to do certain
things rely on the require-dev
dependencies.
So this is our mission: make the environment configurable, use it in the "Clear Cache" task and set a new environment variable.
Prompting for Input?
How? Start at the top: add a new vars_prompt
key with name
set to symfony_env
:
- hosts: vb | |
// ... lines 3 - 10 | |
vars_prompt: | |
- name: symfony_env | |
// ... lines 13 - 221 |
Then, prompt: Enter the environment for your Symfony app (prod|dev|test)
:
- hosts: vb | |
// ... lines 3 - 10 | |
vars_prompt: | |
- name: symfony_env | |
prompt: "Enter the environment for your Symfony app (prod|dev|test)" | |
// ... lines 14 - 221 |
As you're probably guessing, Ansible will now ask us what environment we want to use.
Set a default value to prod
and private: no
- you can set that to yes to obscure
passwords as you type them:
- hosts: vb | |
// ... lines 3 - 10 | |
vars_prompt: | |
- name: symfony_env | |
prompt: "Enter the environment for your Symfony app (prod|dev|test)" | |
default: prod | |
private: no | |
// ... lines 16 - 221 |
Cool!
Setting an Environment Variable
Next question: how can we use this variable to set an environment variable? How about...
an environment
key! Yep, setting environment variables is a native task for
Ansible. Set SYMFONY_ENV
to {{ symfony_env|lower }}
:
- hosts: vb | |
// ... lines 3 - 10 | |
vars_prompt: | |
- name: symfony_env | |
// ... lines 13 - 16 | |
environment: | |
SYMFONY_ENV: "{{ symfony_env|lower }}" | |
// ... lines 19 - 221 |
This uses the variable we just set... but pipes it through a lower
filter...
just in case we get crazy and use upper-case letters.
To see what this all looks like, at the top, let's debug some variables. First,
debug one called ansible_env
:
- hosts: vb | |
// ... lines 3 - 19 | |
tasks: | |
- debug: | |
var: ansible_env | |
// ... lines 23 - 221 |
This is a built-in variable that has a lot of info about the "host" environment - meaning, the machine (or machines) that you're running Ansible against. It should also contain our environment variable.
Let's also debug the symfony_env
variable that we set above:
- hosts: vb | |
// ... lines 3 - 19 | |
tasks: | |
- debug: | |
var: ansible_env | |
- debug: | |
var: symfony_env | |
// ... lines 26 - 221 |
Oh, and down on the "Clear Cache" task, I forgot to add the tag for deploy
:
- hosts: vb | |
// ... lines 3 - 19 | |
tasks: | |
// ... lines 21 - 203 | |
- name: Clear cache | |
command: '{{ symfony_console_path }} cache:clear --env=prod' | |
tags: | |
- deploy | |
// ... lines 208 - 221 |
Change over to your terminal and run the playbook - but take off the -t
option
so that everything runs:
ansible-playbook ansible/playbook.yml -i ansible/hosts.ini
Yes! Right at the start, it asks us for the environment. I'll leave it blank
to use prod
. Then, hit ctrl+c to quit: we can already see the variables!
First, it printed ansible_env
... which has some pretty cool stuff! It has a HOME
key for the home directory, PWD
for the current directory and other goodies. AND,
it has SYMFONY_ENV
set to prod
. Not surprisingly, the symfony_env
variable
also prints prod
.
Try this again.. but be tricky... with an uppercase PROD
:
ansible-playbook ansible/playbook.yml -i ansible/hosts.ini
Yep! The environment variable was lowercased, but not the symfony_env
variable.
That's no surprise... but if we want to guard against this, it will be a problem
in a minute when we try to use this in more places... like down on my "Clear Cache"
task:
- hosts: vb | |
// ... lines 3 - 19 | |
tasks: | |
// ... lines 21 - 203 | |
- name: Clear cache | |
command: '{{ symfony_console_path }} cache:clear --env=prod' | |
// ... lines 206 - 221 |
We could keep using the lower
filter. But, there's a cooler way: a "pre task".
Hi!
I've a problem with environment the SYMFONY_ENV var. In my case I've called app_env instance of symfony_env. But when composer install --no-dev there is a error
TASK [Install Composer's dependencies] ***********
\n An error occurred when executing the \"'cache:clear --no-warmup'\" command: \n PHP Fatal error: Uncaught ReflectionException: Class Doctrine\Common\DataFixtures\AbstractFixture not found in /var/www/project/src/AppBundle/DataFixtures/ORM/LoadUserData.php:10
My playbook:
My project use doctrine:fixtures:load. As the docs say, I register the bundle in:
Do you know any idea that it can be ...? 😞
thanks!