Commit c197ede279dbf1b804929f6090b282420070a3d9
Committed by
Earth Ugat
1 parent
66c86a25
Version v0.5.0. Make recipe reload_from_s3 more idempotent.
Showing
7 changed files
with
75 additions
and
56 deletions
| 1 | +## 0.5.0 | |
| 2 | +### Added | |
| 3 | +- Add boolean attributes ':backup' and ':reload' to db_map. They give the option of whether or not to include that database when using the 'backup2s3' and 'reload_from_s3' recipes, respectively. | |
| 4 | +- Use a timestamp file for idempotency checks for recipe 'reload_from_s3'. | |
| 5 | + | |
| 1 | 6 | ## 0.4.1 |
| 2 | 7 | ### Fixed |
| 3 | 8 | - Logic bug in backup script template where only the last database gets backed up. | ... | ... |
| ... | ... | @@ -94,8 +94,8 @@ Example config of a single database: |
| 94 | 94 | :bak_filename => 'example_db_name.sql', |
| 95 | 95 | :bak_maxcopies => 30 |
| 96 | 96 | :bak_encrypted => false, |
| 97 | - :char_set => 'latin1', | |
| 98 | - :collate => 'latin1_swedish_ci' | |
| 97 | + :char_set => 'utf8', | |
| 98 | + :collate => 'utf8_general_ci' | |
| 99 | 99 | } |
| 100 | 100 | } |
| 101 | 101 | ``` |
| ... | ... | @@ -132,6 +132,7 @@ This will install the backup script and also enable a cronjob to regularly run t |
| 132 | 132 | Kind of the reverse of `backup2s3`. Download a gzip of a MySQL dump file from an S3 bucket, then load it up into a database. Do this for every database given in `node['cfe-mariadb']['db_map']`. |
| 133 | 133 | |
| 134 | 134 | This recipe assumes the node is using an EC2 role that can access the given S3 bucket. Otherwise, enter the AWS credentials in `node.default['cfe-mariadb']['reload']['aws_access_key_id']` and `node.default['cfe-mariadb']['reload']['aws_secret_access_key']`. |
| 135 | + | |
| 135 | 136 | ## License and Authors |
| 136 | 137 | |
| 137 | 138 | Author:: Earth U. (<sysadmin @ chromedia.com>) | ... | ... |
| ... | ... | @@ -25,10 +25,15 @@ |
| 25 | 25 | # :db_pass => 'example_db_password', |
| 26 | 26 | # :bak_filename => 'example_db_name.sql', |
| 27 | 27 | # :bak_maxcopies => 30 |
| 28 | + | |
| 28 | 29 | ## Optional: |
| 29 | 30 | # :char_set => 'utf8', |
| 30 | 31 | # :collate => 'utf8_general_ci', |
| 31 | -# :bak_encrypted => false | |
| 32 | +# :bak_encrypted => false, | |
| 33 | + | |
| 34 | +## Whether to include in backup script, and reload DB data during Chef run: | |
| 35 | +# :backup => true, | |
| 36 | +# :reload => true | |
| 32 | 37 | # } |
| 33 | 38 | # } |
| 34 | 39 | default['cfe-mariadb']['db_map'] = {} |
| ... | ... | @@ -68,6 +73,9 @@ default['cfe-mariadb']['backup']['logrotate']['options'] = %w{ |
| 68 | 73 | notifempty |
| 69 | 74 | } |
| 70 | 75 | |
| 76 | +default['cfe-mariadb']['reload']['file_stamp'] = | |
| 77 | + "#{node['mariadb']['configuration']['path']}/reloaded.stamp" | |
| 78 | + | |
| 71 | 79 | # Optional attributes for recipe 'reload_from_s3' only |
| 72 | 80 | # (Usually used during testing) |
| 73 | 81 | # Recommend: use EC2 instances with proper S3 access roles and | ... | ... |
| ... | ... | @@ -4,7 +4,7 @@ maintainer_email 'sysadmin @ chromedia.com' |
| 4 | 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 | -version '0.4.1' | |
| 7 | +version '0.5.0' | |
| 8 | 8 | |
| 9 | 9 | { |
| 10 | 10 | 'mariadb' => '0.3.1', | ... | ... |
| ... | ... | @@ -25,70 +25,70 @@ package 'gzip' |
| 25 | 25 | include_recipe 'openssl::upgrade' |
| 26 | 26 | include_recipe 'awscli' |
| 27 | 27 | |
| 28 | -tmp_dir = ::File.join(Chef::Config[:file_cache_path], 'db_dumps') | |
| 29 | 28 | manual_creds = node['cfe-mariadb'].has_key?('reload') && |
| 30 | 29 | node['cfe-mariadb']['reload'].has_key?('aws_access_key_id') |
| 31 | 30 | |
| 31 | +tmp_dir = ::File.join(Chef::Config[:file_cache_path], 'db_dumps') | |
| 32 | 32 | priv_key_file = "#{tmp_dir}/priv.key" |
| 33 | 33 | |
| 34 | -file priv_key_file do | |
| 35 | - content node['cfe-mariadb']['encrypt']['priv_key'] || '' | |
| 36 | - mode 0600 | |
| 37 | - owner 'root' | |
| 38 | - group 'root' | |
| 39 | - sensitive true | |
| 40 | - only_if "test -d #{tmp_dir} || mkdir -p #{tmp_dir}" | |
| 41 | -end | |
| 42 | - | |
| 43 | -node['cfe-mariadb']['db_map'].each do |dbx| | |
| 34 | +unless ::File.exist?(node['cfe-mariadb']['reload']['file_stamp']) | |
| 35 | + directory(tmp_dir) { recursive true } | |
| 44 | 36 | |
| 45 | - if dbx.is_a?(Array) | |
| 46 | - dbx_name = dbx[0] | |
| 47 | - dbx = dbx[1] | |
| 48 | - else | |
| 49 | - dbx_name = dbx[:db_name] | |
| 37 | + file priv_key_file do | |
| 38 | + mode 0600 | |
| 39 | + content node['cfe-mariadb']['encrypt']['priv_key'] || '' | |
| 40 | + sensitive true | |
| 50 | 41 | end |
| 51 | 42 | |
| 52 | - keyname = "#{dbx[:bak_filename]}.gz#{dbx[:bak_encrypted] ? '.enc' : ''}" | |
| 53 | - filepath = "#{tmp_dir}/#{dbx[:bak_filename]}" | |
| 54 | - | |
| 55 | - awscli_s3_file "#{tmp_dir}/#{keyname}" do | |
| 56 | - region node['cfe-mariadb']['s3_region'] | |
| 57 | - bucket node['cfe-mariadb']['s3_bucket'] | |
| 58 | - key keyname | |
| 59 | - only_if "test -d #{tmp_dir} || mkdir -p #{tmp_dir}" | |
| 60 | - if manual_creds | |
| 61 | - aws_access_key_id node['cfe-mariadb']['reload']['aws_access_key_id'] | |
| 62 | - aws_secret_access_key node['cfe-mariadb']['reload']['aws_secret_access_key'] | |
| 43 | + node['cfe-mariadb']['db_map'].each do |dbx| | |
| 44 | + | |
| 45 | + if dbx.is_a?(Array) | |
| 46 | + dbx_name = dbx[0] | |
| 47 | + dbx = dbx[1] | |
| 48 | + else | |
| 49 | + dbx_name = dbx[:db_name] | |
| 63 | 50 | end |
| 64 | - end | |
| 65 | 51 | |
| 66 | - execute "decrypt_#{filepath}.gz.enc" do | |
| 67 | - command "openssl smime -decrypt -binary -inkey #{priv_key_file} "\ | |
| 68 | - "-in #{filepath}.gz.enc -out #{filepath}.gz -inform DEM" | |
| 69 | - only_if { ::File.exist?("#{filepath}.gz.enc") } | |
| 70 | - notifies :delete, "file[#{filepath}.gz.enc]" | |
| 71 | - end | |
| 52 | + unless dbx.has_key?(:reload) && dbx[:reload] == false | |
| 53 | + keyname = "#{dbx[:bak_filename]}.gz#{dbx[:bak_encrypted] ? '.enc' : ''}" | |
| 54 | + filepath = "#{tmp_dir}/#{dbx[:bak_filename]}" | |
| 72 | 55 | |
| 73 | - execute "gzip -d #{filepath}.gz" | |
| 56 | + awscli_s3_file "#{tmp_dir}/#{keyname}" do | |
| 57 | + region node['cfe-mariadb']['s3_region'] | |
| 58 | + bucket node['cfe-mariadb']['s3_bucket'] | |
| 59 | + key keyname | |
| 60 | + if manual_creds | |
| 61 | + aws_access_key_id node['cfe-mariadb']['reload']['aws_access_key_id'] | |
| 62 | + aws_secret_access_key node['cfe-mariadb']['reload']['aws_secret_access_key'] | |
| 63 | + end | |
| 64 | + end | |
| 74 | 65 | |
| 75 | - execute "reload_#{filepath}" do | |
| 76 | - command "mysql -h #{node['mariadb']['mysqld']['bind_address']} "\ | |
| 77 | - "-P #{node['mariadb']['mysqld']['port']} -u #{dbx[:db_user]} "\ | |
| 78 | - "-p'#{dbx[:db_pass]}' -D #{dbx_name} < #{filepath}" | |
| 79 | - notifies :delete, "file[#{filepath}]" | |
| 80 | - sensitive true | |
| 81 | - end | |
| 66 | + execute "decrypt_#{filepath}.gz.enc" do | |
| 67 | + command "openssl smime -decrypt -binary -inkey #{priv_key_file} "\ | |
| 68 | + "-in #{filepath}.gz.enc -out #{filepath}.gz -inform DEM" | |
| 69 | + only_if { ::File.exist?("#{filepath}.gz.enc") } | |
| 70 | + notifies :delete, "file[#{filepath}.gz.enc]" | |
| 71 | + end | |
| 82 | 72 | |
| 83 | - file "#{filepath}.gz.enc" do | |
| 84 | - action :nothing | |
| 85 | - end | |
| 73 | + execute "gzip -d #{filepath}.gz" | |
| 74 | + | |
| 75 | + execute "reload_#{filepath}" do | |
| 76 | + command "mysql -h #{node['mariadb']['mysqld']['bind_address']} "\ | |
| 77 | + "-P #{node['mariadb']['mysqld']['port']} "\ | |
| 78 | + "-u #{dbx[:db_user]} -p'#{dbx[:db_pass]}' "\ | |
| 79 | + "-D #{dbx_name} < #{filepath}" | |
| 80 | + notifies :delete, "file[#{filepath}]" | |
| 81 | + sensitive true | |
| 82 | + end | |
| 86 | 83 | |
| 87 | - file filepath do | |
| 88 | - action :nothing | |
| 84 | + file("#{filepath}.gz.enc") { action :nothing } | |
| 85 | + file(filepath) { action :nothing } | |
| 86 | + | |
| 87 | + file node['cfe-mariadb']['reload']['file_stamp'] do | |
| 88 | + content %x{ date +"%FT%T" } | |
| 89 | + end | |
| 90 | + end | |
| 89 | 91 | end |
| 90 | -end | |
| 91 | 92 | |
| 92 | -file priv_key_file do | |
| 93 | - action :delete | |
| 93 | + file(priv_key_file) { action :delete } | |
| 94 | 94 | end | ... | ... |
| ... | ... | @@ -18,6 +18,7 @@ |
| 18 | 18 | # limitations under the License. |
| 19 | 19 | # |
| 20 | 20 | |
| 21 | +# [DEPRECATED] | |
| 21 | 22 | # This recipe is just here for backward-compatibility reasons. |
| 22 | 23 | # The previous backups scripts create .tar.gz files, instead of .gz, so |
| 23 | 24 | # this recipe is here to get .tar.gz backups. | ... | ... |
| ... | ... | @@ -115,10 +115,12 @@ upload_to_s3() { |
| 115 | 115 | <% else -%> |
| 116 | 116 | <% db_name = db[:db_name] -%> |
| 117 | 117 | <% end -%> |
| 118 | +<% unless db.has_key?(:backup) && db[:backup] == false -%> | |
| 118 | 119 | export_db <%= db_name %> <%= db[:db_user] %> '<%= db[:db_pass] %>' <%= db[:bak_filename] %> |
| 119 | 120 | compress_backup_file <%= db[:bak_filename] %> |
| 120 | -<% if db[:bak_encrypted] -%> | |
| 121 | +<% if db[:bak_encrypted] -%> | |
| 121 | 122 | encrypt_file <%= db[:bak_filename] %>.gz |
| 123 | +<% end -%> | |
| 122 | 124 | <% end -%> |
| 123 | 125 | <% end -%> |
| 124 | 126 | |
| ... | ... | @@ -131,9 +133,11 @@ encrypt_file <%= db[:bak_filename] %>.gz |
| 131 | 133 | <% else -%> |
| 132 | 134 | <% bfname = "#{db[:bak_filename]}.gz" -%> |
| 133 | 135 | <% end -%> |
| 136 | +<% unless db.has_key?(:backup) && db[:backup] == false -%> | |
| 134 | 137 | increment_backup_names <%= bfname %> <%= db[:bak_maxcopies] %> |
| 135 | 138 | upload_to_s3 <%= bfname %> |
| 136 | 139 | |
| 137 | -<% end -%> | |
| 140 | +<% end -%> | |
| 141 | +<% end -%> | |
| 138 | 142 | rm "$tmp_file" |
| 139 | 143 | echo "$(date) : Done." | ... | ... |