Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Supporting Riak and Riak CS Deployments with Chef

Hector Castro
February 10, 2014

Supporting Riak and Riak CS Deployments with Chef

Basho maintains Chef cookbooks for Riak and Riak CS.

Several customers and open source users leverage our cookbooks (we reuse them internally as well). Unfortunately, everyone uses them a bit differently and making the cookbooks infinitely flexible can get tricky.

This deck explores the history of maintaining the Riak/Riak CS cookbooks and goes over ways people are using them.

Hector Castro

February 10, 2014
Tweet

More Decks by Hector Castro

Other Decks in Technology

Transcript

  1. %%  -­‐*-­‐  mode:  erlang;erlang-­‐indent-­‐level:  4;indent-­‐tabs-­‐mode:  nil  -­‐*-­‐   %%  ex:

     ft=erlang  ts=4  sw=4  et   [    %%  Riak  Client  APIs  config    {riak_api,  [                          %%  pb_backlog  is  the  maximum  length  to  which  the  queue  of  pending                          %%  connections  may  grow.  If  set,  it  must  be  an  integer  >=  0.                          %%  By  default  the  value  is  5.  If  you  anticipate  a  huge  number  of                          %%  connections  being  initialized  *simultaneously*,  set  this  number                          %%  higher.                          %%  {pb_backlog,  64},                                                      %%  pb  is  a  list  of  IP  addresses  and  TCP  ports  that  the  Riak                            %%  Protocol  Buffers  interface  will  bind.                          {pb,  [  {"127.0.0.1",  8087}  ]}                          ]},        %%  Riak  Core  config    {riak_core,  [                              %%  Default  location  of  ringstate                              {ring_state_dir,  "/var/lib/riak/ring"},   ! .  .  .   ! ].
  2.        {riak_core,  [   !      

     .  .  .   !                {http,  [                          {"33.33.33.10",  8098}                  ]},   !                .  .  .   !        ]}
  3. default    [[              

                                       ['riak_core']  
  4.        {riak_core,  [ !        .

     .  .   !                {http,  [                          {                ]}, !                .  .  .   !        ]}        {riak_core,  [   ! ! ! ! ! ! ! ! !        ]}
  5. default    [[              

                                                                 ['http']  
  6.        {riak_core,  [ !        .

     .  .   !                {http,  [                          {                ]}, !                .  .  .   !        ]} !                {http,  [   !                ]},  
  7.        {riak_core,  [ !        .

     .  .   !                {http,  [                          {                ]}, !                .  .  .   !        ]} !                              [                          {"33.33.33.10",  8098}                  ]  
  8.        {riak_control,  [   !      

             .  .  .     !                {userlist,  [                          {"user",  "pass"}                  ]}   !                .  .  .   !        ]},
  9.    "override_attributes":  {          "riak":  {  

               "config":  {                  "riak_control":  {                      "userlist":  [                          ["__tuple",  "foo",  "bar"]                      ]                  }              }          }      }
  10.    "override_attributes"                

                                                                   [                    ]                  }              }          }      }                        ["__tuple",  "foo",  "bar"]
  11.        {riak_control,  [   !      

             .  .  .     !                {userlist,  [                          {"user",  "pass"},                          {"foo",  "bar"}                  ]}   !                .  .  .   !        ]},
  12. #  From  within  a  wrapper  cookbook   ! file  "#{node['riak']['package']['config_dir']}/app.config"

     do      content  Proc.new  {          config  =  node['riak']['config'].to_hash          config['riak_control']['userlist'].delete_at(0)   !        Eth::Config.new(config).pp      }.call      owner  "root"      mode  0644      notifies  :restart,  "service[riak]"   end
  13. #  From  within  a  wrapper  cookbook   ! file  

       content          config          config !            }.    owner      mode      notifies   end ! ! !    content  Proc.new  {          config  =  node['riak']['config'].to_hash          config['riak_control']['userlist'].delete_at(0)   !        Eth::Config.new(config).pp      }.call   ! ! !
  14. #  recipes/package.rb   ! when  "ubuntu",  "debian"      apt_repository

     "basho"  do          uri  "http://apt.basho.com"          distribution  node['lsb']['codename']          components  ["main"]          key  "http://apt.basho.com/gpg/basho.apt.key"      end   !    package  "riak"  do          action  :install          version  package_version      end   end
  15. #  recipes/package.rb ! when    apt_repository        

     uri          distribution  node        components          key      end !    package          action          version  package_version      end end ! ! !    apt_repository  "basho"  do          uri  "http://apt.basho.com"          distribution  node['lsb']['codename']          components  ["main"]          key  "http://apt.basho.com/gpg/basho.apt.key"      end   ! ! ! ! !
  16. #  recipes/package.rb ! when    apt_repository        

     uri          distribution  node        components          key      end !    package          action          version  package_version      end end ! ! !    apt_repository  "basho"  do          uri  "http://apt.basho.com"          distribution  node['lsb']['codename']          components  ["main"]          key  "http://apt.basho.com/gpg/basho.apt.key"      end   !    package  "riak"  do          action  :install          version  package_version      end  
  17. #  recipes/package.rb   ! when  "centos",  "redhat"      yum_key

     "RPM-­‐GPG-­‐KEY-­‐basho"  do          url  "http://yum.basho.com/gpg/RPM-­‐GPG-­‐KEY-­‐basho"          action  :add      end   !    yum_repository  "basho"  do          repo_name  "basho"          description  "Basho  Stable  Repo"          url  "http://yum.basho.com/el/#{platform_version}/products/x86_64/"          key  "RPM-­‐GPG-­‐KEY-­‐basho"          action  :add      end   !    package  "riak"  do          action  :install          version  package_version      end   end
  18. #  recipes/package.rb ! when    yum_key        

     url          action      end !    yum_repository          repo_name          description          url          key          action      end !    package          action          version  package_version      end end ! ! !    yum_key  "RPM-­‐GPG-­‐KEY-­‐basho"  do          url  "http://yum.basho.com/gpg/RPM-­‐GPG-­‐KEY-­‐basho"          action  :add      end   !    yum_repository  "basho"  do          repo_name  "basho"          description  "Basho  Stable  Repo"          url  "http://yum.basho.com/el/#{platform_version}/products/x86_64/"          key  "RPM-­‐GPG-­‐KEY-­‐basho"          action  :add      end   ! ! ! ! !
  19. #  recipes/package.rb ! when    yum_key        

     url          action      end !    yum_repository          repo_name          description          url          key          action      end !    package          action          version  package_version      end end ! ! !    yum_key  "RPM-­‐GPG-­‐KEY-­‐basho"  do          url  "http://yum.basho.com/gpg/RPM-­‐GPG-­‐KEY-­‐basho"          action  :add      end   !    yum_repository  "basho"  do          repo_name  "basho"          description  "Basho  Stable  Repo"          url  "http://yum.basho.com/el/#{platform_version}/products/x86_64/"          key  "RPM-­‐GPG-­‐KEY-­‐basho"          action  :add      end   !    package  "riak"  do          action  :install          version  package_version      end  
  20. #  .kitchen.yml   ! -­‐  name:  custom_repository      run_list:

         -­‐  recipe[minitest-­‐handler]      -­‐  recipe[riak]      attributes:          riak:              install_method:  "custom_repository"
  21. $  egrep  "^-­‐  name"  .kitchen.yml   -­‐  name:  ubuntu-­‐12.04  

    -­‐  name:  debian-­‐7.2.0   -­‐  name:  centos-­‐6.5   -­‐  name:  centos-­‐5.10   -­‐  name:  fedora-­‐19   -­‐  name:  default   -­‐  name:  enterprise   -­‐  name:  custom_package   -­‐  name:  custom_repository   -­‐  name:  source
  22. $  egrep   -­‐  name -­‐  name -­‐  name -­‐

     name -­‐  name -­‐  name -­‐  name -­‐  name -­‐  name -­‐  name ! -­‐  name -­‐  name -­‐  name -­‐  name -­‐  name ! ! ! !
  23. $  egrep   -­‐  name -­‐  name -­‐  name -­‐

     name -­‐  name -­‐  name -­‐  name -­‐  name -­‐  name -­‐  name ! ! ! ! ! ! -­‐  name -­‐  name -­‐  name -­‐  name -­‐  name
  24. $  egrep  "box_url"  .kitchen.yml          box_url:  http://opscode-­‐vm-­‐bento.s3.amazonaws.com/vagrant/

    virtualbox/opscode_ubuntu-­‐12.04_chef-­‐provisionerless.box          box_url:  http://opscode-­‐vm-­‐bento.s3.amazonaws.com/vagrant/ virtualbox/opscode_debian-­‐7.2.0_chef-­‐provisionerless.box          box_url:  http://opscode-­‐vm-­‐bento.s3.amazonaws.com/vagrant/ virtualbox/opscode_centos-­‐6.5_chef-­‐provisionerless.box          box_url:  http://opscode-­‐vm-­‐bento.s3.amazonaws.com/vagrant/ virtualbox/opscode_centos-­‐5.10_chef-­‐provisionerless.box          box_url:  http://opscode-­‐vm-­‐bento.s3.amazonaws.com/vagrant/ virtualbox/opscode_fedora-­‐19_chef-­‐provisionerless.box
  25. require  File.expand_path("../support/helpers",  __FILE__)   ! describe  "riak::default"  do    

     include  Helpers::Riak   !    it  "installs  riak"  do          package(node["riak"]["package"]["enterprise_key"].empty?  ?  "riak"  :  "riak-­‐ee").must_be_installed      end   !    it  "responds  to  riak  ping"  do          assert(`riak  ping`  =~  /pong/)      end   !    it  "emits  riak  stats"  do          if  node['riak']['config']['riak_kv']['riak_kv_stat']              response  =  Net::HTTP.get_response(URI.parse("http://#{node['ipaddress']}:8098/stats"))              assert(response.body  =~  /sys_system_version/)          else              assert(true)          end      end   end
  26. #  /etc/riak/app.config   ! %%  -­‐*-­‐  mode:  erlang;erlang-­‐indent-­‐level:  4;indent-­‐tabs-­‐mode:  nil

     -­‐*-­‐   %%  ex:  ft=erlang  ts=4  sw=4  et   [    %%  Riak  Client  APIs  config    {riak_api,  [                          %%  pb_backlog  is  the  maximum  length  to  which  the  queue  of  pending                          %%  connections  may  grow.  If  set,  it  must  be  an  integer  >=  0.                          %%  By  default  the  value  is  5.  If  you  anticipate  a  huge  number  of                          %%  connections  being  initialized  *simultaneously*,  set  this  number                          %%  higher.                          %%  {pb_backlog,  64},                                                      %%  pb  is  a  list  of  IP  addresses  and  TCP  ports  that  the  Riak                            %%  Protocol  Buffers  interface  will  bind.                          {pb,  [  {"127.0.0.1",  8087}  ]}                          ]},       .  .  .   ! ].
  27. #  /etc/riak/vm.args   ! ##  Name  of  the  riak  node

      -­‐name  [email protected]   ! ##  Cookie  for  distributed  erlang.    All  nodes  in  the  same  cluster   ##  should  use  the  same  cookie  or  they  will  not  be  able  to  communicate.   -­‐setcookie  riak   ! ##  Heartbeat  management;  auto-­‐restarts  VM  if  it  dies  or  becomes  unresponsive   ##  (Disabled  by  default..use  with  caution!)   ##-­‐heart   ! ##  Enable  kernel  poll  and  a  few  async  threads   +K  true   +A  64
  28. #  /etc/riak/riak.conf   ! ##  The  enabled  Yokozuna  set  this

     'on'.   yokozuna  =  off   ! ##  The  port  number  which  Solr  binds  to.   yokozuna.solr_port  =  8093   ! ##  The  data  under  which  to  store  all  Yokozuna  related  data.   ##  Including  the  Solr  index  data.   yokozuna.data_dir  =  /var/lib/riak/yz   ! -­‐-­‐-­‐  snip  -­‐-­‐-­‐  snip  -­‐-­‐-­‐  snip  -­‐-­‐-­‐   ! ##  Name  of  the  riak  node   nodename  =  [email protected]   ! ##  Cookie  for  distributed  node  communication.    All  nodes  in  the  same  cluster   ##  should  use  the  same  cookie  or  they  will  not  be  able  to  communicate.   distributed_cookie  =  riak   ! erlang.async_threads  =  64
  29. module  Cuttlefish      def  self.compile(prefix,  config)      

       case  config          when  Array              "#{prefix}  =  #{config.join("  ")}"          when  String,  Fixnum,  Bignum,  Float,  Symbol              "#{prefix}  =  #{config}"          when  Hash,  Chef::Node::Attribute              prefix  =  "#{prefix}."  unless  prefix.empty?              config.map  {  |k,  v|  compile("#{prefix}#{k.chomp(".top_level")}",  v)  }.flatten          else              fail  Chef::Exceptions::UnsupportedAction,  "Can't  handle  type:  #{config.class}"          end      end   end
  30. require  'spec_helper'   ! describe  package('httpd')  do      it

     {  should  be_installed  }   end   ! describe  service('httpd')  do      it  {  should  be_enabled      }      it  {  should  be_running      }   end   ! describe  port(80)  do      it  {  should  be_listening  }   end   ! describe  file('/etc/httpd/conf/httpd.conf')  do      it  {  should  be_file  }      it  {  should  contain  "ServerName  www.example.jp"  }   end
  31. require  'spec_helper'   ! describe  package('riak')  do      it

     {  should  be_installed  }   end   ! describe  service('riak')  do      it  {  should  be_enabled      }      it  {  should  be_running      }   end   ! describe  port(8098)  do      it  {  should  be_listening  }   end   ! describe  file('/etc/riak/riak.conf')  do      it  {  should  be_file  }      it  {  should  contain  "nodename  =  [email protected]"  }   end