---
myst:
html_meta:
"description": ""
"property=og:description": ""
"property=og:title": ""
"keywords": ""
---
# Customized Use
We intend that you should be able to make most changes by changing default variable settings in your `local_configure.yml` file.
We've made a serious effort to make sure that all those settings are documented in the `Plone's Ansible Playbook ` documentation.
For example, if you want to change the time at which backup occurs,
you can check the doc and discover that we have a [plone-backup-at setting](https://5.docs.plone.org/external/ansible-playbook/docs/plone.html#plone-backup-at).
The default setting is:
```yaml
plone_backup_at:
minute: 30
hour: 2
weekday: "*"
```
That's 02:30 every morning.
To make it 03:57 instead, use:
```yaml
plone_backup_at:
minute: 57
hour: 3
weekday: "*"
```
in your `local_configure.yml` file.
## Common Customization Points
Let's review the settings that are commonly changed.
### Plone Setup
#### Eggs And Versions
You're likely to want to add Python packages to your Plone installation to enable add-on functionality.
Let's say you want to add [collective.easyform](https://pypi.org/project/collective.easyform) and [webcouturier.dropdownmenu](https://pypi.org/project/webcouturier.dropdownmenu/).
Add to your `local_configure.yml`:
```yaml
plone_additional_eggs:
- collective.easyform
- webcouturier.dropdownmenu
```
If you add eggs, you should nearly always specify their versions:
```yaml
plone_additional_versions:
- "collective.easyform = 2.0.0b2"
- "webcouturier.dropdownmenu = 3.0.1"
```
That takes care of packages that are available on the [Python Package Index](https://pypi.org/).
What if your developing packages via git?
```yaml
plone_sources:
- "some.other.package = git git://example.com/git/some.other.package.git rev=1.1.5"
```
There's more that you can do with the `plone_sources` setting.
See the docs!
#### Buildout From Git Repository
It's entirely possible that the buildout created by the playbook won't be adequate to your needs.
If that's the case, you may check out your whole buildout directory via git:
```yaml
buildout_git_repo: https://github.com/plone/plone.com.ansible.git
buildout_git_version: master
```
Make sure you check the [documentation on this setting](https://5.docs.plone.org/external/ansible-playbook/docs/plone.html#plone-buildout-git-repo).
Even if you use your own buildout, you'll need to make sure that some of the playbook settings reflect your configuration.
#### Running Buildout And Restarting Clients
By default, the playbook tries to figure out if {command}`buildout` needs to be run.
If you add an egg, for example, the playbook will run buildout to make the buildout-controlled portions of the installation update.
If you don't want that behavior, change it:
```yaml
plone_autorun_buildout: no
```
If `autorun` is turned off, you'll need to log in to run buildout after it completes the first time.
(When you first run the playbook on a new server, buildout will always run.)
If automatically running buildout bothers you, automatically restarting Plone after running buildout will seem foolish.
You may turn it off:
```yaml
plone_restart_after_buildout: no
```
That gives you the option to log in and run the client restart script.
If you're conservative, you'll first try starting and stopping the reserved client.
```{note}
By the way, if buildout fails, your playbook run will halt.
You don't need to worry that an automated restart might occur after a failed buildout.
```
(web-hosting-options)=
### Web Hosting Options
It's likely that you're going to need to make some changes in nginx configuration.
Most of those changes are made via the `webserver_virtualhosts` setting.
`webserver_virtualhosts` should contain a list of the hostnames you wish to support.
For each one of those hostnames, you may make a variety of setup changes.
The playbook automatically creates a separate host file for each host you configure.
Here's the default setting:
```yaml
webserver_virtualhosts:
- hostname: "{{ inventory_hostname }}"
default_server: yes
zodb_path: /Plone
```
This connects your inventory hostname for the server to the /Plone directory in the ZODB.
A more realistic setting might look something like:
```yaml
webserver_virtualhosts:
- hostname: plone.org
default_server: yes
aliases:
- www.plone.org
zodb_path: /Plone
port: 80
protocol: http
client_max_body_size: 4M
- hostname: plone.org
zodb_path: /Plone
address: 92.168.1.150
port: 443
protocol: https
certificate_file: /thiscomputer/path/mycert.crt
key_file: /thiscomputer/path/mycert.key
```
Here we're setting up two separate hosts, one for `http` and one for `https`.
Both point to the same ZODB path, though they don't have to.
The https host item also refers to a key/certificate file pair on the Ansible host machine.
They'll be copied to the remote server.
Alternatively, you could specify use of certificates already on the server:
```yaml
webserver_virtualhosts:
- hostname: ...
...
certificate:
key: /etc/ssl/private/ssl-cert-snakeoil.key
crt: /etc/ssl/certs/ssl-cert-snakeoil.pem
```
```{caution}
One hazard for the current playbook web server support is that it does **not** delete old host files.
If you had previously set up `www.mynewclient.com` and then deleted that item from the playbook host list, the nginx host file would remain.
Log in and delete it if needed.
Yes, this is an exception to the "don't login to change configuration rule".
```
```{seealso}
For an example of using free Let's Encrypt certificates with certbot and auto-renewal, see {doc}`letsencrypt-certbot`.
```
#### Extra tricks
There are a couple of extra setting that allow you to do extra customization if you know nginx directives.
For example:
```yaml
- hostname: plone.com
protocol: http
extra: return 301 https://$server_name$request_uri;
```
This is a *redirect to https*.
It takes advantage of the fact that if you do not specify a zodb_path,
the playbook will not automatically create a location stanza with a rewrite and proxy_pass directives.
### Mail Relay
Some cloud server companies do not allow servers to directly send mail to standard mail ports.
Instead, they require that you use a *mail relay*.
This is a typical setup:
```yaml
mailserver_relayhost: smtp.sendgrid.net
mailserver_relayport: 587
mailserver_relayuser: yoursendgriduser
mailserver_relaypassword: yoursendgridpassword
```
### Bypassing Components
Remember our stack diagram?
The only part of the stack that you're stuck with is Plone.
All the other components my be replaced.
To replace them, first prevent the playbook from installing the default component.
Then, use a playbook of your own to install the alternative component.
For example, to install an alternative to the Postfix mail agent, add:
```yaml
install_mailserver: no
```
```{note}
If you choose not to install the HAProxy, varnish or Nginx, you take on some extra responsibilities.
You're going to need to make sure in particular that your port addresses match up.
If, for example, you replace HAProxy, you will need to point varnish to the new load-balancer's frontend.
You'll need to point the new load balancer to the ZEO clients.
```
### Multiple Plones Per Host
We've covered the simple case of having one Plone server installed on your server.
In fact, you may install additional Plones.
To do so, you create a list variable `playbook_plones` containing all the settings that are specific to one or more of your Plone instances.
Nearly all the plone\_\* variables, and a few others like loadbalancer_port and webserver_virtualhosts may be set in playbook_plones.
Here's a simple example:
```yaml
playbook_plones:
- plone_instance_name: primary
plone_zeo_port: 8100
plone_client_base_port: 8081
loadbalancer_port: 8080
webserver_virtualhosts:
- hostname: "{{ inventory_hostname }}"
aliases:
- default
zodb_path: /Plone
- plone_instance_name: secondary
plone_zeo_port: 7100
plone_client_base_port: 7081
loadbalancer_port: 7080
webserver_virtualhosts:
- hostname: www.plone.org
zodb_path: /Plone
```
Note that you're going to have to specify a minimum of an instance name, a zeo port and a client base port (the address of client1 for this Plone instance.)
You may specify up to four items in your `playbook_plones` list.
If you need more, see the docs as you'll need to make a minor change in the main playbook.
### The Plone Role -- Using It Independently
For big changes, you may find that the full playbook is of little or no use.
In that case, you may still wish to use Plone's Ansible Role independently, in your own playbooks.
The [Plone server role](https://github.com/plone/ansible.plone_server) is maintained separately, and may become a role in your playbooks if it works for you.