Compare commits

...

33 commits

Author SHA1 Message Date
b3ad73513f Re-order README links 2019-11-26 10:07:08 +00:00
12b8b089ba Store Vault password in a file
This is fine as it's just an example project.
2019-11-26 10:06:58 +00:00
ca10d38c79 Move ansible directory into tools 2019-11-26 09:12:06 +00:00
5e90535248 Add installation instructions
Fixes 
2019-10-31 11:03:35 +00:00
9decb1ec43 Update vault password 2019-10-31 10:52:59 +00:00
1cf3c711c3 Update variable names 2019-07-23 01:45:37 +01:00
9eb333da90 Generate settings file per deployment 2019-07-23 01:26:17 +01:00
0f22c4e8ba Fix files directory permissions 2019-07-23 01:25:59 +01:00
24ffbe4fc0 Install Drupal rather than clear cache 2019-07-23 01:25:49 +01:00
ce94945655 Remove ansistrano_shared_files 2019-07-23 00:50:20 +01:00
96e1ca8d7c Update inventory file name 2019-07-23 00:49:16 +01:00
e9d18939b5 Add variables for drupal_settings 2019-07-18 11:34:29 +01:00
d8f3cbf76b Include vault vars 2019-07-18 11:34:29 +01:00
74e75ac8a6 Add local drupal-settings role 2019-07-18 11:34:29 +01:00
60880f668b Un-share settings.php 2019-07-18 11:34:29 +01:00
69f094523a Replace hosts.ini with hosts.yml 2019-07-18 11:34:29 +01:00
96f4752d2e Tweak Vagrant settings 2019-02-07 08:32:20 +00:00
74839b539d Add versions 2019-02-07 08:06:33 +00:00
b402df87af Add Drush tasks 2019-01-23 14:22:34 +00:00
62a9b204a0 Disable retry files 2019-01-23 13:18:21 +00:00
43e80fa822 Change hook 2019-01-23 12:51:15 +00:00
35d72e4210 Move ansistrano_current_dir 2019-01-23 12:49:43 +00:00
1f9756cc00 Add rollback playbook 2019-01-22 22:55:54 +00:00
d1d88526b2 Increase memory and CPUs 2019-01-22 22:42:53 +00:00
e239e43e6b Share settings.php and files between releases 2019-01-22 22:42:41 +00:00
7152ebc412 Move composer install into a build hook 2019-01-22 22:05:29 +00:00
80dcc8a215 Use ansistrano for deployment 2019-01-22 22:03:51 +00:00
ed32463a57 Add ansistrano roles 2019-01-22 21:50:33 +00:00
199bc8f0ed Re-structure ansible files 2019-01-22 21:10:25 +00:00
e11d7e669a Re-enable roles 2019-01-22 21:05:24 +00:00
57e8aa59fa Use variables 2019-01-22 21:04:37 +00:00
5b4c91091e Add Ansible Vault 2019-01-22 20:56:02 +00:00
fe1640c5b8 Move db details into a file 2019-01-22 20:11:15 +00:00
21 changed files with 198 additions and 190 deletions

150
README.md
View file

@ -1,143 +1,21 @@
# Composer template for Drupal projects
# Dransible
[![Build Status](https://travis-ci.org/drupal-composer/drupal-project.svg?branch=8.x)](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)

7
Vagrantfile vendored
View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -1 +0,0 @@
dransible ansible_ssh_host=192.168.33.10 ansible_ssh_port=22

View file

@ -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

View file

@ -1,6 +0,0 @@
---
- src: geerlingguy.apache
- src: geerlingguy.composer
- src: geerlingguy.mysql
- src: geerlingguy.php
- src: geerlingguy.php-mysql

Binary file not shown.

After

(image error) Size: 675 KiB

Binary file not shown.

After

(image error) Size: 554 KiB

19
docs/installation.md Normal file
View file

@ -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.
![A browser showing a 'Not Found' error](images/before-deploy.png)
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.
![A browser showing the front page of a Drupal website](images/after-deploy.png)

25
tools/ansible/deploy.yml Normal file
View file

@ -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"

View file

@ -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"'

View file

@ -0,0 +1 @@
---

View file

@ -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 }}'

5
tools/ansible/hosts.yml Normal file
View file

@ -0,0 +1,5 @@
all:
hosts:
dransible:
ansible_ssh_host: 192.168.33.10
ansible_ssh_port: 22

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,12 @@
---
- hosts: dransible
become: true
roles:
- ansistrano.rollback
vars_files:
- vars/vars.yml
vars:
ansistrano_deploy_to: "{{ project_deploy_dir }}"

View file

@ -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

View file

@ -0,0 +1,12 @@
$ANSIBLE_VAULT;1.1;AES256
61653737643939333936636566323038316561323033633831656536643733343639356232356538
3238306433353165626531646366646132626233646561390a386534373066346234373237373865
64363663323662666261616136663239366634643135386433613639313532653262373932386166
3736626562653963390a666566643537356436303166356130616530306562303565323637343631
31333837303166623130353530636366663464346431643837303637343863353764373236303861
65623364383839623063393466303637653865393031626234366361333261633238383261646233
31313131393933636236326463313830346534613862333733306265633962663964386638623435
64323437373262653862383063343436633237353865386539653263623935626431363362363436
37306338313134383334316232383238663830346231393638353834663730663663626465353862
34366132653430326230613164333533326463346638393866636465343237613263346232663538
306164366133323334373862353238343834

View file

@ -0,0 +1 @@
dransible