diff --git a/.gitignore b/.gitignore index fd8e52a..c7cdbe1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .vagrant* *.swp +*.retry diff --git a/.travis.yml b/.travis.yml index db05ff8..cb8eb3b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ env: - - PLATFORM=debian-wheezy - - PLATFORM=debian-jessie + - PLATFORM=debian-jessie-php-5.6 + - PLATFORM=debian-jessie-php-7.0 sudo: required diff --git a/README.md b/README.md index c5c8d8f..d95ea3a 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,15 @@ Ansible PHP (+FPM) role for Debian [![Ansible Galaxy](http://img.shields.io/badge/ansible--galaxy-HanXHX.php-blue.svg)](https://galaxy.ansible.com/list#/roles/4472) [![Build Status](https://travis-ci.org/HanXHX/ansible-php.svg?branch=master)](https://travis-ci.org/HanXHX/ansible-php) -Install PHP (php-fpm optional) on Debian Wheezy/Jessie. Depending of your PHP version: manage APC(u) / Opcache. +Install PHP (php-fpm optional) on Debian Jessie/Stretch. Manage APCu, Opcache, Xdebug. + +Managed versions: 5.6 and 7.0 Requirements ------------ If you need PHP-FPM, you must install a webserver with FastCGI support. You can use my [nginx role](https://github.com/HanXHX/ansible-nginx). -On Debian Wheezy, you can use many PHP version: 5.4 from Debian repository and 5.5/5.6 from [Dotdeb](https://www.dotdeb.org). With my [dotdeb role](https://github.com/HanXHX/ansible-debian-dotdeb), you can choose which version you want. +On Debian Jessie, if you want PHP7.0, you must use [Dotdeb](https://www.dotdeb.org). You can use my [dotdeb role](https://github.com/HanXHX/ansible-debian-dotdeb). Role Variables -------------- @@ -18,6 +20,7 @@ You should look at [default vars](defaults/main.yml). ### Writable vars +- `php_version`: 5.6 (default) or 7.0 - `php_install_fpm`: boolean, install and manage php-fpm (default is true) - `php_install_xdebug`: boolean, install [Xdebug](http://xdebug.org) - `php_extra_packages`: additional php packages to install (default is an empty list). @@ -35,7 +38,7 @@ Note: - You can override with `php_ini_fpm`/`php_ini_cli`, but it breaks idempotence. -#### OpCache settings (PHP >= 5.5) +#### OpCache settings See [Opcache doc](https://secure.php.net/manual/en/opcache.configuration.php) @@ -119,7 +122,6 @@ See [Xdebug doc](http://xdebug.org/docs/all_settings) - `php_xdebug_var_display_max_data` - `php_xdebug_var_display_max_depth` - ### Read only vars - `php_packages`: minimal package list to install @@ -140,12 +142,12 @@ Example Playbook roles: - { role: HanXHX.php } -### Debian Wheezy with PHP 5.5 CLI (no FPM) +### Debian Jessie with PHP 7.0 CLI (no FPM) - - hosts: wheezy-servers + - hosts: jessie-servers roles: - - { role: HanXHX.dotdeb, dotdeb_php_version: "5.5" } - - { role: HanXHX.php, php_install_fpm: false } + - { role: HanXHX.dotdeb } + - { role: HanXHX.php, php_version: '7.0', php_install_fpm: false } License ------- @@ -155,6 +157,5 @@ GPLv2 Author Information ------------------ -- You can find many other roles in my GitHub "lab": https://github.com/HanXHX/my-ansible-playbooks -- All issues, pull-request are welcome :) - +- Twitter: [@hanxhx_](https://twitter.com/hanxhx_) +- All issues, pull-requests are welcome :) diff --git a/Vagrantfile b/Vagrantfile index 6d038a4..db498a0 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -6,8 +6,10 @@ Vagrant.configure("2") do |config| vms = [ - [ "debian-wheezy", "deb/wheezy-amd64" , "192.168.33.87" ], - [ "debian-jessie", "deb/jessie-amd64", "192.168.33.88" ] + [ "jessie-php-5.6", "debian/contrib-jessie64", "192.168.33.88", "5.6" ], + [ "jessie-php-7.0", "debian/contrib-jessie64", "192.168.33.89", "7.0" ], + [ "stretch-php-5.6", "sharlak/debian_stretch_64", "192.168.33.90", "5.6" ], + [ "stretch-php-7.0", "sharlak/debian_stretch_64", "192.168.33.91", "7.0" ] ] config.vm.provider "virtualbox" do |v| @@ -22,9 +24,11 @@ Vagrant.configure("2") do |config| m.vm.provision "ansible" do |ansible| ansible.playbook = "tests/test.yml" - ansible.groups = { "test" => [ vm[0] ] } ansible.verbose = 'vv' - ansible.sudo = true + ansible.sudo = true + ansible.extra_vars = { + php_version: vm[3] + } end end end diff --git a/defaults/main.yml b/defaults/main.yml index 54a8155..8d56bde 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -1,5 +1,6 @@ --- +php_version: '5.6' php_install_fpm: true php_install_xdebug: false php_extra_packages: [] @@ -15,7 +16,7 @@ php_ini: php_ini_fpm: [] php_ini_cli: [] -# OpCache settings (PHP >= 5.5) +# OpCache settings php_opcache_enable: "1" php_opcache_enable_cli: "0" php_opcache_memory_consumption: "96" @@ -92,7 +93,7 @@ php_xdebug_var_display_max_depth: '3' # PHP-FPM php_fpm_poold: - pool_name: 'www' - listen: '/var/run/php5-fpm.sock' + listen: '{{ php_default_fpm_sock }}' pm: 'dynamic' pm_max_children: 250 pm_start_servers: 10 diff --git a/handlers/main.yml b/handlers/main.yml index 8e4c0d4..2f8d6d2 100644 --- a/handlers/main.yml +++ b/handlers/main.yml @@ -1,5 +1,5 @@ --- - name: restart php-fpm - action: service name=php5-fpm state=restarted + service: name='{{ php_fpm_service }}' state=restarted when: php_install_fpm diff --git a/meta/main.yml b/meta/main.yml index 23c8e52..af79f48 100644 --- a/meta/main.yml +++ b/meta/main.yml @@ -1,17 +1,19 @@ --- galaxy_info: author: Emilien Mantel - description: Install and configure PHP (+ FPM is wanted) + description: Install and configure PHP 5.6/7.0 (+ FPM is wanted) company: license: GPLv2 - min_ansible_version: 1.8 + min_ansible_version: 1.9 platforms: - name: Debian versions: - - wheezy - jessie - categories: + galaxy_tags: - development - web + - php + - php7 + - debian dependencies: [] diff --git a/tasks/fpm.yml b/tasks/fpm.yml index b8f79f9..2ea300e 100644 --- a/tasks/fpm.yml +++ b/tasks/fpm.yml @@ -1,16 +1,21 @@ --- - name: APT | Install PHP-FPM - apt: pkg=php5-fpm state=latest + apt: pkg={{ php_fpm_service }} state=latest - name: LINEINFILE | PHP configuration - lineinfile: dest=/etc/php5/fpm/php.ini regexp='^;?{{ item.key }}' line='{{ item.key }} = {{ item.value }}' + lineinfile: > + dest='{{ php_etc_dir }}/fpm/php.ini' + regexp='^;?{{ item.key }}' + line='{{ item.key }} = {{ item.value }}' with_flattened: - php_ini - php_ini_fpm notify: restart php-fpm - name: TEMPLATE | Deploy pool configuration - template: src=etc/php5/fpm/pool.d/pool.conf.j2 dest=/etc/php5/fpm/pool.d/{{ item.pool_name }}.conf + template: > + src=etc/__php__/fpm/pool.d/pool.conf.j2 + dest='{{ php_etc_dir }}/fpm/pool.d/{{ item.pool_name }}.conf' with_items: php_fpm_poold notify: restart php-fpm diff --git a/tasks/main.yml b/tasks/main.yml index 257cec9..6768fdb 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -1,22 +1,34 @@ --- +- name: ASSERT | Check variables + assert: + that: "php_version in php_managed_versions" + +- name: INCLUDE_VARS | Related to PHP version + include_vars: "php-{{ php_version }}.yml" + - name: APT | Install PHP packages apt: pkg={{ item }} state=latest update_cache=yes cache_valid_time=3600 with_flattened: - php_packages - php_extra_packages +# Note: only needed for PHP5x + Xdebug - name: COMMAND | Get PHP extension dir command: php-config --extension-dir changed_when: false register: php_extension_dir + when: php_version == '5.6' - name: INCLUDE | PHP-FPM include: fpm.yml when: php_install_fpm - name: LINEINFILE | PHP configuration - lineinfile: dest=/etc/php5/cli/php.ini regexp='^;?{{ item.key }}' line='{{ item.key }} = {{ item.value }}' + lineinfile: > + dest='{{ php_etc_dir }}/cli/php.ini' + regexp='^;?{{ item.key }}' + line='{{ item.key }} = {{ item.value }}' with_flattened: - php_ini - php_ini_cli @@ -25,16 +37,6 @@ include: xdebug.yml when: php_install_xdebug -- name: SHELL | Get PHP version on apt - shell: php -v | head -n 1 | awk '{ print $2 }' - register: php_apt_version - changed_when: false - -- name: APT | Install and configure php-apcu / opcache (PHP 5.5+ only) - include: php55min.yml - when: php_apt_version.stdout|version_compare('5.5', 'ge', False) - -- name: APT | Install and configure php-apc (PHP 5.4 max only) - include: php54max.yml - when: php_apt_version.stdout|version_compare('5.5', 'lt', False) +- name: APT | Install and configure opcache + include: opcache.yml diff --git a/tasks/opcache.yml b/tasks/opcache.yml new file mode 100644 index 0000000..ef5e657 --- /dev/null +++ b/tasks/opcache.yml @@ -0,0 +1,20 @@ +--- + +- name: APT | Install APCu + apt: pkg="{{ php_apt_prefix }}apcu" state=present + +- name: APT | Install Opcache + apt: pkg="{{ php_apt_prefix }}opcache" state=present + when: php_version | version_compare('7.0', 'ge') + +- name: TEMPLATE | Configure APCu + template: > + src=etc/__php__/mods-available/opcache.ini.j2 + dest="{{ php_mods_dir }}/opcache.ini" + notify: restart php-fpm + +- name: TEMPLATE | Configure APCu + template: > + src=etc/__php__/mods-available/apcu.ini.j2 + dest={{ php_mods_dir }}/apcu.ini + notify: restart php-fpm diff --git a/tasks/php54max.yml b/tasks/php54max.yml deleted file mode 100644 index 22605c4..0000000 --- a/tasks/php54max.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- - -- name: APT | Install php-apcu - apt: pkg=php-apc state=latest - -- name: SET_FACT | Set APC - set_fact: php_apc_package="apc" - -- name: TEMPLATE | Configure APC - template: src=etc/php5/mods-available/apcu.ini.j2 dest=/etc/php5/mods-available/apc.ini - notify: restart php-fpm diff --git a/tasks/php55min.yml b/tasks/php55min.yml deleted file mode 100644 index 460dfc1..0000000 --- a/tasks/php55min.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- - -- name: APT | Install php-apcu - apt: pkg=php5-apcu state=latest - -- name: SET_FACT | Set APCu - set_fact: php_apc_package="apcu" - -- name: TEMPLATE | Configure Opcache / APCu - template: src=etc/php5/mods-available/{{ item }}.ini.j2 dest=/etc/php5/mods-available/{{ item }}.ini - with_items: - - apcu - - opcache - notify: restart php-fpm diff --git a/tasks/xdebug.yml b/tasks/xdebug.yml index c53d795..1e54b88 100644 --- a/tasks/xdebug.yml +++ b/tasks/xdebug.yml @@ -1,13 +1,21 @@ --- - name: APT | Install php-xdebug - apt: pkg=php5-xdebug state=latest update_cache=yes cache_valid_time=3600 + apt: > + pkg="{{ php_apt_prefix }}xdebug" + state=latest + update_cache=yes + cache_valid_time=3600 - name: SHELL | Get Xdebug version - shell: dpkg -l | awk '$2 ~ /^php5-xdebug$/ { print $3 }' + shell: dpkg -l | awk '$2 ~ /xdebug$/ { print $3 }' changed_when: false register: xdebug_version - name: TEMPLATE | Deploy module configurations - template: src=etc/php5/mods-available/xdebug.ini.j2 dest=/etc/php5/mods-available/xdebug.ini owner=root mode=0644 + template: > + src=etc/__php__/mods-available/xdebug.ini.j2 + dest={{ php_mods_dir }}/xdebug.ini + owner=root + mode=0644 notify: restart php-fpm diff --git a/templates/etc/php5/fpm/pool.d/pool.conf.j2 b/templates/etc/__php__/fpm/pool.d/pool.conf.j2 similarity index 100% rename from templates/etc/php5/fpm/pool.d/pool.conf.j2 rename to templates/etc/__php__/fpm/pool.d/pool.conf.j2 diff --git a/templates/etc/php5/mods-available/apcu.ini.j2 b/templates/etc/__php__/mods-available/apcu.ini.j2 similarity index 97% rename from templates/etc/php5/mods-available/apcu.ini.j2 rename to templates/etc/__php__/mods-available/apcu.ini.j2 index 2f946de..59afd0c 100644 --- a/templates/etc/php5/mods-available/apcu.ini.j2 +++ b/templates/etc/__php__/mods-available/apcu.ini.j2 @@ -2,7 +2,7 @@ ; {{ ansible_managed }} ; -extension={{ php_apc_package }}.so +extension=apcu.so ; apc.enabled can be set to 0 to disable APC apc.enable={{ php_apc_enable }} diff --git a/templates/etc/php5/mods-available/opcache.ini.j2 b/templates/etc/__php__/mods-available/opcache.ini.j2 similarity index 100% rename from templates/etc/php5/mods-available/opcache.ini.j2 rename to templates/etc/__php__/mods-available/opcache.ini.j2 diff --git a/templates/etc/php5/mods-available/xdebug.ini.j2 b/templates/etc/__php__/mods-available/xdebug.ini.j2 similarity index 97% rename from templates/etc/php5/mods-available/xdebug.ini.j2 rename to templates/etc/__php__/mods-available/xdebug.ini.j2 index 72f716a..59a1a3b 100644 --- a/templates/etc/php5/mods-available/xdebug.ini.j2 +++ b/templates/etc/__php__/mods-available/xdebug.ini.j2 @@ -4,7 +4,11 @@ ; configuration for php xdebug module ; priority=20 +{% if php_version | version_compare('7.0', 'ge') %} +zend_extension=xdebug.so +{% else %} zend_extension={{ php_extension_dir.stdout }}/xdebug.so +{% endif %} {% if xdebug_version.stdout|version_compare('2.3', 'gt') %} {% endif %} diff --git a/tests/debian-jessie.Dockerfile b/tests/debian-jessie-php-5.6.Dockerfile similarity index 63% rename from tests/debian-jessie.Dockerfile rename to tests/debian-jessie-php-5.6.Dockerfile index fc71280..9a4908a 100644 --- a/tests/debian-jessie.Dockerfile +++ b/tests/debian-jessie-php-5.6.Dockerfile @@ -1,5 +1,5 @@ FROM williamyeh/ansible:debian8-onbuild RUN apt-get update -CMD ["sh", "tests/test.sh"] +CMD ["sh", "tests/test.sh", "5.6"] diff --git a/tests/debian-jessie-php-7.0.Dockerfile b/tests/debian-jessie-php-7.0.Dockerfile new file mode 100644 index 0000000..d4813e1 --- /dev/null +++ b/tests/debian-jessie-php-7.0.Dockerfile @@ -0,0 +1,5 @@ +FROM williamyeh/ansible:debian8-onbuild + +RUN apt-get update +CMD ["sh", "tests/test.sh", "7.0"] + diff --git a/tests/debian-wheezy.Dockerfile b/tests/debian-wheezy.Dockerfile deleted file mode 100644 index 0138946..0000000 --- a/tests/debian-wheezy.Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM williamyeh/ansible:debian7-onbuild - -RUN apt-get update -CMD ["sh", "tests/test.sh"] - diff --git a/tests/group_vars/php-5.6 b/tests/group_vars/php-5.6 new file mode 100644 index 0000000..cf95f41 --- /dev/null +++ b/tests/group_vars/php-5.6 @@ -0,0 +1 @@ +php_version: '5.6' diff --git a/tests/group_vars/php-7.0 b/tests/group_vars/php-7.0 new file mode 100644 index 0000000..5a7a3f5 --- /dev/null +++ b/tests/group_vars/php-7.0 @@ -0,0 +1 @@ +php_version: '7.0' diff --git a/tests/inventory b/tests/inventory new file mode 100644 index 0000000..f226ed6 --- /dev/null +++ b/tests/inventory @@ -0,0 +1,7 @@ +localhost + +[php-5.6] +localhost + +[php-7.0] +localhost diff --git a/tests/test.sh b/tests/test.sh index 4aee411..78f40d8 100644 --- a/tests/test.sh +++ b/tests/test.sh @@ -4,17 +4,20 @@ DIR=$( dirname $0 ) PLAYBOOK="$DIR/test.yml" +ANSIBLE_ARG="localhost" set -ev +ansible --version + # Check syntax ansible-playbook -i localhost, -c local --syntax-check -vv $PLAYBOOK # Check role -ansible-playbook -i localhost, -c local --sudo -vv $PLAYBOOK +ansible-playbook -i localhost, -c local -e "php_version=$1" --become -vv $PLAYBOOK # Check indempotence -ansible-playbook -i localhost, -c local --sudo -vv $PLAYBOOK \ +ansible-playbook -i localhost, -c local -e "php_version=$1" --become -vv $PLAYBOOK \ | grep -q 'changed=0.*failed=0' \ && (echo 'Idempotence test: pass' && exit 0) \ || (echo 'Idempotence test: fail' && exit 1) diff --git a/tests/test.yml b/tests/test.yml index 24f980f..bb29df3 100644 --- a/tests/test.yml +++ b/tests/test.yml @@ -4,9 +4,19 @@ vars: vhost: 'test.local' php_extra_packages: - - 'php5-memcached' + - '{{ php_apt_prefix }}recode' php_install_xdebug: true pre_tasks: + - name: APT | Install DotDeb key + apt_key: url='http://www.dotdeb.org/dotdeb.gpg' state=present + when: > + ansible_distribution_major_version | version_compare(8, 'eq') and + php_version | version_compare('7.0', 'ge') + - name: APT | Add Dotdeb repository for Jessie + PHP7 + apt_repository: repo='deb http://packages.dotdeb.org jessie all' state=present + when: > + ansible_distribution_major_version | version_compare(8, 'eq') and + php_version | version_compare('7.0', 'ge') - name: APT | Install nginx apt: pkg=nginx state=present update_cache=yes cache_valid_time=3600 - name: SHELL | Get nginx version @@ -17,10 +27,11 @@ when: nginx_version.stdout | version_compare('1.6', '<', true) - set_fact: nginx_include="fastcgi.conf" when: nginx_version.stdout | version_compare('1.6', '>=', true) + tasks: - name: COPY | Vhost copy: > dest=/etc/nginx/sites-enabled/{{ vhost }} - content='server { server_name {{ vhost }}; root /var/www; location ~ \.php$ { include {{ nginx_include }}; fastcgi_pass unix:/var/run/php5-fpm.sock; } }' + content='server { server_name {{ vhost }}; root /var/www; location ~ \.php$ { include {{ nginx_include }}; fastcgi_pass unix:{{ php_default_fpm_sock }}; } }' notify: reload nginx handlers: - name: reload nginx @@ -31,10 +42,14 @@ - name: SHELL | Test php-cli shell: php -i | grep '^PHP Version' | head -n 1 changed_when: false + register: p + failed_when: p.stdout == '' - name: FILE | Create /var/www file: dest=/var/www state=directory - name: COPY | Add phpinfo copy: dest=/var/www/phpinfo.php content=' /dev/null | grep h1 | grep -o 'PHP Version 5.*<' | sed -r 's/ /dev/null | grep h1 | grep -o 'PHP Version [57].*<' | sed -r 's/