Commit 1f8f44d7035fdcf8b9b4025f8404172659ce8a31

Authored by nollieheel
1 parent 3c4b4df6

Create version 0.1.0 of cookbook

  1 +*~
  2 +*#
  3 +.#*
  4 +\#*#
  5 +.*.sw[a-z]
  6 +*.un~
  7 +pkg/
  8 +
  9 +# Berkshelf
  10 +.vagrant
  11 +/cookbooks
  12 +Berksfile.lock
  13 +
  14 +# Bundler
  15 +Gemfile.lock
  16 +bin/*
  17 +.bundle/*
  18 +
  19 +.kitchen/
  20 +.kitchen.local.yml
... ...
  1 +---
  2 +driver:
  3 + name: ec2
  4 + aws_ssh_key_id: cfe_stg_20160222
  5 + security_group_ids: ["sg-7f6fda18"]
  6 + region: us-west-2
  7 + availability_zone: b
  8 + subnet_id: subnet-d530d8b1
  9 + instance_type: t2.micro
  10 + associate_public_ip: true
  11 + require_chef_omnibus: true
  12 + shared_credentials_profile: earth
  13 +
  14 +provisioner:
  15 + name: chef_solo
  16 +
  17 +platforms:
  18 + - name: ubuntu-14.04
  19 + driver:
  20 + image_id: ami-3d2cce5d
  21 + transport:
  22 + username: ubuntu
  23 + ssh_key: ~/.ssh/cfe_stg_20160222.pem
  24 +
  25 +suites:
  26 + - name: default
  27 + run_list:
  28 + - recipe[cfe-mariadb::default]
  29 + - recipe[cfe-mariadb::backup2s3]
  30 + attributes:
... ...
1   -source 'https://supermarket.getchef.com'
  1 +source "https://supermarket.chef.io"
2 2
3   -cookbook 'mariadb', '~> 0.2.12'
4   -cookbook 'mysql2_chef_gem', '~> 1.0.2'
5   -cookbook 'database', '~> 4.0.9'
6   -cookbook 'awscli', '~> 1.0.1'
  3 +metadata
... ...
  1 +# 0.1.0
  2 +
  3 +Initial release of cfe-mariadb
... ...
  1 +source 'https://rubygems.org'
  2 +
  3 +gem "test-kitchen"
  4 +gem "kitchen-ec2"
  5 +gem "ec2"
... ...
  1 + Apache License
  2 + Version 2.0, January 2004
  3 + http://www.apache.org/licenses/
  4 +
  5 + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
  6 +
  7 + 1. Definitions.
  8 +
  9 + "License" shall mean the terms and conditions for use, reproduction,
  10 + and distribution as defined by Sections 1 through 9 of this document.
  11 +
  12 + "Licensor" shall mean the copyright owner or entity authorized by
  13 + the copyright owner that is granting the License.
  14 +
  15 + "Legal Entity" shall mean the union of the acting entity and all
  16 + other entities that control, are controlled by, or are under common
  17 + control with that entity. For the purposes of this definition,
  18 + "control" means (i) the power, direct or indirect, to cause the
  19 + direction or management of such entity, whether by contract or
  20 + otherwise, or (ii) ownership of fifty percent (50%) or more of the
  21 + outstanding shares, or (iii) beneficial ownership of such entity.
  22 +
  23 + "You" (or "Your") shall mean an individual or Legal Entity
  24 + exercising permissions granted by this License.
  25 +
  26 + "Source" form shall mean the preferred form for making modifications,
  27 + including but not limited to software source code, documentation
  28 + source, and configuration files.
  29 +
  30 + "Object" form shall mean any form resulting from mechanical
  31 + transformation or translation of a Source form, including but
  32 + not limited to compiled object code, generated documentation,
  33 + and conversions to other media types.
  34 +
  35 + "Work" shall mean the work of authorship, whether in Source or
  36 + Object form, made available under the License, as indicated by a
  37 + copyright notice that is included in or attached to the work
  38 + (an example is provided in the Appendix below).
  39 +
  40 + "Derivative Works" shall mean any work, whether in Source or Object
  41 + form, that is based on (or derived from) the Work and for which the
  42 + editorial revisions, annotations, elaborations, or other modifications
  43 + represent, as a whole, an original work of authorship. For the purposes
  44 + of this License, Derivative Works shall not include works that remain
  45 + separable from, or merely link (or bind by name) to the interfaces of,
  46 + the Work and Derivative Works thereof.
  47 +
  48 + "Contribution" shall mean any work of authorship, including
  49 + the original version of the Work and any modifications or additions
  50 + to that Work or Derivative Works thereof, that is intentionally
  51 + submitted to Licensor for inclusion in the Work by the copyright owner
  52 + or by an individual or Legal Entity authorized to submit on behalf of
  53 + the copyright owner. For the purposes of this definition, "submitted"
  54 + means any form of electronic, verbal, or written communication sent
  55 + to the Licensor or its representatives, including but not limited to
  56 + communication on electronic mailing lists, source code control systems,
  57 + and issue tracking systems that are managed by, or on behalf of, the
  58 + Licensor for the purpose of discussing and improving the Work, but
  59 + excluding communication that is conspicuously marked or otherwise
  60 + designated in writing by the copyright owner as "Not a Contribution."
  61 +
  62 + "Contributor" shall mean Licensor and any individual or Legal Entity
  63 + on behalf of whom a Contribution has been received by Licensor and
  64 + subsequently incorporated within the Work.
  65 +
  66 + 2. Grant of Copyright License. Subject to the terms and conditions of
  67 + this License, each Contributor hereby grants to You a perpetual,
  68 + worldwide, non-exclusive, no-charge, royalty-free, irrevocable
  69 + copyright license to reproduce, prepare Derivative Works of,
  70 + publicly display, publicly perform, sublicense, and distribute the
  71 + Work and such Derivative Works in Source or Object form.
  72 +
  73 + 3. Grant of Patent License. Subject to the terms and conditions of
  74 + this License, each Contributor hereby grants to You a perpetual,
  75 + worldwide, non-exclusive, no-charge, royalty-free, irrevocable
  76 + (except as stated in this section) patent license to make, have made,
  77 + use, offer to sell, sell, import, and otherwise transfer the Work,
  78 + where such license applies only to those patent claims licensable
  79 + by such Contributor that are necessarily infringed by their
  80 + Contribution(s) alone or by combination of their Contribution(s)
  81 + with the Work to which such Contribution(s) was submitted. If You
  82 + institute patent litigation against any entity (including a
  83 + cross-claim or counterclaim in a lawsuit) alleging that the Work
  84 + or a Contribution incorporated within the Work constitutes direct
  85 + or contributory patent infringement, then any patent licenses
  86 + granted to You under this License for that Work shall terminate
  87 + as of the date such litigation is filed.
  88 +
  89 + 4. Redistribution. You may reproduce and distribute copies of the
  90 + Work or Derivative Works thereof in any medium, with or without
  91 + modifications, and in Source or Object form, provided that You
  92 + meet the following conditions:
  93 +
  94 + (a) You must give any other recipients of the Work or
  95 + Derivative Works a copy of this License; and
  96 +
  97 + (b) You must cause any modified files to carry prominent notices
  98 + stating that You changed the files; and
  99 +
  100 + (c) You must retain, in the Source form of any Derivative Works
  101 + that You distribute, all copyright, patent, trademark, and
  102 + attribution notices from the Source form of the Work,
  103 + excluding those notices that do not pertain to any part of
  104 + the Derivative Works; and
  105 +
  106 + (d) If the Work includes a "NOTICE" text file as part of its
  107 + distribution, then any Derivative Works that You distribute must
  108 + include a readable copy of the attribution notices contained
  109 + within such NOTICE file, excluding those notices that do not
  110 + pertain to any part of the Derivative Works, in at least one
  111 + of the following places: within a NOTICE text file distributed
  112 + as part of the Derivative Works; within the Source form or
  113 + documentation, if provided along with the Derivative Works; or,
  114 + within a display generated by the Derivative Works, if and
  115 + wherever such third-party notices normally appear. The contents
  116 + of the NOTICE file are for informational purposes only and
  117 + do not modify the License. You may add Your own attribution
  118 + notices within Derivative Works that You distribute, alongside
  119 + or as an addendum to the NOTICE text from the Work, provided
  120 + that such additional attribution notices cannot be construed
  121 + as modifying the License.
  122 +
  123 + You may add Your own copyright statement to Your modifications and
  124 + may provide additional or different license terms and conditions
  125 + for use, reproduction, or distribution of Your modifications, or
  126 + for any such Derivative Works as a whole, provided Your use,
  127 + reproduction, and distribution of the Work otherwise complies with
  128 + the conditions stated in this License.
  129 +
  130 + 5. Submission of Contributions. Unless You explicitly state otherwise,
  131 + any Contribution intentionally submitted for inclusion in the Work
  132 + by You to the Licensor shall be under the terms and conditions of
  133 + this License, without any additional terms or conditions.
  134 + Notwithstanding the above, nothing herein shall supersede or modify
  135 + the terms of any separate license agreement you may have executed
  136 + with Licensor regarding such Contributions.
  137 +
  138 + 6. Trademarks. This License does not grant permission to use the trade
  139 + names, trademarks, service marks, or product names of the Licensor,
  140 + except as required for reasonable and customary use in describing the
  141 + origin of the Work and reproducing the content of the NOTICE file.
  142 +
  143 + 7. Disclaimer of Warranty. Unless required by applicable law or
  144 + agreed to in writing, Licensor provides the Work (and each
  145 + Contributor provides its Contributions) on an "AS IS" BASIS,
  146 + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
  147 + implied, including, without limitation, any warranties or conditions
  148 + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
  149 + PARTICULAR PURPOSE. You are solely responsible for determining the
  150 + appropriateness of using or redistributing the Work and assume any
  151 + risks associated with Your exercise of permissions under this License.
  152 +
  153 + 8. Limitation of Liability. In no event and under no legal theory,
  154 + whether in tort (including negligence), contract, or otherwise,
  155 + unless required by applicable law (such as deliberate and grossly
  156 + negligent acts) or agreed to in writing, shall any Contributor be
  157 + liable to You for damages, including any direct, indirect, special,
  158 + incidental, or consequential damages of any character arising as a
  159 + result of this License or out of the use or inability to use the
  160 + Work (including but not limited to damages for loss of goodwill,
  161 + work stoppage, computer failure or malfunction, or any and all
  162 + other commercial damages or losses), even if such Contributor
  163 + has been advised of the possibility of such damages.
  164 +
  165 + 9. Accepting Warranty or Additional Liability. While redistributing
  166 + the Work or Derivative Works thereof, You may choose to offer,
  167 + and charge a fee for, acceptance of support, warranty, indemnity,
  168 + or other liability obligations and/or rights consistent with this
  169 + License. However, in accepting such obligations, You may act only
  170 + on Your own behalf and on Your sole responsibility, not on behalf
  171 + of any other Contributor, and only if You agree to indemnify,
  172 + defend, and hold each Contributor harmless for any liability
  173 + incurred by, or claims asserted against, such Contributor by reason
  174 + of your accepting any such warranty or additional liability.
  175 +
  176 + END OF TERMS AND CONDITIONS
  177 +
  178 + APPENDIX: How to apply the Apache License to your work.
  179 +
  180 + To apply the Apache License to your work, attach the following
  181 + boilerplate notice, with the fields enclosed by brackets "{}"
  182 + replaced with your own identifying information. (Don't include
  183 + the brackets!) The text should be enclosed in the appropriate
  184 + comment syntax for the file format. We also recommend that a
  185 + file or class name and description of purpose be included on the
  186 + same "printed page" as the copyright notice for easier
  187 + identification within third-party archives.
  188 +
  189 + Copyright 2016, Chromedia Far East, Inc.
  190 +
  191 + Licensed under the Apache License, Version 2.0 (the "License");
  192 + you may not use this file except in compliance with the License.
  193 + You may obtain a copy of the License at
  194 +
  195 + http://www.apache.org/licenses/LICENSE-2.0
  196 +
  197 + Unless required by applicable law or agreed to in writing, software
  198 + distributed under the License is distributed on an "AS IS" BASIS,
  199 + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  200 + See the License for the specific language governing permissions and
  201 + limitations under the License.
... ...
1   -The cfe-mariadb Cookbook.
  1 +# cfe-mariadb-cookbook
  2 +
  3 +This installs MariaDB by default and initiates databases and users. It can also install a script that performs a backup of all those databases into a designated S3 bucket.
  4 +
  5 +
  6 +The server is assumed to be using an IAM role with S3 bucket read/write access, instead of a physical credentials file.
  7 +
  8 +## Supported Platforms
  9 +
  10 +Ubuntu 14.04
  11 +
  12 +## Attributes
  13 +
  14 +<table>
  15 + <tr>
  16 + <th>Key</th>
  17 + <th>Type</th>
  18 + <th>Description</th>
  19 + <th>Default</th>
  20 + </tr>
  21 + <tr>
  22 + <td><tt>['cfe-mariadb']['db_map']</tt></td>
  23 + <td>Hash</td>
  24 + <td>A hash/array of hashes that enumerate the DB names, users, passwords, etc. of all databases to be set up. Please see the default attributes file for examples.</td>
  25 + <td><tt>{}</tt></td>
  26 + </tr>
  27 + <tr>
  28 + <td><tt>['cfe-mariadb']['replication']</tt></td>
  29 + <td>Boolean</td>
  30 + <td>Whether replication is enabled or not</td>
  31 + <td><tt>false</tt></td>
  32 + </tr>
  33 + <tr>
  34 + <td><tt>['cfe-mariadb']['backup']['s3_region']</tt></td>
  35 + <td>String</td>
  36 + <td>AWS S3 region</td>
  37 + <td><tt>'us-east-1'</tt></td>
  38 + </tr>
  39 + <tr>
  40 + <td><tt>['cfe-mariadb']['backup']['s3_bucket']</tt></td>
  41 + <td>String</td>
  42 + <td>AWS S3 bucket name</td>
  43 + <td><tt>'example-bucket'</tt></td>
  44 + </tr>
  45 + <tr>
  46 + <td><tt>['cfe-mariadb']['backup']['cron']['min']</tt></td>
  47 + <td>String</td>
  48 + <td>The backup cronjob 'minute' value</td>
  49 + <td><tt>'0'</tt></td>
  50 + </tr>
  51 + <tr>
  52 + <td><tt>['cfe-mariadb']['backup']['cron']['hour']</tt></td>
  53 + <td>String</td>
  54 + <td>The backup cronjob 'hour' value</td>
  55 + <td><tt>'0'</tt></td>
  56 + </tr>
  57 + <tr>
  58 + <td><tt>['cfe-mariadb']['backup']['cron']['day']</tt></td>
  59 + <td>String</td>
  60 + <td>The backup cronjob 'day of month' value</td>
  61 + <td><tt>'*'</tt></td>
  62 + </tr>
  63 + <tr>
  64 + <td><tt>['cfe-mariadb']['backup']['cron']['mon']</tt></td>
  65 + <td>String</td>
  66 + <td>The backup cronjob 'month' value</td>
  67 + <td><tt>'*'</tt></td>
  68 + </tr>
  69 + <tr>
  70 + <td><tt>['cfe-mariadb']['backup']['cron']['wday']</tt></td>
  71 + <td>String</td>
  72 + <td>The backup cronjob 'day of week' value</td>
  73 + <td><tt>'*'</tt></td>
  74 + </tr>
  75 +</table>
  76 +
  77 +## Usage
  78 +
  79 +### cfe-mariadb::default
  80 +
  81 +Include `cfe-mariadb` in your node's `run_list`:
  82 +
  83 +```json
  84 +{
  85 + "run_list": [
  86 + "recipe[cfe-mariadb]"
  87 + ]
  88 +}
  89 +```
  90 +
  91 +### cfe-mariadb::backup2s3
  92 +
  93 +This will install the backup script and also enable a cronjob to regularly run that script.
  94 +
  95 +```json
  96 +{
  97 + "run_list": [
  98 + "recipe[cfe-mariadb]",
  99 + "recipe[cfe-mariadb::backup2s3]"
  100 + ]
  101 +}
  102 +```
  103 +## License and Authors
  104 +
  105 +Author:: Earth U. (<sysadmin@chromedia.com>)
... ...
  1 +# encoding: utf-8
  2 +
  3 +require 'bundler'
  4 +require 'bundler/setup'
  5 +require 'berkshelf/thor'
  6 +
  7 +begin
  8 + require 'kitchen/thor_tasks'
  9 + Kitchen::ThorTasks.new
  10 +rescue LoadError
  11 + puts '>>>>> Kitchen gem not loaded, omitting tasks' unless ENV['CI']
  12 +end
... ...
  1 +# -*- mode: ruby -*-
  2 +# vi: set ft=ruby :
  3 +
  4 +# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
  5 +VAGRANTFILE_API_VERSION = '2'
  6 +
  7 +Vagrant.require_version '>= 1.5.0'
  8 +
  9 +Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  10 + # All Vagrant configuration is done here. The most common configuration
  11 + # options are documented and commented below. For a complete reference,
  12 + # please see the online documentation at vagrantup.com.
  13 +
  14 + config.vm.hostname = 'cfe-mariadb-berkshelf'
  15 +
  16 + # Set the version of chef to install using the vagrant-omnibus plugin
  17 + # NOTE: You will need to install the vagrant-omnibus plugin:
  18 + #
  19 + # $ vagrant plugin install vagrant-omnibus
  20 + #
  21 + if Vagrant.has_plugin?("vagrant-omnibus")
  22 + config.omnibus.chef_version = 'latest'
  23 + end
  24 +
  25 + # Every Vagrant virtual environment requires a box to build off of.
  26 + # If this value is a shorthand to a box in Vagrant Cloud then
  27 + # config.vm.box_url doesn't need to be specified.
  28 + config.vm.box = 'chef/ubuntu-14.04'
  29 +
  30 +
  31 + # Assign this VM to a host-only network IP, allowing you to access it
  32 + # via the IP. Host-only networks can talk to the host machine as well as
  33 + # any other machines on the same network, but cannot be accessed (through this
  34 + # network interface) by any external networks.
  35 + config.vm.network :private_network, type: 'dhcp'
  36 +
  37 + # Create a forwarded port mapping which allows access to a specific port
  38 + # within the machine from a port on the host machine. In the example below,
  39 + # accessing "localhost:8080" will access port 80 on the guest machine.
  40 +
  41 + # Share an additional folder to the guest VM. The first argument is
  42 + # the path on the host to the actual folder. The second argument is
  43 + # the path on the guest to mount the folder. And the optional third
  44 + # argument is a set of non-required options.
  45 + # config.vm.synced_folder "../data", "/vagrant_data"
  46 +
  47 + # Provider-specific configuration so you can fine-tune various
  48 + # backing providers for Vagrant. These expose provider-specific options.
  49 + # Example for VirtualBox:
  50 + #
  51 + # config.vm.provider :virtualbox do |vb|
  52 + # # Don't boot with headless mode
  53 + # vb.gui = true
  54 + #
  55 + # # Use VBoxManage to customize the VM. For example to change memory:
  56 + # vb.customize ["modifyvm", :id, "--memory", "1024"]
  57 + # end
  58 + #
  59 + # View the documentation for the provider you're using for more
  60 + # information on available options.
  61 +
  62 + # The path to the Berksfile to use with Vagrant Berkshelf
  63 + # config.berkshelf.berksfile_path = "./Berksfile"
  64 +
  65 + # Enabling the Berkshelf plugin. To enable this globally, add this configuration
  66 + # option to your ~/.vagrant.d/Vagrantfile file
  67 + config.berkshelf.enabled = true
  68 +
  69 + # An array of symbols representing groups of cookbook described in the Vagrantfile
  70 + # to exclusively install and copy to Vagrant's shelf.
  71 + # config.berkshelf.only = []
  72 +
  73 + # An array of symbols representing groups of cookbook described in the Vagrantfile
  74 + # to skip installing and copying to Vagrant's shelf.
  75 + # config.berkshelf.except = []
  76 +
  77 + config.vm.provision :chef_solo do |chef|
  78 + chef.json = {
  79 + mysql: {
  80 + server_root_password: 'rootpass',
  81 + server_debian_password: 'debpass',
  82 + server_repl_password: 'replpass'
  83 + }
  84 + }
  85 +
  86 + chef.run_list = [
  87 + 'recipe[cfe-mariadb::default]'
  88 + ]
  89 + end
  90 +end
... ...
1 1 #
  2 +# Author:: Earth U (<sysadmin@chromedia.com>)
2 3 # Cookbook Name:: cfe-mariadb
3 4 # Attributes:: default
4 5 #
5   -# Copyright 2016, Chromedia
  6 +# Copyright 2016, Chromedia Far East, Inc.
6 7 #
7   -# All rights reserved - Do Not Redistribute
  8 +# Licensed under the Apache License, Version 2.0 (the "License");
  9 +# you may not use this file except in compliance with the License.
  10 +# You may obtain a copy of the License at
  11 +#
  12 +# http://www.apache.org/licenses/LICENSE-2.0
  13 +#
  14 +# Unless required by applicable law or agreed to in writing, software
  15 +# distributed under the License is distributed on an "AS IS" BASIS,
  16 +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17 +# See the License for the specific language governing permissions and
  18 +# limitations under the License.
8 19 #
9 20
10 21 ## The 'db_map' should contain this format:
... ... @@ -19,26 +30,48 @@
19 30 # :collate => 'latin1_swedish_ci'
20 31 # }
21 32 # }
22   -default['cfe-mariadb']['db_map'] = {}
  33 +default['cfe-mariadb']['db_map'] = {
  34 + 'example_db' => {
  35 + :db_user => 'example_user',
  36 + :db_pass => 'secret',
  37 + :bak_filename => 'example_db.sql',
  38 + :bak_maxcopies => 30
  39 + }
  40 +}
  41 +
23 42 # Make sure to set replication on only when necessary
24 43 default['cfe-mariadb']['replication'] = false
25 44
26   -default['cfe-mariadb']['backup']['s3_region'] = 'us-east-1'
27   -default['cfe-mariadb']['backup']['s3_bucket'] = 'example-bucket'
28   -default['cfe-mariadb']['backup']['aws_bin'] = '/use/local/bin/aws',
29   -default['cfe-mariadb']['backup']['mysqldump_bin'] = '/usr/bin/mysqldump',
  45 +default['cfe-mariadb']['backup']['s3_region'] = 'us-east-1'
  46 +default['cfe-mariadb']['backup']['s3_bucket'] = 'example-bucket'
  47 +
  48 +if node['platform'] == 'ubuntu' and node['platform_version'].to_f == 14.04
  49 + default['cfe-mariadb']['backup']['aws_bin'] = '/usr/local/bin/aws'
  50 + default['cfe-mariadb']['backup']['mysqldump_bin'] = '/usr/bin/mysqldump'
  51 +else
  52 + # Haven't tested on other platforms yet, so same as above for now.
  53 + default['cfe-mariadb']['backup']['aws_bin'] = '/usr/local/bin/aws'
  54 + default['cfe-mariadb']['backup']['mysqldump_bin'] = '/usr/bin/mysqldump'
  55 +end
30 56 # Path to directory where the backup script should be placed
31   -default['cfe-mariadb']['backup']['script_dir'] = ::File.join(
  57 +default['cfe-mariadb']['backup']['script_dir'] = ::File.join(
32 58 node['mariadb']['configuration']['path'], 'scripts'
33 59 )
  60 +
34 61 default['cfe-mariadb']['backup']['cron']['min'] = '0'
35 62 default['cfe-mariadb']['backup']['cron']['hour'] = '0'
36 63 default['cfe-mariadb']['backup']['cron']['day'] = '*'
37 64 default['cfe-mariadb']['backup']['cron']['mon'] = '*'
38 65 default['cfe-mariadb']['backup']['cron']['wday'] = '*'
39   -default['cfe-mariadb']['backup']['cron']['mailto'] = ''
  66 +default['cfe-mariadb']['backup']['cron']['mailto'] = "''" # Empty single quotes
  67 +
  68 +# Basic options for logrotate
  69 +default['cfe-mariadb']['backup']['logrotate']['conf_dir'] = '/etc/logrotate.d'
  70 +default['cfe-mariadb']['backup']['logrotate']['options'] = [
  71 + 'weekly', 'rotate 12', 'missingok', 'compress', 'notifempty'
  72 +]
40 73
41   -default['mariadb']['server_root_password'] = 'password'
  74 +default['mariadb']['server_root_password'] = 'secretpassword'
42 75 default['mariadb']['mysqld']['bind_address'] = '127.0.0.1'
43 76 default['mariadb']['mysqld']['port'] = '3306'
44 77 default['mariadb']['install']['type'] = 'package'
... ... @@ -46,7 +79,7 @@ default['mariadb']['install']['version'] = '5.5'
46 79 default['mariadb']['forbid_remote_root'] = true
47 80 # io_capacity has to be roughly the IO capacity of the EC2 instance.
48 81 # buffer_pool_size can be increased to 75% (0.75) of RAM if dedicated server.
49   -default['mariadb']['innodb']['io_capacity'] = '600'
  82 +default['mariadb']['innodb']['io_capacity'] = '30'
50 83 default['mariadb']['innodb']['buffer_pool_size'] =
51 84 ( %x(free -m).split(' ')[7].to_i * 0.5 ).round.to_s
52 85
... ... @@ -55,7 +88,6 @@ default['mariadb']['innodb']['buffer_pool_size'] =
55 88 ## the following is possible in the attributes file:
56 89 ##
57 90 # secret = Chef::EncryptedDataBagItem.load(
58   -# node['cfe-gitlab']['data_bag'],
59   -# node['cfe-gitlab']['data_bag_item_secret']
  91 +# my_data_bag, my_secret_data_bag_item
60 92 # )
61   -# default['cfe-gitlab']['some_prop'] = secret['db_pass']
  93 +# default['cfe-mariadb']['some_prop'] = secret['db_password']
... ...
  1 +# Put files/directories that should be ignored in this file when uploading
  2 +# or sharing to the community site.
  3 +# Lines that start with '# ' are comments.
  4 +
  5 +# OS generated files #
  6 +######################
  7 +.DS_Store
  8 +Icon?
  9 +nohup.out
  10 +ehthumbs.db
  11 +Thumbs.db
  12 +
  13 +# SASS #
  14 +########
  15 +.sass-cache
  16 +
  17 +# EDITORS #
  18 +###########
  19 +\#*
  20 +.#*
  21 +*~
  22 +*.sw[a-z]
  23 +*.bak
  24 +REVISION
  25 +TAGS*
  26 +tmtags
  27 +*_flymake.*
  28 +*_flymake
  29 +*.tmproj
  30 +.project
  31 +.settings
  32 +mkmf.log
  33 +
  34 +## COMPILED ##
  35 +##############
  36 +a.out
  37 +*.o
  38 +*.pyc
  39 +*.so
  40 +*.com
  41 +*.class
  42 +*.dll
  43 +*.exe
  44 +*/rdoc/
  45 +
  46 +# Testing #
  47 +###########
  48 +.watchr
  49 +.rspec
  50 +spec/*
  51 +spec/fixtures/*
  52 +test/*
  53 +features/*
  54 +Guardfile
  55 +Procfile
  56 +
  57 +# SCM #
  58 +#######
  59 +.git
  60 +*/.git
  61 +.gitignore
  62 +.gitmodules
  63 +.gitconfig
  64 +.gitattributes
  65 +.svn
  66 +*/.bzr/*
  67 +*/.hg/*
  68 +*/.svn/*
  69 +
  70 +# Berkshelf #
  71 +#############
  72 +cookbooks/*
  73 +tmp
  74 +
  75 +# Cookbooks #
  76 +#############
  77 +CONTRIBUTING
  78 +CHANGELOG*
  79 +
  80 +# Strainer #
  81 +############
  82 +Colanderfile
  83 +Strainerfile
  84 +.colander
  85 +.strainer
  86 +
  87 +# Vagrant #
  88 +###########
  89 +.vagrant
  90 +Vagrantfile
  91 +
  92 +# Travis #
  93 +##########
  94 +.travis.yml
... ...
1 1 name 'cfe-mariadb'
2   -maintainer 'Chromedia'
  2 +maintainer 'Chromedia Far East, Inc.'
3 3 maintainer_email 'sysadmin@chromedia.com'
4   -license 'All rights reserved'
  4 +license 'Apache License'
5 5 description 'Simplifies setup of MariaDB in Chromedia.'
6 6 long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
7 7 version '0.1.0'
... ... @@ -10,7 +10,8 @@ version '0.1.0'
10 10 'mariadb' => '0.2.12',
11 11 'mysql2_chef_gem' => '1.0.2',
12 12 'database' => '4.0.9',
13   - 'awscli' => '1.0.1'
  13 + 'awscli' => '1.0.1',
  14 + 'cron' => '1.7.4'
14 15 }.each { |cb, ver| depends cb, '~> ' + ver }
15 16
16 17 supports 'ubuntu', '>= 14.04'
... ...
1 1 #
  2 +# Author:: Earth U (<sysadmin@chromedia.com>)
2 3 # Cookbook Name:: cfe-mariadb
3 4 # Recipe:: backup2s3
4 5 #
5   -# Copyright 2016, Chromedia
  6 +# Copyright 2016, Chromedia Far East, Inc.
6 7 #
7   -# All rights reserved - Do Not Redistribute
  8 +# Licensed under the Apache License, Version 2.0 (the "License");
  9 +# you may not use this file except in compliance with the License.
  10 +# You may obtain a copy of the License at
  11 +#
  12 +# http://www.apache.org/licenses/LICENSE-2.0
  13 +#
  14 +# Unless required by applicable law or agreed to in writing, software
  15 +# distributed under the License is distributed on an "AS IS" BASIS,
  16 +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17 +# See the License for the specific language governing permissions and
  18 +# limitations under the License.
8 19 #
9 20
10 21 # Sets up the shell script that backs up the databases
11 22 # and uploads them to a S3 bucket.
12 23 # Also sets up the cron job to regularly run this script.
13 24
14   -# TODO: set up logrotate
15 25 include_recipe 'awscli'
16 26
17 27 md = node['cfe-mariadb']
18 28 mdb = md['backup']
19 29 mdbc = mdb['cron']
  30 +mdbl = mdb['logrotate']
20 31
21   -template "#{scr_dir}/backup_db_to_s3" do
  32 +template "#{mdb['script_dir']}/backup_db_to_s3" do
22 33 only_if "test -d #{mdb['script_dir']} || mkdir -p #{mdb['script_dir']}"
23 34 variables(
24 35 :db_map => md['db_map'],
... ... @@ -31,8 +42,11 @@ template "#{scr_dir}/backup_db_to_s3" do
31 42 )
32 43 end
33 44
34   -cron 'backup_db_to_s3' do
35   - command "bash #{scr_dir}/backup_db_to_s3"
  45 +# Chef built-in resource 'cron' seems to have a problem with
  46 +# the syntax here. But they suggest using 'cron_d', instead, from
  47 +# the cron cookbook (https://docs.chef.io/resource_cron.html).
  48 +cron_d 'backup_db_to_s3' do
  49 + command "bash #{mdb['script_dir']}/backup_db_to_s3"
36 50 minute mdbc['min']
37 51 hour mdbc['hour']
38 52 day mdbc['day']
... ... @@ -41,3 +55,13 @@ cron 'backup_db_to_s3' do
41 55 mailto mdbc['mailto']
42 56 path '/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin'
43 57 end
  58 +
  59 +package 'logrotate'
  60 +
  61 +template "#{mdbl['conf_dir']}/backup_db_to_s3" do
  62 + source 'backup_db_to_s3_logrotate.erb'
  63 + only_if "test -d #{mdbl['conf_dir']} || mkdir -p #{mdbl['conf_dir']}"
  64 + variables(
  65 + :opts => mdbl['options']
  66 + )
  67 +end
... ...
1 1 #
  2 +# Author:: Earth U (<sysadmin@chromedia.com>)
2 3 # Cookbook Name:: cfe-mariadb
3 4 # Recipe:: default
4 5 #
5   -# Copyright 2016, Chromedia
  6 +# Copyright 2016, Chromedia Far East, Inc.
6 7 #
7   -# All rights reserved - Do Not Redistribute
  8 +# Licensed under the Apache License, Version 2.0 (the "License");
  9 +# you may not use this file except in compliance with the License.
  10 +# You may obtain a copy of the License at
  11 +#
  12 +# http://www.apache.org/licenses/LICENSE-2.0
  13 +#
  14 +# Unless required by applicable law or agreed to in writing, software
  15 +# distributed under the License is distributed on an "AS IS" BASIS,
  16 +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17 +# See the License for the specific language governing permissions and
  18 +# limitations under the License.
8 19 #
9 20
10 21 # Some notes:
... ... @@ -43,7 +54,14 @@ con = {
43 54 :username => 'root',
44 55 :password => node['mariadb']['server_root_password']
45 56 }
46   -node.default['cfe-mariadb']['db_map'].each do |dbx_name, dbx|
  57 +node.default['cfe-mariadb']['db_map'].each do |dbx|
  58 +
  59 + if dbx.is_a?(Array)
  60 + dbx_name = dbx[0]
  61 + dbx = dbx[1]
  62 + else
  63 + dbx_name = dbx[:db_name]
  64 + end
47 65
48 66 mysql_database dbx_name do
49 67 connection con
... ...
... ... @@ -94,12 +94,19 @@ upload_to_s3() {
94 94 }
95 95
96 96 # First, perform mysqldump on each database.
97   -<% @db_map.each do |db_name, db| -%>
  97 +<% @db_map.each do |db| -%>
  98 +<% if db.is_a?(Array) -%>
  99 +<% db_name = db[0] -%>
  100 +<% db = db[1] -%>
  101 +<% else -%>
  102 +<% db_name = db[:db_name] -%>
  103 +<% end -%>
98 104 export_db <%= db_name %> <%= db[:db_user] %> '<%= db[:db_pass] %>' <%= db[:bak_filename] %>
99 105 <% end -%>
100 106
101 107 # Then compress and upload the backup files one by one.
102   -<% @db_map.each do |db_name, db| -%>
  108 +<% @db_map.each do |db| -%>
  109 +<% if db.is_a?(Array) then db = db[1] end -%>
103 110 compress_backup_file <%= db[:bak_filename] %>
104 111 increment_backup_names <%= db[:bak_filename] %> <%= db[:bak_maxcopies] %>
105 112 upload_to_s3 <%= db[:bak_filename] %>
... ...
  1 +/var/log/backup_db_to_s3/*.log {
  2 +<% @opts.each do |str| -%>
  3 + <%= str %>
  4 +<% end -%>
  5 +}
... ...