ブログ

割とコンピュータよりの情報をお届けします。

2018年7月22日

MongoDBの周辺スクリプトの作成の続き

MongoDB(特に4.0.0のWindows用)の設定関係のファイルを引き続き作っていた。

サンプル作成が異常に面倒である。
今回もファイルサイズが大きすぎて本文に埋め込めなくなってしまった。

環境変数の読み込み用ファイルenv.bat
(cmdのショートカットのリンク先にC:\Windows\System32\cmd.exe /k "C:\mongodb-4.0.0\env.bat"などと設定して使うのも)

@echo off
set "PATH=%~dp0;%PATH%"
SET PATH=%PATH%;C:\mongodb-4.0.0\bin

setlocal enabledelayedexpansion
pushd "%~dp0"

popd
endlocal

 

MongoDBをスタートするスクリプト mongodb_start.cmd

mongod --config "C:\mongodb-4.0.0\mongod.cfg"

 

MongoDBをWindowsサービスにするスクリプト mongodb_install_service.cmd

set service_name=MONGODB_TAKEME_APP
mongod --install --config "C:\mongodb-4.0.0\mongod.cfg" --serviceName %service_name% --serviceDisplayName "MONGODB FOR TAKEME_APP" --serviceDescription "MongoDB 4.0.0 for TakeMe Applications."
net start %service_name%

 

MongoDBをWindowsサービスから削除する mongodb_remove_service.cmd

set service_name=MONGODB_TAKEME_APP
net stop %service_name%
mongod --remove --serviceName "MONGODB_TAKEME_APP"

 

MongoDBの設定ファイル mongod.cfg
ユーザ入れかえ mongodb_change_username.cmd
(username.jsに新しいユーザ名usernameOld.jsに古いユーザ名を入れて実行)

set service_name=MONGODB_TAKEME_APP
mongo localhost:27017 Init0.js
net stop %service_name%
net start %service_name%
mongo localhost:27017 Init1.js

管理ユーザで実行しないと使えないけど参考のファイルなど添付しておきます(Search consoleで警告が出たので中止)。

 

特にユーザ交換スクリプトは以下のようにInit0.jsを実行する。

conn = new Mongo("localhost:27017");
db  = conn.getDB("admin");
load('usernameOld.js');

db.auth(username, password);

var lstUsers = db.getUsers();
var users = [];
for (var i = 0; i < lstUsers.length; i++) {
  users.push(lstUsers[i].user);
}

db = conn.getDB('TAKEME_APP');
db.auth(username, password);
for (var i = 0; i <users.length; i++) {
  db.dropUser(users[i]);
}

db = conn.getDB('admin');
db.auth(username, password);
for (var i = 0; i <users.length; i++) {
  db.dropUser(users[i]);
}

 

設定を行う本体スクリプトInit1.js

conn = new Mongo("localhost:27017");
db  = conn.getDB("admin");
load('username.js');

db.createUser(
  {
    user: username,
    pwd: password,
    roles: [
      {
        "role": "root",
        "db" : "admin"
      },
      {
        "role": "userAdmin",
        "db" : "admin"
      },
      {
        "role": "hostManager",
        "db" : "admin"
      }
    ]
  }
);

db.auth(username, password);

var lstUsers = db.getUsers();
var users = [];
for (var i = 0; i < lstUsers.length; i++) {
  if (lstUsers[i].user !== username)
    users.push(lstUsers[i].user);
}

for (var i = 0; i <users.length; i++) {
  db.dropUser(users[i]);
}


db = conn.getDB('TAKEME_APP');
for (var i = 0; i < users.length; i++) {
  db.dropUser(users[i]);
}

db.createUser(
  {
    user: username,
    pwd: password,
    roles: [
      {
        "role": "readWrite",
        "db" : "TAKEME_APP"
      }
    ]
  }
);


注意はmongo shellでJavaScriptを実行する場合,conn = new Mongo("localhost:27017"); db = conn.getDB("admin");などを使ってdbを指定してこないといけない。use admin;などでdbが指定できるコンソールと若干異なる。

≫ 続きを読む

2018/07/22 コンピュータ   TakeMe

MongoDBの設定ファイルを作らされた

先週からMongoDBの設定ファイルを作らされていた。enableLocalhostAuthBypassってローカルなら認証いらないのでは?と思っていたら違うらしい。

作ったファイルの例(Windows用に直し)は以下のようなもの。

systemLog:
    destination: file
    path: "C:/mongodb/logs/log.txt"
net:
    bindIp: 127.0.0.1
    port: 27017
storage:
    dbPath: "C:/mongodb/data"
    journal:
        enabled: true
        commitIntervalMs: 500
    engine: wiredTiger
    wiredTiger:
      engineConfig:
         cacheSizeGB: 1.0
         journalCompressor: zlib
      collectionConfig:
         blockCompressor: zlib    
setParameter:
    enableLocalhostAuthBypass: true
#    enableLocalhostAuthBypass: false
security:
    authorization: enabled
#    authorization: disabled
   

設定の仕方何度も確認したが,enableLocalhostAuthBypass: trueをいれてもコマンド実行になると認証が省けない。
読んでみるとadminデータベースの最初のユーザが作成されるまでの限定的操作では有効だがその後は関係ないらしい…

基本的には,一度目のcreateUserが完了するまで一部コマンドのみ有効である(getUsersなどは使えない)。普通はadminデータベースにユーザを追加する。
ところが,いったんdropUserでこのユーザを削除してしまうとmongodbを再起動するまではこの設定は無効である。

また,createUserで複数のユーザを作成している場合(adminデータベース以外のデータベースに対するユーザもカウントされるようである)には,一つだけdropUserで削除したところでまだユーザが残っているのでmongodbを再起動してもこの設定は無効である。

≫ 続きを読む

2018/07/22 コンピュータ   TakeMe