Menu

OpenTSDB Install

module.exports = header: 'OpenTSDB Install', handler: ({options}) ->

Register

  @registry.register ['file', 'jaas'], 'ryba/lib/file_jaas'

Identities

  @system.group header: 'Group', opentsdb.group
  @system.user header: 'User', opentsdb.user

IPTables

ServicePortProtoInfo
opentsdb4242httpOpenTSDB HTTP GUI

IPTables rules are only inserted if the parameter "iptables.action" is set to "start" (default value).

  @tools.iptables
    header: 'IPTables'
    rules: [
      { chain: 'INPUT', jump: 'ACCEPT', dport: opentsdb.config['tsd.network.port'], protocol: 'tcp', state: 'NEW', comment: "OpenTSDB HTTP GUI" }
    ]
    if: options.iptables

Install

OpenTSDB archive comes with an RPM

  @call header: 'Packages', ->
    @file.download
      source: opentsdb.source
      target: "/var/tmp/opentsdb-#{opentsdb.version}.noarch.rpm"
    @system.execute
      cmd: "yum localinstall -y --nogpgcheck /var/tmp/opentsdb-#{opentsdb.version}.noarch.rpm"
      unless_exec: "rpm -q --queryformat '%{VERSION}' opentsdb | grep '#{opentsdb.version}'"
    @system.chmod
      header: 'Fix permissions'
      target: "#{opentsdb.user.home}/etc/init.d/opentsdb"
      mode: 0o755
    @system.execute
      cmd: """
      if ! ls #{opentsdb.user.home}/lib/zookeeper-*.jar | wc -l; then exit 3; fi
      rm -f #{opentsdb.user.home}/lib/zookeeper-*.jar
      """
      code_skipped: 3
    @system.link
      source: '/usr/hdp/current/zookeeper-client/zookeeper.jar'
      target: "#{opentsdb.user.home}/lib/zookeeper.jar"

Kerberos

  @call
    header: 'Kerberos'
    if: opentsdb.config['hbase.security.authentication'] is 'kerberos'
  , ->
    @krb5.addprinc options.krb5.admin,
      principal: "#{opentsdb.user.name}/#{options.fqdn}@#{options.krb5.realm}"
      randkey: true
      keytab: '/etc/security/keytabs/opentsdb.service.keytab'
      uid: opentsdb.user.name
      gid: opentsdb.group.name
    @file.jaas
      target: '/etc/opentsdb/opentsdb.jaas'
      content: "#{opentsdb.config['hbase.sasl.clientconfig']}":
        principal: "#{opentsdb.user.name}/#{options.fqdn}@#{options.krb5.realm}"
        useTicketCache: true
      uid: opentsdb.user.name
      gid: opentsdb.group.name
    @cron.add
      cmd: "/usr/bin/kinit #{opentsdb.user.name}/#{options.fqdn}@#{options.krb5.realm} -k -t /etc/security/keytabs/opentsdb.service.keytab"
      when: '0 */9 * * *'
      user: opentsdb.user.name
      exec: true

Ranger User

  @ranger_user
    header: 'Ranger User'
    username: options.ranger_admin.username
    password: options.ranger_admin.password
    url: options.install['POLICY_MGR_URL']
    user: options.plugin_user

Ulimit

Increase ulimit for the OpenTSDB user. By default, ryba will create the file:

cat /etc/security/limits.d/opentsdb.conf
opentsdb   - nofile 65535
opentsdb   - nproc  24576

If not configured, the following message appear on startup:

Starting opentsdb: /etc/init.d/opentsdb: line 69: ulimit: open files: cannot modify limit: Operation not permitted
'ulimit -n' must be greater than or equal to 65535, is 1024
  @system.limits
    header: 'Ulimit'
    user: opentsdb.user.name
  , opentsdb.user.limits

Fix Service

  # Some config properties aren't honored, force JVM Arguments
  @file
    header: 'Fix Service Script'
    target: "#{opentsdb.user.home}/etc/init.d/opentsdb"
    write: [
      match: /^USER=.*$/mg
      replace: "USER=#{opentsdb.user.name} # RYBA CONF `user`, DON'T OVERWRITE"
    ,
      match: /^.*# RYBA CONF `env` and `java_opts`, DON'T OVERWRITE$/m
      replace: "  JVMARGS=\"${JVMARGS}#{" -D#{k}=#{v}" for k, v of opentsdb.env} #{opentsdb.java_opts}\" # RYBA CONF `env` and `java_opts`, DON'T OVERWRITE"
      place_before: /^( *)export JVMARGS$/m
    ]

Startup Script

  @service.init
    header: 'Init Script'
    target: "/etc/init.d/opentsdb"
    source: "#{opentsdb.user.home}/etc/init.d/opentsdb"

Configure

  @file.properties
    header: 'Configuration'
    target: '/etc/opentsdb/opentsdb.conf'
    content: opentsdb.config
    backup: true

HBase Table

  @call once: true, 'ryba/hbase/master/wait'

  namespaces = []
  tables = {}
  for table in ['data', 'uid', 'tree', 'meta']
    tables[table] = opentsdb.config["tsd.storage.hbase.#{table}_table"]
    split = tables[table].split ':'
    genericErr = new Error "Incorrect table name for table '#{table}': must be [<ns>:]<table>"
    if split.length > 2
      throw genericErr
    else if split.length is 2
      namespaces.push split[0]
  @call if: namespaces.length > 0, header: 'Create HBase namespaces', ->
    for ns in namespaces
      @system.execute
        cmd: mkcmd.hbase @, """
        hbase shell -n <<< "create_namespace '#{ns}'"
        """
        unless_exec: mkcmd.hbase @, "hbase shell -n <<< 'list_namespace' | grep '#{ns}'"
      @system.execute
        cmd: mkcmd.hbase @, """
        hbase shell -n <<< "grant '#{opentsdb.user.name}', 'RWXCA', '@#{ns}'"
        """
        shy: true
  @system.execute
    header: 'Create HBase tables'
    # hbase shell -n : quit on ERROR with non-zero status
    cmd: mkcmd.hbase @, """
    hbase shell -n <<CMD
      create '#{tables['uid']}',
        {NAME => 'id', COMPRESSION => '#{opentsdb.hbase.compression}', BLOOMFILTER => '#{opentsdb.hbase.bloomfilter}'},
        {NAME => 'name', COMPRESSION => '#{opentsdb.hbase.compression}', BLOOMFILTER => '#{opentsdb.hbase.bloomfilter}'}
      create '#{tables['data']}',
        {NAME => 't', VERSIONS => 1, COMPRESSION => '#{opentsdb.hbase.compression}', BLOOMFILTER => '#{opentsdb.hbase.bloomfilter}'}
      create '#{tables['tree']}',
        {NAME => 't', VERSIONS => 1, COMPRESSION => '#{opentsdb.hbase.compression}', BLOOMFILTER => '#{opentsdb.hbase.bloomfilter}'}
      create '#{tables['meta']}',
        {NAME => 'name', COMPRESSION => '#{opentsdb.hbase.compression}', BLOOMFILTER => '#{opentsdb.hbase.bloomfilter}'}
      grant '#{opentsdb.user.name}', 'RWXCA', '#{tables['uid']}'
      grant '#{opentsdb.user.name}', 'RWXCA', '#{tables['data']}'
      grant '#{opentsdb.user.name}', 'RWXCA', '#{tables['tree']}'
      grant '#{opentsdb.user.name}', 'RWXCA', '#{tables['meta']}'
    CMD
    """
    unless_exec: mkcmd.hbase @, "[ `hbase shell -n <<< 'list' | egrep '^(#{tables['uid']}|#{tables['data']}|#{tables['tree']}|#{tables['meta']})' | sort | uniq | wc -l` -eq 4 ]"

Dependencies

mkcmd = require '../lib/mkcmd'