diff --git a/README.md b/README.md index 395b7aa..c7187e5 100644 --- a/README.md +++ b/README.md @@ -1,143 +1,21 @@ -# Composer template for Drupal projects +# Dransible -[](https://travis-ci.org/drupal-composer/drupal-project) +A demo [Drupal] application for demonstrating PHP application deployment with [Ansible][], [Ansible Vault][] and [Ansistrano][]. -This project template provides a starter kit for managing your site -dependencies with [Composer](https://getcomposer.org/). +[Ansible]: https://www.ansible.com +[Ansible Vault]: https://docs.ansible.com/ansible/ansible-vault.html +[Ansistrano]: https://ansistrano.com +[Drupal]: https://drupal.org -If you want to know how to use it as replacement for -[Drush Make](https://github.com/drush-ops/drush/blob/8.x/docs/make.md) visit -the [Documentation on drupal.org](https://www.drupal.org/node/2471553). +## Prerequisites -## Usage +- [Ansible][] +- [Vagrant][] +- [VirtualBox][] -First you need to [install composer](https://getcomposer.org/doc/00-intro.md#installation-linux-unix-osx). +[Vagrant]: https://www.vagrantup.com +[VirtualBox]: https://www.virtualbox.or -> Note: The instructions below refer to the [global composer installation](https://getcomposer.org/doc/00-intro.md#globally). -You might need to replace `composer` with `php composer.phar` (or similar) -for your setup. +## Installation -After that you can create the project: - -``` -composer create-project drupal-composer/drupal-project:8.x-dev some-dir --stability dev --no-interaction -``` - -With `composer require ...` you can download new dependencies to your -installation. - -``` -cd some-dir -composer require drupal/devel:~1.0 -``` - -The `composer create-project` command passes ownership of all files to the -project that is created. You should create a new git repository, and commit -all files not excluded by the .gitignore file. - -## What does the template do? - -When installing the given `composer.json` some tasks are taken care of: - -* Drupal will be installed in the `web`-directory. -* Autoloader is implemented to use the generated composer autoloader in `vendor/autoload.php`, - instead of the one provided by Drupal (`web/vendor/autoload.php`). -* Modules (packages of type `drupal-module`) will be placed in `web/modules/contrib/` -* Theme (packages of type `drupal-theme`) will be placed in `web/themes/contrib/` -* Profiles (packages of type `drupal-profile`) will be placed in `web/profiles/contrib/` -* Creates default writable versions of `settings.php` and `services.yml`. -* Creates `web/sites/default/files`-directory. -* Latest version of drush is installed locally for use at `vendor/bin/drush`. -* Latest version of DrupalConsole is installed locally for use at `vendor/bin/drupal`. -* Creates environment variables based on your .env file. See [.env.example](.env.example). - -## Updating Drupal Core - -This project will attempt to keep all of your Drupal Core files up-to-date; the -project [drupal-composer/drupal-scaffold](https://github.com/drupal-composer/drupal-scaffold) -is used to ensure that your scaffold files are updated every time drupal/core is -updated. If you customize any of the "scaffolding" files (commonly .htaccess), -you may need to merge conflicts if any of your modified files are updated in a -new release of Drupal core. - -Follow the steps below to update your core files. - -1. Run `composer update drupal/core webflo/drupal-core-require-dev symfony/* --with-dependencies` to update Drupal Core and its dependencies. -1. Run `git diff` to determine if any of the scaffolding files have changed. - Review the files for any changes and restore any customizations to - `.htaccess` or `robots.txt`. -1. Commit everything all together in a single commit, so `web` will remain in - sync with the `core` when checking out branches or running `git bisect`. -1. In the event that there are non-trivial conflicts in step 2, you may wish - to perform these steps on a branch, and use `git merge` to combine the - updated core files with your customized files. This facilitates the use - of a [three-way merge tool such as kdiff3](http://www.gitshah.com/2010/12/how-to-setup-kdiff-as-diff-tool-for-git.html). This setup is not necessary if your changes are simple; - keeping all of your modifications at the beginning or end of the file is a - good strategy to keep merges easy. - -## Generate composer.json from existing project - -With using [the "Composer Generate" drush extension](https://www.drupal.org/project/composer_generate) -you can now generate a basic `composer.json` file from an existing project. Note -that the generated `composer.json` might differ from this project's file. - - -## FAQ - -### Should I commit the contrib modules I download? - -Composer recommends **no**. They provide [argumentation against but also -workrounds if a project decides to do it anyway](https://getcomposer.org/doc/faqs/should-i-commit-the-dependencies-in-my-vendor-directory.md). - -### Should I commit the scaffolding files? - -The [drupal-scaffold](https://github.com/drupal-composer/drupal-scaffold) plugin can download the scaffold files (like -index.php, update.php, …) to the web/ directory of your project. If you have not customized those files you could choose -to not check them into your version control system (e.g. git). If that is the case for your project it might be -convenient to automatically run the drupal-scaffold plugin after every install or update of your project. You can -achieve that by registering `@composer drupal:scaffold` as post-install and post-update command in your composer.json: - -```json -"scripts": { - "post-install-cmd": [ - "@composer drupal:scaffold", - "..." - ], - "post-update-cmd": [ - "@composer drupal:scaffold", - "..." - ] -}, -``` -### How can I apply patches to downloaded modules? - -If you need to apply patches (depending on the project being modified, a pull -request is often a better solution), you can do so with the -[composer-patches](https://github.com/cweagans/composer-patches) plugin. - -To add a patch to drupal module foobar insert the patches section in the extra -section of composer.json: -```json -"extra": { - "patches": { - "drupal/foobar": { - "Patch description": "URL or local path to patch" - } - } -} -``` -### How do I switch from packagist.drupal-composer.org to packages.drupal.org? - -Follow the instructions in the [documentation on drupal.org](https://www.drupal.org/docs/develop/using-composer/using-packagesdrupalorg). - -### How do I specify a PHP version ? - -Currently Drupal 8 supports PHP 5.5.9 as minimum version (see [Drupal 8 PHP requirements](https://www.drupal.org/docs/8/system-requirements/drupal-8-php-requirements)), however it's possible that a `composer update` will upgrade some package that will then require PHP 7+. - -To prevent this you can add this code to specify the PHP version you want to use in the `config` section of `composer.json`: -```json -"config": { - "sort-packages": true, - "platform": {"php": "5.5.9"} -}, -``` +See [installation.md](docs/installation.md) diff --git a/Vagrantfile b/Vagrantfile index 458ecad..bc45427 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -8,6 +8,8 @@ Vagrant.configure("2") do |config| config.vm.provider "virtualbox" do |vb| vb.name = 'dransible' + vb.memory = 2048 + vb.cpus = 1 end # Set the name of the VM. See: http://stackoverflow.com/a/17864388/100134 @@ -16,9 +18,10 @@ Vagrant.configure("2") do |config| config.vm.provision "ansible" do |ansible| ansible.compatibility_mode = "2.0" - ansible.playbook = "ansible/provisioning/main.yml" - ansible.inventory_path = "ansible/hosts.ini" + ansible.playbook = "tools/ansible/provision.yml" + ansible.inventory_path = "tools/ansible/hosts.yml" ansible.become = true + ansible.ask_vault_pass = true end end diff --git a/ansible.cfg b/ansible.cfg index 9bc4efc..370ab6c 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -1,5 +1,6 @@ [defaults] -inventory = ./ansible/hosts.ini +inventory = ./tools/ansible/hosts.yml nocows = True private_key_file = .vagrant/machines/dransible/virtualbox/private_key remote_user = vagrant +retry_files_enabled = False diff --git a/ansible/deploying/1-basic/main.yml b/ansible/deploying/1-basic/main.yml deleted file mode 100644 index 421f38d..0000000 --- a/ansible/deploying/1-basic/main.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -- hosts: dransible - become: true - - tasks: - - name: Creating project directory - file: - path: /var/www/app - state: directory - - - name: Uploading application - synchronize: - src: ../../../../ - dest: /var/www/app - - - name: Installing Composer dependencies - composer: - command: install - working_dir: /var/www/app diff --git a/ansible/hosts.ini b/ansible/hosts.ini deleted file mode 100644 index 121ea91..0000000 --- a/ansible/hosts.ini +++ /dev/null @@ -1 +0,0 @@ -dransible ansible_ssh_host=192.168.33.10 ansible_ssh_port=22 diff --git a/ansible/provisioning/vars/main.yml b/ansible/provisioning/vars/main.yml deleted file mode 100644 index d06ecb4..0000000 --- a/ansible/provisioning/vars/main.yml +++ /dev/null @@ -1,21 +0,0 @@ ---- -apache_vhosts: - - servername: dransible - documentroot: "/var/www/app/web" - -php_packages: - - libapache2-mod-php{{ php_default_version_debian }} - - libpcre3-dev - - php-apcu - - php-sqlite3 - - php{{ php_default_version_debian }}-cli - - php{{ php_default_version_debian }}-common - - php{{ php_default_version_debian }}-curl - - php{{ php_default_version_debian }}-dev - - php{{ php_default_version_debian }}-fpm - - php{{ php_default_version_debian }}-gd - - php{{ php_default_version_debian }}-imap - - php{{ php_default_version_debian }}-json - - php{{ php_default_version_debian }}-mbstring - - php{{ php_default_version_debian }}-opcache - - php{{ php_default_version_debian }}-xml diff --git a/ansible/requirements.yml b/ansible/requirements.yml deleted file mode 100644 index 0b69314..0000000 --- a/ansible/requirements.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -- src: geerlingguy.apache -- src: geerlingguy.composer -- src: geerlingguy.mysql -- src: geerlingguy.php -- src: geerlingguy.php-mysql diff --git a/docs/images/after-deploy.png b/docs/images/after-deploy.png new file mode 100644 index 0000000..74ba288 Binary files /dev/null and b/docs/images/after-deploy.png differ diff --git a/docs/images/before-deploy.png b/docs/images/before-deploy.png new file mode 100644 index 0000000..a774885 Binary files /dev/null and b/docs/images/before-deploy.png differ diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000..2b5f031 --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,19 @@ +# Installation + +1. Run `vagrant up` or `vagrant up --provision` if needed, to start Vagrant and provision the virtual machine using the `tools/ansible/provision.yml` playbook. This will set up a LAMP stack with Apache, MySQL, PHP and Composer. + + If you try loading the site at this point you will see a `The requested URL was not found on this server` message as the site has not yet been deployed. + +  + +1. Run the deploy playbook to deploy the application code to the virtual machine. The Vault password, which is `dransible`, is stored in `tools/ansible/vault-password.txt` as this is an example project. + + ``` + ansible-playbook tools/ansible/deploy.yml \ + -i tools/ansible/hosts.yml \ + --vault-password-file=tools/ansible/vault-password.txt + ``` + +1. Load `http://dransible` in a browser, and you should see a Drupal 8 website. + +  diff --git a/tools/ansible/deploy.yml b/tools/ansible/deploy.yml new file mode 100644 index 0000000..ee98c09 --- /dev/null +++ b/tools/ansible/deploy.yml @@ -0,0 +1,25 @@ +--- +- hosts: dransible + become: true + + roles: + - drupal-settings + - ansistrano.deploy + + vars_files: + - vars/vault.yml + - vars/vars.yml + + vars: + release_drupal_path: "{{ ansistrano_release_path.stdout }}/web" + release_drush_path: "{{ ansistrano_release_path.stdout }}/vendor/bin/drush" + + ansistrano_deploy_via: "rsync" + ansistrano_deploy_from: "{{ playbook_dir }}/../../" + ansistrano_deploy_to: "{{ project_deploy_dir }}" + ansistrano_keep_releases: 5 + ansistrano_after_symlink_shared_tasks_file: "{{ playbook_dir }}/deploy/after-symlink-shared.yml" + ansistrano_after_symlink_tasks_file: "{{ playbook_dir }}/deploy/after-symlink.yml" + ansistrano_after_update_code_tasks_file: "{{ playbook_dir }}/deploy/after-update-code.yml" + ansistrano_shared_paths: + - "{{ project_subdir }}/sites/default/files" diff --git a/tools/ansible/deploy/after-symlink-shared.yml b/tools/ansible/deploy/after-symlink-shared.yml new file mode 100644 index 0000000..cc98bc8 --- /dev/null +++ b/tools/ansible/deploy/after-symlink-shared.yml @@ -0,0 +1,11 @@ +--- +- name: Fix files directory permissions + become: true + file: + path: '{{ project_deploy_dir }}/shared/web/sites/default/files' + state: directory + mode: 0775 + recurse: true + +- name: Install Drupal + command: '{{ release_drush_path }} --root {{ release_drupal_path }} site-install -y --account-pass=admin123 --site-name="PHP South Wales"' diff --git a/tools/ansible/deploy/after-symlink.yml b/tools/ansible/deploy/after-symlink.yml new file mode 100644 index 0000000..ed97d53 --- /dev/null +++ b/tools/ansible/deploy/after-symlink.yml @@ -0,0 +1 @@ +--- diff --git a/tools/ansible/deploy/after-update-code.yml b/tools/ansible/deploy/after-update-code.yml new file mode 100644 index 0000000..bd97d4e --- /dev/null +++ b/tools/ansible/deploy/after-update-code.yml @@ -0,0 +1,22 @@ +--- +- name: Remove settings.php + file: + path: '{{ ansistrano_release_path.stdout }}/web/sites/{{ item.1.name|default("default")}}/settings.php' + state: absent + with_subelements: + - '{{ drupal_settings }}' + - sites + +- name: Link settings.php + file: + src: '/tmp/app/sites/{{ item.1.name|default("default")}}/settings.php' + dest: '{{ ansistrano_release_path.stdout }}/web/sites/{{ item.1.name|default("default")}}/settings.php' + state: link + with_subelements: + - '{{ drupal_settings }}' + - sites + +- name: Install Composer dependencies + composer: + command: install + working_dir: '{{ ansistrano_release_path.stdout }}' diff --git a/tools/ansible/hosts.yml b/tools/ansible/hosts.yml new file mode 100644 index 0000000..24d88dc --- /dev/null +++ b/tools/ansible/hosts.yml @@ -0,0 +1,5 @@ +all: + hosts: + dransible: + ansible_ssh_host: 192.168.33.10 + ansible_ssh_port: 22 diff --git a/ansible/provisioning/main.yml b/tools/ansible/provision.yml similarity index 70% rename from ansible/provisioning/main.yml rename to tools/ansible/provision.yml index 8283105..800bb03 100644 --- a/ansible/provisioning/main.yml +++ b/tools/ansible/provision.yml @@ -10,17 +10,18 @@ - geerlingguy.composer vars_files: - - vars/main.yml + - vars/vault.yml + - vars/vars.yml tasks: - name: Create a database mysql_db: - name: drupal + name: '{{ database_name }}' state: present - name: Add the database user mysql_user: - name: drupal - password: drupal + name: '{{ database_user }}' + password: '{{ database_password }}' priv: '*.*:ALL' state: present diff --git a/tools/ansible/requirements.yml b/tools/ansible/requirements.yml new file mode 100644 index 0000000..9e9d2fb --- /dev/null +++ b/tools/ansible/requirements.yml @@ -0,0 +1,15 @@ +--- +- src: ansistrano.deploy + version: 3.0.1 +- src: ansistrano.rollback + version: 3.0.0 +- src: geerlingguy.apache + version: 3.0.3 +- src: geerlingguy.composer + version: 1.7.3 +- src: geerlingguy.mysql + version: 2.9.4 +- src: geerlingguy.php + version: 3.7.0 +- src: geerlingguy.php-mysql + version: 2.0.2 diff --git a/tools/ansible/rollback.yml b/tools/ansible/rollback.yml new file mode 100644 index 0000000..8a2c695 --- /dev/null +++ b/tools/ansible/rollback.yml @@ -0,0 +1,12 @@ +--- +- hosts: dransible + become: true + + roles: + - ansistrano.rollback + + vars_files: + - vars/vars.yml + + vars: + ansistrano_deploy_to: "{{ project_deploy_dir }}" diff --git a/tools/ansible/vars/vars.yml b/tools/ansible/vars/vars.yml new file mode 100644 index 0000000..e15e467 --- /dev/null +++ b/tools/ansible/vars/vars.yml @@ -0,0 +1,49 @@ +--- +apache_vhosts: + - servername: dransible + documentroot: "{{ project_docroot }}" + +php_packages: + - libapache2-mod-php{{ php_default_version_debian }} + - libpcre3-dev + - php-apcu + - php-sqlite3 + - php{{ php_default_version_debian }}-cli + - php{{ php_default_version_debian }}-common + - php{{ php_default_version_debian }}-curl + - php{{ php_default_version_debian }}-dev + - php{{ php_default_version_debian }}-fpm + - php{{ php_default_version_debian }}-gd + - php{{ php_default_version_debian }}-imap + - php{{ php_default_version_debian }}-json + - php{{ php_default_version_debian }}-mbstring + - php{{ php_default_version_debian }}-opcache + - php{{ php_default_version_debian }}-xml + +ansistrano_current_dir: current + +project_deploy_dir: /var/www/app +project_subdir: web +project_docroot: "{{ project_deploy_dir }}/{{ ansistrano_current_dir }}/{{ project_subdir }}" + +database_name: "{{ vault_database_name }}" +database_password: "{{ vault_database_password }}" +database_user: "{{ vault_database_user }}" +hash_salt: "{{ vault_hash_salt }}" + +drupal_settings: + - drupal_root: /tmp/app + sites: + - name: default + settings: + databases: + default: + default: + driver: mysql + host: localhost + database: '{{ database_name }}' + username: '{{ database_user }}' + password: '{{ database_password }}' + hash_salt: '{{ hash_salt }}' + config_directories: + sync: ../config/sync diff --git a/tools/ansible/vars/vault.yml b/tools/ansible/vars/vault.yml new file mode 100644 index 0000000..0a9d2b7 --- /dev/null +++ b/tools/ansible/vars/vault.yml @@ -0,0 +1,12 @@ +$ANSIBLE_VAULT;1.1;AES256 +61653737643939333936636566323038316561323033633831656536643733343639356232356538 +3238306433353165626531646366646132626233646561390a386534373066346234373237373865 +64363663323662666261616136663239366634643135386433613639313532653262373932386166 +3736626562653963390a666566643537356436303166356130616530306562303565323637343631 +31333837303166623130353530636366663464346431643837303637343863353764373236303861 +65623364383839623063393466303637653865393031626234366361333261633238383261646233 +31313131393933636236326463313830346534613862333733306265633962663964386638623435 +64323437373262653862383063343436633237353865386539653263623935626431363362363436 +37306338313134383334316232383238663830346231393638353834663730663663626465353862 +34366132653430326230613164333533326463346638393866636465343237613263346232663538 +306164366133323334373862353238343834 diff --git a/tools/ansible/vault-password.txt b/tools/ansible/vault-password.txt new file mode 100644 index 0000000..59a4e88 --- /dev/null +++ b/tools/ansible/vault-password.txt @@ -0,0 +1 @@ +dransible