Menu

MongoDB Config Server Replica Set Initialization

module.exports =  header: 'MongoDB ConfigSrv Replicat Set', handler: ({options}) ->

The "userAdminAnyDatabase" role is the first account created thanks to localhost exception. It used to manage every other users and their roles. For the root user having the right to deal with privileges does not give him the role of root (ie manage replica sets).

  mongodb_admin =
    user: "#{options.admin.name}"
    pwd: "#{options.admin.password}"
    roles:  [ { role: "userAdminAnyDatabase", db: "admin" }]
  mongodb_root =
    user: "#{options.root.name}"
    pwd: "#{options.root.password}"
    roles: [ { role: "root", db: "admin" } ]

Admin Users

Create the admin user and root user as specified. It uses the LocalHost Exception to bind to mongod instance in order to create user without authentication. The admin user is need for account creation and has the role userAdminAnyDatabase. The root user is needed for replication and has role root

  @call
    header: 'Roles Admin DB',
    if: -> options.is_master
    unless_exec: """
      echo exit | mongo admin \
        --port #{options.config.net.port} \
        --username #{options.admin.name} \
        --password  '#{options.admin.password}'
      echo exit | mongo admin \
        --port #{options.config.net.port} \
        --username #{options.root.name} \
        --password  '#{options.root.password}'
    """
  , ->
    @service.stop
      name: 'mongod-config-server'
    @file.yaml
      target: "#{options.conf_dir}/mongod.conf"
      content:
        replication: null
      merge: true
      uid: options.user.name
      gid: options.group.name
      mode: 0o0750
      backup: true
    @service.start
      name: 'mongod-config-server'
    @connection.wait options.wait.local
    @system.execute
      cmd: """
      mongo admin \
        --port #{options.config.net.port} \
        --eval <<-EOF \
      'printjson( db.createUser( \
        { user: \"#{options.admin.name}\", pwd: \"#{options.admin.password}\", roles: [ { role: \"userAdminAnyDatabase\", db: \"admin\" }]} \
      ))'
      EOF
      """
      unless_exec: """
      echo exit | mongo admin \
        --port #{options.config.net.port} \
        --username #{options.admin.name} \
        --password  '#{options.admin.password}''
      """
      code_skipped: 252
    @system.execute
      cmd: """
      mongo admin \
        --port #{options.config.net.port} \
        --username #{options.admin.name} \
        --password  '#{options.admin.password}' \
        --eval <<-EOF \
      'printjson(db.createUser( \
        { user: \"#{options.root.name}\", pwd: \"#{options.root.password}\", roles: [ { role: \"root\", db: \"admin\" }]} \
      ))'
      EOF
      """
      unless_exec: "echo exit | mongo admin \
        --port #{options.config.net.port} \
        --username #{options.root.name} \
        --password  '#{options.root.password}'"
      code_skipped: 252
    @file.yaml
      target: "#{options.conf_dir}/mongod.conf"
      content: options.config
      merge: true
      uid: options.user.name
      gid: options.group.name
      mode: 0o0750
      backup: true
    @service.stop
      if: -> @status -1
      name: 'mongod-config-server'
    @service.start
      if: -> @status -1
      name: 'mongod-config-server'
  @connection.wait options.wait.local

Replica Set Initialization

  @call
    header: 'Init Master'
    if: -> options.is_master
  , ->
    config =
      _id: options.config.replication.replSetName
      version: 1
      members: [_id:0, host: "#{options.fqdn}:#{options.config.net.port}"]
    @call (_, callback) ->
      @system.execute
        cmd: """
        mongo admin \
          --port #{options.config.net.port} \
          --username #{options.root.name} \
          --password  '#{options.root.password}' \
          --eval 'rs.status().ok' \
        | grep -v 'MongoDB.*version' \
        | grep -v 'connecting to:'
        """
      , (err, _, stdout) ->
        return callback err if err
        status =  parseInt(stdout)
        return callback null, true if +status == 0
        callback null, +status is 0
    @system.execute
      if: -> @status -1
      cmd: """
      mongo admin \
        --port #{options.config.net.port} \
        --username #{options.root.name} \
        --password  '#{options.root.password}' \
        --eval 'rs.initiate(#{JSON.stringify config})'
      """

Replica Set Members

  @call
    header: 'Set Members'
    if: -> options.is_master
  , ->
    @system.execute (
      cmd: """
      mongo admin \
        --port #{options.config.net.port} \
        --username #{options.root.name} \
        --password  '#{options.root.password}' \
        --eval 'rs.add(\"#{host}:#{options.config.net.port}\")'
      """
      unless_exec: """
      mongo admin \
        --port #{options.config.net.port} \
        --username #{options.root.name} \
        --password  '#{options.root.password}' \
        --eval 'rs.conf().members' | grep '#{host}:#{options.config.net.port}'
      """
    ) for host in options.replicasets[options.config.replication.replSetName].hosts