2018年7月23日月曜日

Vagrantでosqueryをインストールした仮想マシン(Ubuntu16.04)を構築する

osqueryでシステムの様々な情報をSQLで参照する事が事ができます。

〇構築方法
以下のVagrantfileを使用して、osqueryをインストールした仮想マシン(Ubuntu16.04)を構築します。
仮想マシンにログイン後、osqueryiコマンドを使用してシステム情報を取得します。参照できるテーブルはhttps://osquery.io/schema/に記されています。

Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "bento/ubuntu-16.04"
  config.vm.hostname = "ub1604osquery"
  config.vm.provider :virtualbox do |vbox|
     vbox.name = "ub1604osquery"
     vbox.cpus = 2
     vbox.memory = 2048
     vbox.customize ["modifyvm", :id, "--nicpromisc2","allow-all"]
  end
config.vm.network "private_network", ip: "192.168.55.104", :netmask => "255.255.255.0"
config.vm.network "public_network", ip:"192.168.1.104", :netmask => "255.255.255.0"
  config.vm.provision "shell", inline: <<-SHELL
sed -i -e 's/# ja_JP.UTF-8 UTF-8/ja_JP.UTF-8 UTF-8/' /etc/locale.gen
locale-gen
localectl set-locale LANG=ja_JP.UTF-8
localectl set-keymap jp106
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade

# install osquery
wget https://pkg.osquery.io/deb/osquery_3.2.6_1.linux.amd64.deb
dpkg -i osquery_3.2.6_1.linux.amd64.deb

# sample query
sudo osqueryi "select * from device_partitions where device = '/dev/sda'"

SHELL
end

VagrantでCrontab UIをインストールした仮想マシン(CentOS7.5)を構築する

Crontab UIでWebブラウザからcrontabを編集・管理を行うことができます。

〇Crontab UIの画面


〇構築方法
以下のVagrantfileを使用して、Crontab UIをインストールした仮想マシン(CentOS7.5)を構築することができます。

Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "bento/centos-7.5"
  config.vm.hostname = "co75crontabui"
  config.vm.provider :virtualbox do |vbox|
     vbox.name = "co75crontabui"
     vbox.cpus = 2
     vbox.memory = 2048
     vbox.customize ["modifyvm", :id, "--nicpromisc2","allow-all"]
  end
config.vm.network "private_network", ip: "192.168.55.107", :netmask => "255.255.255.0"
config.vm.network "public_network", ip:"192.168.1.107", :netmask => "255.255.255.0"
  config.vm.provision "shell", inline: <<-SHELL
localectl set-locale LANG=ja_JP.UTF-8

# install node
yum -y install curl git
curl -sL http://nsolid-rpm.nodesource.com/nsolid_setup_3.x | sudo bash -
yum -y install nsolid-boron nsolid-console

# install crontab-ui
npm install -g crontab-ui

cat << EOF > /etc/systemd/system/crontabui.service
[Unit]
Description=crontab-ui
[Service]
Type=simple
Environment=HOST=0.0.0.0
Environment=PORT=9000
ExecStart=/usr/bin/crontab-ui
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
systemctl enable crontabui.service
systemctl start crontabui.service

echo 'access -> http://192.168.1.107:9000'
SHELL
end


○関連情報
・Crontab UIに関する他の記事はこちらを参照してください。

2018年7月22日日曜日

VagrantでApache AirflowとMySQLをインストールした仮想マシン(CentOS7.5)を構築する

Apache AirflowはPython言語のタスクスケジューラです。

〇Apache Airflowの画面


〇構築方法
1.以下のVagrantfileを使用して、 Apache Airflowをインストールした仮想マシン(CentOS7.5)を構築します。

Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "bento/centos-7.5"
  config.vm.hostname = "co75airflow"
  config.vm.provider :virtualbox do |vbox|
     vbox.name = "co75airflow"
     vbox.cpus = 4
     vbox.memory = 4096
     vbox.customize ["modifyvm", :id, "--nicpromisc2","allow-all"]
  end
config.vm.network "private_network", ip: "192.168.55.115", :netmask => "255.255.255.0"
config.vm.network "public_network", ip:"192.168.1.115", :netmask => "255.255.255.0"
  config.vm.provision "shell", inline: <<-SHELL
localectl set-locale LANG=ja_JP.UTF-8
timedatectl set-timezone Asia/Tokyo

# install mysql
sudo yum -y remove mariadb-libs
yum -y localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
yum -y install yum-utils
yum -y install mysql mysql-server
sudo systemctl enable mysqld.service
sudo systemctl start mysqld.service
# change password and create users and databases.
chkconfig mysqld on
service mysqld start
export MYSQL_ROOTPWD='Root123#'
export MYSQL_PWD=`cat /var/log/mysqld.log | awk '/temporary password/ {print $NF}'`
mysql -uroot --connect-expired-password -e "SET PASSWORD = PASSWORD('Root123#'); FLUSH PRIVILEGES;"
mysql -uroot -pRoot123# -e "UNINSTALL PLUGIN validate_password;"
mysql -uroot -pRoot123# -e "SET PASSWORD = PASSWORD('root'); FLUSH PRIVILEGES;"
mysql -uroot -proot -e "CREATE DATABASE airflow DEFAULT CHARACTER SET utf8;"

mysql -uroot -proot -e "CREATE USER airflow@localhost IDENTIFIED BY 'airflow';"
mysql -uroot -proot -e "GRANT ALL PRIVILEGES ON airflow.* TO 'airflow'@'localhost';"
mysql -uroot -proot -e "FLUSH PRIVILEGES;"

yum -y install epel-release
yum update
yum -y install python36 python-devel python36-devel gcc-c++ openldap-devel openssl-devel mysql-devel
yum -y install redis
systemctl enable redis
systemctl start redis

# install pipenv
yum -y install python-pip
#pip install --upgrade pip
pip install pip==9.0.1
pip install --upgrade setuptools
pip install pipenv


# install airflow.
groupadd airflow
useradd -g airflow -s /bin/bash -d /home/airflow -m airflow

mkdir -p /opt/airflow/dags
chown -R airflow:airflow /opt/airflow
sudo -u airflow /bin/bash << AF_EOF
export AIRFLOW_HOME=/opt/airflow
export HOME=/home/airflow
cd /opt/airflow
echo $HOME
pipenv --python 3.6
pipenv install
pipenv run python -V
pipenv install redis
pipenv install apache-airflow[devel,mysql,celery,cryptography]==1.9.0

wget https://raw.githubusercontent.com/apache/incubator-airflow/master/airflow/config_templates/default_airflow.cfg
cp default_airflow.cfg airflow.cfg

sed -i -e 's#sql_alchemy_conn = sqlite:///\{AIRFLOW_HOME\}/airflow.db#sql_alchemy_conn = mysql://airflow:airflow@localhost:3306/airflow#'  airflow.cfg
sed -i -e 's/executor = SequentialExecutor/executor = CeleryExecutor/' airflow.cfg
sed -i -e 's#\{AIRFLOW_HOME\}#/opt/airflow#' airflow.cfg
sed -i -e 's#broker_url = sqla\+mysql://airflow:airflow@localhost:3306/airflow#broker_url = redis://localhost:6379#' airflow.cfg
sed -i -e 's#load_examples = True#load_examples = False#' airflow.cfg
sed -i -e 's#default_timezone = utc#default_timezone = Asia/Tokyo#' airflow.cfg

cat << EOF > gen.py
from cryptography.fernet import Fernet
fernet_key= Fernet.generate_key()
print(fernet_key.decode('utf-8'), end='"')
EOF
pipenv run python gen.py > /tmp/fernet_key
echo -n 'export FERNET_KEY="' > /tmp/setfernetkey
cat /tmp/fernet_key >> /tmp/setfernetkey
AF_EOF

source /tmp/setfernetkey
sed -i -e "s/{FERNET_KEY}/$FERNET_KEY/" /opt/airflow/airflow.cfg

sudo -u airflow /bin/bash << AF_EOF
export AIRFLOW_HOME=/opt/airflow
export HOME=/home/airflow
cd /opt/airflow
pipenv run airflow initdb

# prepare a sample dag
cat << EOF > /opt/airflow/dags/dag_example1.py
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta

operator_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2018, 7, 1),
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
}

dag = DAG(
    dag_id='dag_example1',
    default_args=operator_args,
    catchup=False,
    schedule_interval='0,5,10,15,20,25,30,35,40,45,50,55 * * * *'
)

task1 = BashOperator(
    task_id='task1',
    bash_command='echo "task1:"`date` >> /tmp/test.log',
    dag=dag
)

task2 = BashOperator(
    task_id='task2',
    bash_command='sleep 5 && echo "task2:"`date` >> /tmp/test.log',
    dag=dag
)

task1 >> task2
EOF
AF_EOF

mkdir -p /run/airflow
chown airflow:airflow /run/airflow

# setup worker service
cat << EOF > /etc/systemd/system/airflow-worker.service
[Unit]
Description=Airflow worker daemon
Requires=network.target

[Service]
User=airflow
Group=airflow
Type=simple
WorkingDirectory=/opt/airflow
Environment=AIRFLOW_HOME=/opt/airflow
ExecStart=/bin/pipenv run airflow worker --pid /run/airflow/worker.pid
Restart=on-failure
RestartSec=30s

[Install]
WantedBy=multi-user.target
EOF
systemctl enable airflow-worker.service
systemctl start airflow-worker.service

# setup scheduler service
cat << EOF > /etc/systemd/system/airflow-scheduler.service
[Unit]
Description=Airflow scheduler daemon
Requires=network.target

[Service]
User=airflow
Group=airflow
Type=simple
WorkingDirectory=/opt/airflow
Environment=AIRFLOW_HOME=/opt/airflow
ExecStart=/bin/pipenv run airflow scheduler --pid /run/airflow/scheduler.pid
Restart=on-failure
RestartSec=30s

[Install]
WantedBy=multi-user.target
EOF
systemctl enable airflow-scheduler.service
systemctl start airflow-scheduler.service

cat << EOF > /etc/systemd/system/airflow-webserver.service
[Unit]
Description=Airflow webserver daemon
Requires=network.target

[Service]
User=airflow
Group=airflow
Type=simple
WorkingDirectory=/opt/airflow
Environment=AIRFLOW_HOME=/opt/airflow
ExecStart=/bin/pipenv run airflow webserver --pid /run/airflow/webserver.pid
Restart=on-failure
RestartSec=30s

[Install]
WantedBy=multi-user.target
EOF
systemctl enable airflow-webserver.service
systemctl start airflow-webserver.service

echo 'url  -> http://192.168.55.115:8080/'
SHELL
end

2. ブラウザでhttp://192.168.55.115:8080/にアクセスして、サンプルDAGのdag_example1をPause状態のOffからOnに変更します。5分程度待つとジョブが実行されます。

○関連情報
・Apache Airflowに関する他の記事はこちらを参照してください。

VagrantでKottiがインストールされた仮想マシンを構築(Ubuntu18.04)する

KottiはPython製のCMSです。

○Kottiの画面

仮想マシンが構築された後、ブラウザからhttp://192.168.55.105:5000/にアクセスします。
デフォルトのユーザはadmin、パスワードはqwertyです。

○構築方法
以下のVagrantfileを使用して、Kottiがインストールされた仮想マシンを構築する事ができます。

Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "bento/ubuntu-18.04"
  config.vm.hostname = "ub1804kotti"
  config.vm.provider :virtualbox do |vbox|
     vbox.name = "ub1804kotti"
     vbox.cpus = 2
     vbox.memory = 2048
     vbox.customize ["modifyvm", :id, "--nicpromisc2","allow-all"]
  end
config.vm.network "private_network", ip: "192.168.55.105", :netmask => "255.255.255.0"
config.vm.network "public_network", ip:"192.168.1.105", :netmask => "255.255.255.0"
  config.vm.provision "shell", inline: <<-SHELL
sed -i -e 's/# ja_JP.UTF-8 UTF-8/ja_JP.UTF-8 UTF-8/' /etc/locale.gen
locale-gen
localectl set-locale LANG=ja_JP.UTF-8
localectl set-keymap jp106
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade

# install virtualenv
apt-get -y install python-pip build-essential python-dev
#pip install --upgrade pip
pip install virtualenv
# install kotti
mkdir -p /opt/kotti
cd /opt/kotti
virtualenv mysite
cd mysite
bin/pip install -r https://raw.github.com/Kotti/Kotti/stable/requirements.txt
bin/pip install Kotti==1.3.2
bin/pip install kotti_tinymce
wget https://raw.github.com/Kotti/Kotti/stable/app.ini
sed -i -e 's/host = 127.0.0.1/host = 192.168.55.105/' app.ini

cat << EOF > /etc/systemd/system/kotti.service
[Unit]
Description=kotti
[Service]
Type=simple
ExecStartPre=/usr/local/bin/virtualenv mysite
ExecStart=/opt/kotti/mysite/bin/pserve /opt/kotti/mysite/app.ini
WorkingDirectory=/opt/kotti/mysite
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
systemctl enable kotti.service
systemctl start kotti.service

echo 'access to http://192.168.55.105:5000/'
echo 'user: admin   password: qwerty'
SHELL
end


○関連情報
・Kottiに関する他の記事はこちらを参照してください。

2018年7月21日土曜日

PortainerでJupyter LabとRethinkDBのスタックを作成する

Jupyter Notebookでインタラクティブなコンピューティング環境を提供する事ができます。Portainerで簡単にwebブラウザからJupyter LabとRethinkDBのスタックを作成する事ができます。

○Jupyter Labの画面


〇構築方法
1.Portainer画面横のImagesをクリックして、Image list画面からBuild a new imageボタンをクリック


2.Build image画面nameフィールドにmyjupyter-rethinkdbを入力

3.Web editorのテキストエリアに以下を貼り付け
FROM jupyter/scipy-notebook
ENV TZ=Asia/Tokyo
USER root
RUN pip install rethinkdb
USER $NB_UID



貼り付け後、build the image ボタンをクリックします。

4.画面横のStacksをクリック後、Stacks list画面でAdd a stackボタンをクリックします


5.Create stack画面で、Nameフィールドにjupyterlab-rethinkdb-stackを入力し、Web editorに以下を張り付ける
version: "3"
services:
  myjupyter:
    image: myjupyter-rethinkdb
    container_name: "myjupyter-rethinkdb"
    volumes:
      - "myjupyter-data:/home/jovyan/work"
    ports:
      - "8888:8888"
    environment:
      JUPYTER_TOKEN: jupyter
      JUPYTER_ENABLE_LAB: 1
    depends_on:
      - db
  db:
    image: rethinkdb:2.3.6
    container_name: "rethinkdb"
    volumes:
      - "rethinkdb-data:/data"
    ports:
      - "6379:6379"
volumes:
  rethinkdb-data:
    driver: local
  myjupyter-data:
    driver: local



貼り付け後、deploy stackボタンをクリックします。

6.ブラウザから以下のURLにアクセス
http://<Dockerホスト名またはIP>:8888/?token=jupyter

〇動作検証用コード
import rethinkdb as r

r.connect('db', 28015).repl()
r.db("test").table_create("messages").run()
r.db("test").table("messages").insert({"message_id":"100", "message":"hello world!"}).run()

cursor = r.db('test').table("messages").run()

for document in cursor:
    print(document)


○関連情報
・RethinkDBに関する他の記事はこちらを参照してください。

・Portainerに関する他の記事はこちらを参照してください。

DockerでMetabase、MongoDB、PostgreSQL10.4をインストールしたコンテナを構築する

Metabaseはオープンソースのデータ解析・可視化ツールです。

○Metabaseの画面


○構築方法
1.Metabase、MongoDB、PostgreSQL10.4をインストールしたコンテナを構築するには、以下のコマンドを実行します。
docker-compose up -d

docker-compose.yml
services:
  metabase:
    image: metabase/metabase
    container_name: "metabase"
    volumes:
      - "metabase-data:/metabase-data"
    environment:
      MB_DB_TYPE: postgres
      MB_DB_DBNAME: metabase
      MB_DB_PORT: 5432
      MB_DB_USER: postgres
      MB_DB_PASS: metabase
      MB_DB_HOST: db
    ports:
      - "3000:3000"
    depends_on:
      - db
      - mongodb
  db:
    image: postgres:10.4-alpine
    container_name: "metabase-db"
    ports:
      - "5432:5432"
    volumes:
      - "db-data:/var/lib/postgresql/data"
    environment:
        POSTGRES_DB: metabase
        POSTGRES_PASSWORD: metabase
  mongodb:
    image: mongo:3.7-jessie
    container_name: "mongodb"
    volumes:
      - "mongodb-data:/data/db"
      - "mongodb-configdb:/data/configdb"
    environment:
      MONGO_INITDB_ROOT_USERNAME: mongo
      MONGO_INITDB_ROOT_PASSWORD: mongo
    ports:
      - 27017:27017
volumes:
  mongodb-data:
    driver: local
  mongodb-configdb:
    driver: local
  db-data:
    driver: local
  metabase-data:
    driver: local

2.ブラウザからブラウザからhttp://<DockerホストのIP>:3000/にアクセスします。
ユーザ情報を入力します。


3.データベースのタイプを選択します


4.接続データベース情報を以下のように入力します
Database type: PostgreSQL
Host: db
Port: 5432
Database name: metabase
Database username: postgres
Database password: metabase
これ以降はお好みで選択します。


5.設定完了後、Admin PanelのAdd databaseをクリックして、mongodbを追加します。
Database type: MongoDB
Host: mongodb
Port: 27017
Database name: admin
Database username: mongo
Database password: mongo



○関連情報
・Metabaseに関する他の記事はこちらを参照してください。

2018年7月20日金曜日

PortainerでJupyter LabとRedisのスタックを作成する

Jupyter Notebookでインタラクティブなコンピューティング環境を提供する事ができます。Portainerで簡単にwebブラウザからJupyter LabとRedisのスタックを作成する事ができます。

○Jupyter Labの画面


〇構築方法
1.Portainer画面横のImagesをクリックして、Image list画面からBuild a new imageボタンをクリック


2.Build image画面nameフィールドにmyjupyter-redisを入力

3.Web editorのテキストエリアに以下を貼り付け
FROM jupyter/scipy-notebook
ENV TZ=Asia/Tokyo
USER root
RUN pip install redis
USER $NB_UID



貼り付け後、build the image ボタンをクリックします。

4.画面横のStacksをクリック後、Stacks list画面でAdd a stackボタンをクリックします


5.Create stack画面で、Nameフィールドにjupyterlab-redis-stackを入力し、Web editorに以下を張り付ける
version: "3"
services:
  myjupyter:
    image: myjupyter-redis
    container_name: "myjupyter-redis"
    volumes:
      - "myjupyter-data:/home/jovyan/work"
    ports:
      - "8888:8888"
    environment:
      JUPYTER_TOKEN: jupyter
      JUPYTER_ENABLE_LAB: 1
    depends_on:
      - db
  db:
    image: redis:alpine
    container_name: "redis"
    volumes:
      - "redis-data:/data"
    ports:
      - "6379:6379"
volumes:
  redis-data:
    driver: local
  myjupyter-data:
    driver: local



貼り付け後、deploy stackボタンをクリックします。

6.ブラウザから以下のURLにアクセス
http://<Dockerホスト名またはIP>:8888/?token=jupyter

〇動作検証用コード
import redis

r = redis.StrictRedis(host='db', port=6379, db=0)
r.set("mykey", "hello world!")
print(r.get("mykey"))

○関連情報
・Portainerに関する他の記事はこちらを参照してください。