diff --git a/lib/puppet/provider/mongodb.rb b/lib/puppet/provider/mongodb.rb index 1e69d42ec..5f5c7cebb 100644 --- a/lib/puppet/provider/mongodb.rb +++ b/lib/puppet/provider/mongodb.rb @@ -132,9 +132,19 @@ def self.conn_string def self.db_ismaster cmd_ismaster = 'db.isMaster().ismaster' - cmd_ismaster = mongorc_file + cmd_ismaster if mongorc_file db = 'admin' - res = mongo_cmd(db, conn_string, cmd_ismaster).to_s.chomp + + full_command = if mongorc_file + mongorc_file + cmd_ismaster + else + cmd_ismaster + end + res = mongo_cmd(db, conn_string, full_command).to_s.chomp + + # Retry command without authentication when mongorc_file is set and authentication failed + if mongorc_file && res =~ %r{Authentication failed} + res = mongo_cmd(db, conn_string, cmd_ismaster).to_s.chomp + end res.eql?('true') ? true : false end diff --git a/lib/puppet/provider/mongodb_database/mongodb.rb b/lib/puppet/provider/mongodb_database/mongodb.rb index 8be330779..238f6158d 100644 --- a/lib/puppet/provider/mongodb_database/mongodb.rb +++ b/lib/puppet/provider/mongodb_database/mongodb.rb @@ -12,6 +12,9 @@ def self.instances new(name: db['name'], ensure: :present) end + rescue => e + Puppet.warning("Getting instances of mongodb_database failed: #{e}") + [] end # Assign prefetched dbs based on name. diff --git a/lib/puppet/provider/mongodb_user/mongodb.rb b/lib/puppet/provider/mongodb_user/mongodb.rb index 1309375b7..5e9c5747a 100644 --- a/lib/puppet/provider/mongodb_user/mongodb.rb +++ b/lib/puppet/provider/mongodb_user/mongodb.rb @@ -27,16 +27,21 @@ def self.instances end return allusers else - users = JSON.parse mongo_eval('printjson(db.system.users.find().toArray())') - - users.map do |user| - new(name: user['_id'], - ensure: :present, - username: user['user'], - database: user['db'], - roles: from_roles(user['roles'], user['db']), - password_hash: user['credentials']['MONGODB-CR'], - scram_credentials: user['credentials']['SCRAM-SHA-1']) + begin + users = JSON.parse mongo_eval('printjson(db.system.users.find().toArray())') + + users.map do |user| + new(name: user['_id'], + ensure: :present, + username: user['user'], + database: user['db'], + roles: from_roles(user['roles'], user['db']), + password_hash: user['credentials']['MONGODB-CR'], + scram_credentials: user['credentials']['SCRAM-SHA-1']) + end + rescue => e + Puppet.warning "Could not get instances for mongodb_database: #{e}" + [] end end else @@ -84,7 +89,7 @@ def create "roles": #{@resource[:roles].to_json}, "digestPassword": false } - EOS + EOS mongo_eval("db.runCommand(#{cmd_json})", @resource[:database]) end @@ -155,7 +160,7 @@ def roles=(roles) else grant = roles - @property_hash[:roles] unless grant.empty? - mongo_eval("db.getSiblingDB('#{@resource[:database]}').grantRolesToUser('#{@resource[:username]}', #{grant. to_json})") + mongo_eval("db.getSiblingDB('#{@resource[:database]}').grantRolesToUser('#{@resource[:username]}', #{grant.to_json})") end revoke = @property_hash[:roles] - roles