cookbook 'magentostack', '= 2.1.1'
magentostack (15) Versions 2.1.1 Follow3
Provides a full Magento stack
cookbook 'magentostack', '= 2.1.1', :supermarket
knife supermarket install magentostack
knife supermarket download magentostack
magentostack
Supported Platforms
- CentOS 6.5
- Ubuntu 12.04 (untested)
- Ubuntu 14.04 (untested)
Supported Magento version
Community Edition >= 1.9
Enterprise Edition >= 1.14.1
Requirements
- Chef 12 or greater.
Cookbooks
stack_commons
platformstack
rackspacecloud
rackspace_iptables
varnish
modman
apache2
apt
ark
git
svn
build-essential
certificate
chef-sugar
cron
database
git
logrotate
mysql-multi
nfs
openssl
parted
partial_search
php-fpm
redisio
yum
yum-ius
yum-epel
xml
xmledit
Recipes
apache-fpm
This recipe sets Apache2 configuration so you can deploy your Magento code.
Configures Apache with PHP FPM.
Enables magento required php modules.
Create a self-signed certificate if node['magentostack']['web']['ssl_autosigned'] (default to true).
Create a Vhost for Magento (non-SSL).
Create a Vhost for Magento (SSL).
- toggles
- certificate generation node['magentostack']['web']['ssl_autosigned']
You may disable SSL support by setting node.set['magentostack']['web']['ssl'] = false
. Note that you may still need to be sure Magento redirects work correctly in this case.
You may supply a custom SSL certificate by setting one or more of these values:
node['magentostack']['web']['ssl_custom'] = true
node['magentostack']['web']['ssl_custom_databag'] = 'certificates'
node['magentostack']['web']['ssl_custom_databag_item'] = 'magento'
See instructions in the certificate cookbook for how to prepare an appropriate encrypted data bag.
Only Community Edition >= 1.9 and Enterprise Edition >= 1.14.1 are supported by Magentostack, therefore it's PHP 5.5 only
<!---
Only for Magento CE <1.9 or EE < 1.14 (not supported yet)
apache2::mod_fastcgi doesn't allow to compile mod_Fastcgi from source, therefore it will not use the mod_fastcgi patched version. It means Ubuntu with Magento CE <1.9 or EE < 1.14 might have some bugs. [References](http://www.magentocommerce.com/boards/m/viewthread/229253/)
--->
varnish and modman
In order to use Varnish, include the varnish recipe in your wrapper or ensure you're set to community edition, where Varnish is enabled by default. This installs varnish using default settings, as well as modman and installs the turpentine module for Magento.
Under System > Configuration > Web > Secure
change the Offloader header value to HTTP_X_FORWARDED_PROTO
(from the default SSL_OFFLOADED) and make sure the Base URL has https
for the protocol, then save.
You should also ensure you set node['magentostack']['varnish']['secret']
to something on each server, and then also set that value in the Administration GUI in Magento, and do an initial flush of the Varnish cache.
See the main page about turpentine, the installation instructions for turpentine, and the modman Github site, for more information and documentation.
gluster
Sets up glusterfs based on the node['rackspace_gluster']['config']['server']['glusters']
attribute.
This may involve some manual setup, it is glusterfs afterall
magento_admin
Set up a cronjob to run Magento admin tasks.
magento_install
Download and extract Magento, consulting node['magentostack']['install_method']
for 'cloudfiles', 'ark', or 'git'.
magento_configure
Install Magento by running install.php (basic configuration, DB bootstrap, SSL url etc...).
Or by copying a provided local.xml.template and editing it in-place from there.
Note: It will always edit the local.xml after the fact with values from chef.
mysql_add_drive
Formats /dev/xvde1 and will prepare it for the mysql datadir.
Creates the mysql user and manages the /var/lib/mysql mountpoint.
mysql_holland
Warning
mysql_holland package will install python-setup tools preventing to apply this fix https://github.com/rackspace-cookbooks/stack_commons/pull/86, so you must include magentostack::mysql_holland as late as possible in your run_list.
Installs holland.
Will set up a backup job based on if you are running as a slave or not.
mysql_master
Sets up mysql master (runs the mysql_base recipe as well).
Will allow slaves to connect (via iptables).
mysql_slave
Sets up the mysql slave (runs the mysql_base recipe as well).
Allows the master to connect (via iptables).
nfs_client and nfs_server
Server recipe installs nfs server and configures an export (by default, under /exports) for magento media.
Client recipe creates a mount point, and mounts the export from the server (uses search with a tag to find the server).
newrelic
Sets up newrelic and the php agent for newrelic.
redis recipes
Please note that the redis recipes use an accumulator pattern, just like their upstream cookbook. This means you must include all redis recipes for instances and they will build on to the data structure containing all redis instances.
Once all redis instances have been defined, call magentostack::redis_configure
to actually install and configure all redis masters, slaves, or sentinels that were previously declared using the individual recipes below, as well as configure any iptables rules that are required (assuming platformstack has iptables turned on).
For example, this would an appropriate runlist for a single instance, a single
slave, and the appropriate sentinel:
magentostack::redis_single
magentostack::redis_single_slave
magentostack::redis_sentinel
magentostack::redis_configure
Example for installing just the session instance:
magentostack::redis_session
magentostack::redis_configure
or only its slave:
magentostack::redis_session_slave
magentostack::redis_configure
Example to get a sentinel only:
magentostack::redis_sentinel
magentostack::redis_configure
redis_single
Configures a standalone redis server in node['redisio']['servers']
.
Redis server bound to node['magentostack']['redis']['bind_port_single']
.
Tags node with magentostack_redis
and magentostack_redis_single
for discovery.
redis_object, redis_page, redis_session
Configures a redis server in node['redisio']['servers']
.
Instance is bound to node['magentostack']['redis']['bind_port_X']
where X is object, page, or session.
Tags node with magentostack_redis
and magentostack_redis_X
for later discovery.
redis_sentinel
Sets up redis sentinel bound to node['magentostack']['redis']['bind_port_sentinel']
.
Uses discovery in libraries/util.rb
to find all redis servers in current chef environment.
Discovery is based on tags and chef environment, see node['magentostack']['redis']['discovery_query']
to override.
Determines a master (using tags) in this order: redis_session.rb, redis_single.rb, none
.
Assumes a session store is the most important to monitor (upstream only supports configuring sentinel to monitor one master).
redis_configure
Shortcut to run all of the redisio recipes needed to install & configure redis.
Should be used after any calls to the redis_(single/object/page/session/sentinel) recipes build any iptables rules and call add_iptables_rule
on them.
Attributes
default
-
default['magentostack']['newrelic']['application_monitoring'] = ''
- controls if we allow newrelic to to do application monitoring
- is set to
'true'
in the newrelic recipe
-
default['magentostack']['mysql']['databases'] = {}
- contains a list of databases to set up (along with users / passwords)
-
default['magentostack']['apache']['sites'] = {}
- Default attribute required by stack_commons not used by Magentostack
Apache-fpm
-
default['magentostack']['web']['domain']
- Vhost Servername
-
default['magentostack']['web']['http_port']
- port for non-SSL vhost
-
default['magentostack']['web']['https_port']
- port for SSL vhost default['magentostack']['web']['server_aliases'] = node['fqdn']
-
default['magentostack']['web']['cookbook']
anddefault['magentostack']['web']['template']
- where to find the Vhost templates
-
default['magentostack']['web']['fastcgi_cookbook']
anddefault['magentostack']['web']['fastcgi_template']
- where to find the Fast-cgi templates
-
default['magentostack']['web']['dir']
- Documenent root (where to put Magento code)
-
default['magentostack']['web']['ssl_key']
anddefault['magentostack']['web']['ssl_cert']
anddefault['magentostack']['web']['ssl_chain']
- where are the certificates and keys and a chain/intermediate(might be useful when disabling self-signed)
Magento
-
default['magentostack']['config'][*]
- install.php related options, see https://github.com/AutomationSupport/magentostack/blob/master/definitions/magento_initial_configuration.rb
-
normal['magentostack']['mysql']['databases']['magento_database']
- create Magento DB and Magento DB users
-
default['magentostack']['download_url']
anddefault['magentostack']['checksum']
- where to get Magento and the file checksum (faster re-converge)
- default['magentostack']['flavor'] = 'community' # could also be enterprise
- controls if the stack should try to configure a full page cache or not
NFS Server and client
search query for discovery of nfs server
# Used to override the permitted client IPs on the nfs_server
node['magentostack']['nfs_server']['override_allow'] = ['1.2.3.4', '5.6.7.8']
# Used to override the NFS mount on clients, not used by default
node['magentostack']['nfs_server']['override_host'] = '1.2.3.4'
# where the export lives on the NFS server
node['magentostack']['nfs_server']['export_name'] = 'magento_media'
node['magentostack']['nfs_server']['export_root'] = '/export'
# how to search for an NFS server
node['magentostack']['nfs_server']['discovery_query'] = "tags:magentostack_nfs_server AND chef_environment:#{node.chef_environment}"
# clients
node['magentostack']['nfs_client']['mount_point'] = '/mnt/magento_media'
node['magentostack']['nfs_client']['symlink_target'] = 'media' # within /var/www/html/magento
gluster
contains attributes used in setting up gluster, node the commented out section, it helps to actually hard code these IPs
monitoring
controls how cloud_monitoring is used within magentostack
php_fpm
shouldn't really be messed with
redis
You can define a password for each redis instance(or for the single one) using the run_state attribute type.
This type prevents to store passwords on the node. The passwords will be used to set up the Redis instances and configure Magento.
Multiple redis instances
node.run_state['magentostack_redis_password_session'] = 'runstatepasswordsession'
node.run_state['magentostack_redis_password_object'] = 'runstatepasswordobject'
node.run_state['magentostack_redis_password_page'] = 'runstatepasswordpage'
Single redis instance
node.run_state['magentostack_redis_password_single'] = 'runstatepasswordsingle'
Usage
Suggested datastructures
Magento Admin:
json
{
"run_list": [
"recipe[platformstack]",
"recipe[magentostack::apache-fpm]",
"recipe[magentostack::magento_install]",
"recipe[magentostack::newrelic]",
"recipe[magentostack::_find_mysql]",
"recipe[magentostack::magento_configure]",
"recipe[magentostack::magento_admin]",
"recipe[magentostack::nfs_client]",
"recipe[java::default]",
"recipe[elkstack::agent]"
]
}
Magento Worker
json
{
"run_list": [
"recipe[platformstack]",
"recipe[magentostack::apache-fpm]",
"recipe[magentostack::magento_install]",
"recipe[magentostack::newrelic]",
"recipe[magentostack::_find_mysql]",
"recipe[magentostack::magento_configure]",
"recipe[magentostack::nfs_client]",
"recipe[java::default]",
"recipe[elkstack::agent]"
]
}
Magento MySQL Master
json
{
"run_list": [
"recipe[platformstack]",
"recipe[magentostack::mysql_master]",
"recipe[magentostack::mysql_holland]",
"recipe[java::default]",
"recipe[elkstack::agent]"
]
}
Magento Redis
json
{
"run_list": [
"recipe[platformstack]",
"recipe[magentostack::redis_single]",
"recipe[magentostack::redis_configure]",
"recipe[java::default]",
"recipe[elkstack::agent]"
]
}
Magento Elkstack
json
{
"run_list": [
"recipe[java::default]",
"recipe[elkstack::cluster]",
"recipe[elkstack::acl]"
]
}
Magento NFS Server
json
{
"run_list": [
"recipe[apt]",
"recipe[platformstack]",
"recipe[magentostack::configure_disk]",
"recipe[magentostack::nfs_server]",
"recipe[java::default]",
"recipe[elkstack::agent]"
]
}
Users
To add users to the servers, you will need to set an attribute and add the user information to an encrypted or normal data bag.
node['magentostack']['users'] = true
Example user entry in data bag:
{ "jsmith": { "username": "jsmith", "shell": "/bin/bash", "sudo": true, "ssh_keys": "ssh-rsa AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA john.smith", "groups": ["apache", "wheel"] } }
The supported options are: comment uid home shell password system_user manage_home create_group ssh_keys ssh_keygen non_unique action username groups
New Relic Monitoring
To configure New Relic, make sure the node['newrelic']['license']
attribute is set and include the platformstack
cookbook in your run_list. You can also run the magentostack::newrelic
recipe for some more advanced monitors.
Contributing
https://github.com/rackspace-cookbooks/contributing/blob/master/CONTRIBUTING.md
Authors
Authors:: Rackspace devops-chef@rackspace.com
License
# Copyright 2015, Rackspace Hosting
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
Dependent cookbooks
Contingent cookbooks
There are no cookbooks that are contingent upon this one.
magentostack CHANGELOG
2.1.1
- Block .svn and .git directories in Apache vhost, #220
2.1.0
- Feature: add users from databag
- Feature: add cloud monitoring
- Fix: Update path; mysqld is apparently now in /usr/sbin
- Fix: add missing users dependency
2.0.8
- Open up the port for varnish.
2.0.7
- Use existing node.run_state values if they are already set. We should clean this up in general, more, but this is a quick fix for a specific issue I ran into.
- Allow git branch to be specified when deploying via Git.
2.0.6
- Support passing 'timeout' to the subversion resource for deployment type 'svn'
2.0.5
- Support passing svn_info to the subversion resource for deployment type 'svn'
2.0.4
- Grab the crypt key from run_state as well as node attributes.
- Add support for SVN deploy method
2.0.3
- Do not pre-create magento dir if a git checkout is intended.
2.0.2
- Feature: Add option to enable git submodules when using git as the
install_method
.
2.0.1
- We should not pass
false
to the file resource, while configuring the Varnish secret. This prevents that while still guarding against a missing value.
2.0.0
- Release new version, after moving repository and removing dependency pinning.
1.1.2
- Ensure we list most relevant dependencies first, to make Berkshelf solve for them first (#173)
1.1.1
- Keep consistent naming for encryption key. (#163)
1.1.0
- Allow ES and NFS data to live under one mount (#161)
1.0.0
- Add split read and write behavior, move some attribute namespaces (#177)
0.0.3
- Add option to create DNS entry for cloud load balancer (#153)
0.0.1
- Add elkstack back in to the build for checkmate (#152)
- Add kibana username and password to checkmate blueprints/map
- Add redis cleanup cronjob to admin node (#151)
- Default to empty string for database prefix (#149)
- Add mbstring package (#146)
- Newer chef version requirements (#145)
- Test cloud files install method, works flawlessly
- Split install methods into ark, cloudfiles, or none
- Add 'cloudfiles' install method, used rackspacecloud LWRPs
- Adjust configuration of magento to write out shell script with configuration options instead of calling it inline.
- Guard call to
mysql-multi::_find_master
(we probably should not be using it, opened #30 to discuss), callmysql-multi::master
instead of base so we get a node we can find later. - Add 'expanded' default recipe in wrapper that converges separate redis instances instead of a single one. This should now handle any configuration of runlist thrown at it.
- Add redisio as a direct dependency, and in Berksfile until release. redis-multi is too simplistic for this deployment, and some bugs are fixed in git that aren't released yet
- Add separate redis recipes for session store and page, object caches and their slaves
- Add redis sentinel recipes that find the right instance
- Add expanded default recipe, that converges individual components (like 3 redis vs. single redis)
- Add a redis discovery recipe that finds any redis instances in the same chef environment
- Add iptables to
::redis_configure
recipe - Add tags to node before saving node, so tags are findable on node.save
- Add library with methods to discover redis instances, find master instances, recompute redis attributes, and get the best IP for a node from its name
- Add Apache vhost, cleanup testing for things we didn't converge
- Remove return on missing attribute
- Could not pass testing with listen_ports mixing node.default and node.set
- Remove template for magentostack.ini, since actual source file was already removed
- Switch to node.deep_fetch with additional guards, since some of the attributes were removed here
- s/phpstack/magentostack/g everywhere
Foodcritic Metric
2.1.1 failed this metric
FC031: Cookbook without metadata file: /tmp/cook/ad123e56f7cbd4dcbe2015c8/magentostack/metadata.rb:1
FC045: Consider setting cookbook name in metadata: /tmp/cook/ad123e56f7cbd4dcbe2015c8/magentostack/metadata.rb:1
2.1.1 failed this metric
FC045: Consider setting cookbook name in metadata: /tmp/cook/ad123e56f7cbd4dcbe2015c8/magentostack/metadata.rb:1