This playbook installs the latest supported PHP versions plus the latest 5.3 release. It is aimed to help developers which need to test their projects in different PHP versions (specially free or open source software developers).
This is done using php-build (for building) and phpenv (to manage the installed versions).
It also:
- Install (build) the most recent ICU version, which is used to build the
ext/intl
extension. Optionally, it can install older ICU releases down to the 4.0 release - Build each PHP version with the latest ICU version or with all the installed ICU versions
- Optionally install Nginx
- PEAR is also installed as it is needed to have PECL
See the Usage section for information about daily usage.
- Ansible 1.8 or greater
- Debian Wheezy
One of the possible values: "all" or "latest".
If "all", the icu role will build all the ICU releases listed in the icu_releases variable. If "latest", it will build only the latest ICU release listed in the icu_releases variable.
Defaults to latest
.
The path to install the ICU releases.
Defaults to /opt/icu/versions
.
ICU uses Source Forge to distribute its downloads.
Defaults to http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/i/ic/icu/ICU4C
.
A list of ICU releases (dictionaries) to be compiled and installed. Attributes:
- version: required - the minor version specification (e.g. 4.0)
- url: required - the URL to the release gzip file in the icu-project.org website
- md5_checksum: required - the MD5 checksum of the gzip file (available on the icu-project.org website)
- patch_url: optional - a URL to a patch file to apply to the ICU source code
See the roles/icu/defaults/main.yml
file for the default values.
The path to the Nginx document root.
Defaults to /var/www
.
If true, installs Nginx.
Defaults to true
.
The global COMPOSER_HOME path.
See: https://getcomposer.org/doc/03-cli.md#composer-home
Defaults to /opt/composer
.
The base path to store the log files.
Defaults to /var/log
.
PHP log directory path.
Defaults to {{ log_path }}/php
PHP-FPM log directory path.
Defaults to {{ log_path }}/php-fpm
One of the possible values: "all" or "latest".
If "all", the php role will build all the PHP releases listed in the php_releases variable. If "latest", it will build only the latest PHP release listed in the php_releases variable.
Defaults to latest
.
One of the possible values: "all" or "latest".
If "all", every PHP relase in php_releases will be build against the all the built ICU releases listed in the icu_releases variable (see the icu role).
If "latest", every PHP relase in php_releases will be build against the latest built ICU release listed in the icu_releases variable.
Defaults to latest
.
A list of PHP releases (dictionaries) to be compiled and installed. Attributes:
- version: required - the full version specification (e.g. 5.3.3)
- minor: required - used to make the versions comparisons
- ini_file: optional - which php.ini file to use, "development" or "production", defaults to "development"
This list must be ordered from oldest to newest version by convention. See php_build_releases.
If php_icu_build_releases is equal to "latest", it will create a symlink from the minor to the version value in the phpenv_versions_path directory, just to simplify the usage of phpenv local and global commands:
$ phpenv versions
5.6
* 5.6.3 (set by /opt/phpenv/version)
$ phpenv local 5.6
$ phpenv versions
* 5.6 (set by /home/vagrant/.php-version)
5.6.3
See the roles/php/defaults/main.yml
file for the default values.
A dictionary of PHP configuration directives. These overrides the default values in the php.ini file and are stored in the phpenv_versions_path//etc/conf.d/php-configuration.ini file.
php.ini sections are not supported.
See: http://php.net/manual/en/ini.list.php See: http://php.net/manual/en/ini.core.php
It sets the error_log
directive to {{ php_log_path }}/error.log
.
See the roles/php/defaults/main.yml
file for the other default values.
A dictionary of PHP-FPM configuration directives. These overrides the default values in the php.ini file and are stored in the phpenv_versions_path//etc/fpm.conf.d/php-fpm-configuration.ini file.
See: http://php.net/manual/en/install.fpm.configuration.php
It sets the error_log
directive to {{ php_fpm_log_path }}/error.log
.
A list with the name of the PHP-FPM pools.
The www pool must exists as we are using the default php-fpm.conf file.
A dictionary of dictionaries with the specific configuration for each pool in php_fpm_pools.
It sets the group
and user
directives for the www
pool to www-data
.
See the roles/php/defaults/main.yml
file for the other default values.
A list of PECL extensions (dictionaries) desired to be installed. Attributes:
- name: required - the name of the extension as listed in pecl.php.net
- version: optional - the specific version to install, defaults to "stable"
- alias: optional - some extensions use another name to build the shared object file. ZendOpcache, for example, build a opcache.so file. Use this attribute for these cases
- zend_extension: optional - set to true if the extension is a Zend extension, otherwise the extension will not load properly. Defaults to false
- php_version: optional - only install if the PHP version comparison pass for this value. Defaults to the latest release listed in php_releases
- php_comparison: optional - a comparison operator used to compare against php_version. Defaults to "<=". available comparison operators in: http://docs.ansible.com/playbooks_variables.html#version-comparison-filters
See the roles/php/defaults/main.yml
file for the default values.
If true, build librabbitmq. If you're installing a packaged version of it or isn't installing the PECL amqp package, set it to false.
Defaults to true
.
A list of packages to be installed globally with Composer.
See the roles/php/defaults/main.yml
file for the default values.
If true, clean up the Composer cache after installing the packages.
Defaults to false
.
The php-build and phpenv project repositories.
See the roles/phpbuild/defaults/main.yml
file for the default values.
php-build installation path.
Defaults to /opt/php-build
.
phpenv installation path.
Defaults to /opt/phpenv
.
Just for code clarity, the path to the phpenv's versions directory.
Defaults to {{ phpenv_path }}/versions
.
None.
- hosts: all
roles:
- php
# This will build the latest PHP release with all the available ICU releases down to the 4.0 version.
vars:
- php_build_releases: latest
- php_icu_build_releases: all
The most important role variables to use as "extra vars" with ansible-playbook
are:
icu_build_releases
: build "latest" or "all" ICU releasesinstall_nginx
: install Nginxphp_build_releases
: build "latest" or "all" PHP releasesphp_icu_build_releases
: build PHP with "latest" installed ICU release or with "all" installed ICU releases
See the Vagrant Testing section for practical usage examples.
This playbook ships with a Vagrantfile for testing purposes, using the chef/debian Vagrant box:
$ vagrant up
$ ansible-playbook -i inventories/vagrant -s site.yml
To build all the available PHP releases:
$ ansible-playbook -i inventories/vagrant -s site.yml -e "php_build_releases=all"
To build all the available ICU and PHP releases, building PHP against all the installed ICU releases (wait longer hours!):
$ ansible-playbook -i inventories/vagrant -s site.yml -e "icu_build_releases=all php_build_releases=all php_icu_build_releases=all"
To disable Nginx building:
$ ansible-playbook -i inventories/vagrant -s site.yml -e "install_nginx=false"
PHP-FPM is installed for each PHP version. To start it with Nginx, use the helper command webserver
. See the Usage
section.
Each PHP version is built with the following extensions:
- amqp
- bcmath
- Core
- ctype
- curl
- date
- dom
- ereg
- exif
- fileinfo
- filter
- ftp
- gd
- hash
- iconv
- igbinary
- intl
- json
- libxml
- mbstring
- mcrypt
- memcached
- mongo
- mysql
- mysqli
- mysqlnd
- openssl
- pcntl
- pcre
- PDO
- pdo_mysql
- pdo_pgsql
- pdo_sqlite
- Phar
- posix
- readline
- Reflection
- redis
- riak
- session
- shmop
- SimpleXML
- soap
- sockets
- SPL
- sqlite3
- standard
- sysvsem
- sysvshm
- tidy
- tokenizer
- xdebug
- xml
- xmlreader
- xmlrpc
- xmlwriter
- xsl
- Zend OPcache
- zip
- zlib
From the previous list, the following extensions were installed using PECL:
Composer is also installed. The following libraries are installed globally:
You'll use the phpenv
command basically to switch between the installed PHP versions:
$ phpenv versions
5.3
5.3.29
5.4
5.4.35
5.5
5.5.19
5.6
* 5.6.3 (set by /opt/phpenv/version)
5.6, 5.5, 5.4 and 5.3 are just shortcuts. phpenv
let you define the global and local PHP version. To set it
globally (root privileges are needed):
$ sudo -i phpenv global 5.5
To set a local version, use:
$ phpenv local 5.4
To install additional PHP libraries globally with Composer, you'll need root privileges:
$ sudo composer global require fabpot/php-cs-fixer:dev-master
You can start the Nginx and PHP-FPM using the helper command webserver
(which are not installed as services, root privileges are needed):
$ sudo webserver start
Starting PHP-FPM (PHP version 5.6.3) server.
Starting Nginx server.
Done.
The Zend OPCache is enabled by default. If you want to disable it, you can run the helper command opcache
(root
privileges are needed):
$ sudo opcache disable
The Zend OPCache (PHP version 5.6.3) was disabled.
You need to restart the webserver for the changes to take effect.
Execute: webserver restart
- Decouple the ICU version from the PHP version name in the
php
role, which makes the code unreadable. The idea is to create a helper script to create proper Ansible variables and php-build definition files - Support other Debian releases and Ubuntu
- Tagging
Apache License 2.0