Showing
16 changed files
with
677 additions
and
34 deletions
.gitignore
0 → 100644
.kitchen.yml
0 → 100644
| 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: | ... | ... |
CHANGELOG.md
0 → 100644
Gemfile
0 → 100644
LICENSE
0 → 100644
| 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>) | ... | ... |
Thorfile
0 → 100644
Vagrantfile
0 → 100644
| 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'] | ... | ... |
chefignore
0 → 100644
| 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] %> | ... | ... |