[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
ラベル psycopg2 の投稿を表示しています。 すべての投稿を表示
ラベル psycopg2 の投稿を表示しています。 すべての投稿を表示

2022年3月10日木曜日

Microk8sでpsycopg2とipython-sqlをインストールしたJupyterLabをデプロイする

Microk8sでpsycopg2とipython-sqlをインストールしたJupyterLabをデプロイするには、以下の手順を実行します。データはlocal永続ボリュームに保存します。

実行手順 1. local永続ボリュームで使用するディレクトリの作成
以下のコマンドでlocal永続ボリュームで使用するディレクトリを作成します。
sudo mkdir -p /var/nb_jovyan
sudo mkdir -p /var/start-notebook.d

sudo chown 1000:100 /var/nb_jovyan

cat << EOF | sudo tee /var/start-notebook.d/install_packages.sh
conda install psycopg2 -y
conda install -c conda-forge ipython-sql -y
EOF
sudo chmod +x /var/start-notebook.d/install_packages.sh

2. local永続ボリュームの作成
以下のコマンドでlocal永続ボリュームを作成します。
※jovyan用の永続ボリューム
cat << EOF > local-jovyan-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-jovyan-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/nb_jovyan
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているMicrok8sがインストールされているホスト名になります。適宜変更してください。
microk8s kubectl apply -f ./local-jovyan-pv.yml

※スタートアップスクリプト用の永続ボリューム
cat << EOF > local-startnb-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-startnb-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/start-notebook.d
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - `hostname`
EOF
※`hostname`は今ログオンしているMicrok8sがインストールされているホスト名になります。適宜変更してください。
microk8s kubectl apply -f ./local-startnb-pv.yml

3. 永続ボリューム要求の作成
以下のコマンドで永続ボリューム要求を作成します。
※jovyan用の永続ボリューム
cat << EOF > local-jovyan-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-jovyan-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-jovyan-pv
EOF

microk8s kubectl apply -f ./local-jovyan-pvc.yml

※スタートアップスクリプト用の永続ボリューム要求
cat << EOF > local-startnb-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-startnb-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-startnb-pv
EOF

microk8s kubectl apply -f ./local-startnb-pvc.yml

4. Deploymentの作成
以下のコマンドでjupyterのイメージと作成したlocal永続ボリュームを使用するDeploymentを作成します。
cat << EOF > jupyter-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jupyter-deployment
  labels:
    app: jupyter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jupyter
  template:
    metadata:
      labels:
        app: jupyter
    spec:
      containers:
      - name: jupyter
        image: jupyter/scipy-notebook:latest
        ports:
        - containerPort: 8888
        env:
        - name: JUPYTER_TOKEN
          value: "jupyter"
        - name: DOCKER_STACKS_JUPYTER_CMD
          value: "lab"
        volumeMounts:
        - name: nb-jovyan
          mountPath: /home/jovyan/work
        - name: startnb
          mountPath: /usr/local/bin/start-notebook.d
      volumes:
      - name: nb-jovyan
        persistentVolumeClaim:
          claimName: local-jovyan-pvc
      - name: startnb
        persistentVolumeClaim:
          claimName: local-startnb-pvc
EOF

microk8s kubectl apply -f ./jupyter-deployment.yml

5. サービスの作成
以下のコマンドでサービスを作成します。
cat << EOF > jupyter-service.yml
apiVersion: v1
kind: Service
metadata:
  name: jupyter-service
spec:
  selector:
    app: jupyter
  type: LoadBalancer
  externalIPs:
  - xxx.xxx.xxx.xxx # 外部からアクセスできるMicrok8sをインストールしたホストのIPを設定します。
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8888
EOF

microk8s kubectl apply -f ./jupyter-service.yml

6. 動作確認
ブラウザからhttp://<ホスト名またはIP>:8080/?token=jupyter にアクセスします。
ipython-sqlをインストールしているのでSQLマジックセルでSQLを実行できるか確認します。
以下のusername, password, dbhost, dbnameを書き換えて、PostgreSQLデータベースに接続/実行確認します。
%load_ext sql
dsl = 'postgresql://username:password@dbhost:5432/dbname'
%sql $dsl
%%sql
select * from pg_database;

2022年2月16日水曜日

Minikubeでpsycopg2とipython-sqlをインストールしたJupyterLabをデプロイする

Minikubeでpsycopg2とipython-sqlをインストールしたJupyterLabをデプロイするには、以下の手順を実行します。データはlocal永続ボリュームに保存します。

実行手順 1. local永続ボリュームで使用するディレクトリの作成
以下のコマンドでlocal永続ボリュームで使用するディレクトリを作成します。
minikube ssh

sudo mkdir -p /var/nb_jovyan
sudo mkdir -p /var/start-notebook.d

sudo chown 1000:100 /var/nb_jovyan

cat << EOF | sudo tee /var/start-notebook.d/install_packages.sh
conda install psycopg2
conda install -c conda-forge ipython-sql
EOF
sudo chmod +x /var/start-notebook.d/install_packages.sh

exit

2. local永続ボリュームの作成
以下のコマンドでlocal永続ボリュームを作成します。
※jovyan用の永続ボリューム
cat << EOF > local-jovyan-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-jovyan-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/nb_jovyan
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - minikube
EOF

kubectl apply -f ./local-jovyan-pv.yml

※スタートアップスクリプト用の永続ボリューム
cat << EOF > local-startnb-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-startnb-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /var/start-notebook.d
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - minikube
EOF

kubectl apply -f ./local-startnb-pv.yml

3. 永続ボリューム要求の作成
以下のコマンドで永続ボリューム要求を作成します。
※jovyan用の永続ボリューム
cat << EOF > local-jovyan-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-jovyan-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-jovyan-pv
EOF

kubectl apply -f ./local-jovyan-pvc.yml

※スタートアップスクリプト用の永続ボリューム要求
cat << EOF > local-startnb-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-startnb-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi
  volumeName: local-startnb-pv
EOF

kubectl apply -f ./local-startnb-pvc.yml

4. Deploymentの作成
以下のコマンドでjupyterのイメージと作成したlocal永続ボリュームを使用するDeploymentを作成します。
cat << EOF > jupyter-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jupyter-deployment
  labels:
    app: jupyter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jupyter
  template:
    metadata:
      labels:
        app: jupyter
    spec:
      containers:
      - name: jupyter
        image: jupyter/scipy-notebook:latest
        ports:
        - containerPort: 8888
        env:
        - name: JUPYTER_ENABLE_LAB
          value: "1"
        - name: JUPYTER_TOKEN
          value: "jupyter"
        volumeMounts:
        - name: nb-jovyan
          mountPath: /home/jovyan/work
        - name: startnb
          mountPath: /usr/local/bin/start-notebook.d
      volumes:
      - name: nb-jovyan
        persistentVolumeClaim:
          claimName: local-jovyan-pvc
      - name: startnb
        persistentVolumeClaim:
          claimName: local-startnb-pvc
EOF

kubectl apply -f ./jupyter-deployment.yml

5. サービスの作成
以下のコマンドでサービスを作成します。
cat << EOF > jupyter-service.yml
apiVersion: v1
kind: Service
metadata:
  name: jupyter-service
spec:
  selector:
    app: jupyter
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8888
EOF

kubectl apply -f ./jupyter-service.yml

6. Port-Fowardingで外部からアクセスできるようにする
kubectl port-forward --address 0.0.0.0 service/jupyter-service 8080:8080
ブラウザからhttp://<ホスト名:8080/?token=jupyter にアクセスします

7. 動作確認
ipython-sqlをインストールしているのでSQLマジックセルでSQLを実行できるか確認します。
以下のusername, password, dbhost, dbnameを書き換えて、PostgreSQLデータベースに接続/実行確認します。
%load_ext sql
dsl = 'postgresql://username:password@dbhost:5432/dbname'
%sql $dsl

%%sql
select * from pg_database;


2021年5月11日火曜日

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと音センサモジュールで音量データをPostgreSQLに保存する

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと音センサモジュールで音量データをPostgreSQLに保存するには以下の手順を実行します。

実装手順 1. データ保持用のテーブル作成
PostgreSQL側でデータ保持用のテーブルをあらかじめ作成しておきます。テーブル名称は適宜変更してください。
create table grove_sound_sensor
(
  device_name varchar(30) not null,
  data_ts timestamp not null,
  sound float,
  constraint pk_grove_sound_sensor primary key (device_name, data_ts)
);

2. grove.pyとpsycopg2モジュールをインストール
以下のコマンドでgrove.pyとpsycopg2モジュールをインストールします。
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -

pip3 install psycopg2-binary

3. センサーデータ取得・記録プログラム
以下のプログラムを保存します。

record_grove_sound_sensor.py
import os
import psycopg2
import psycopg2.extras
from grove.grove_sound_sensor import GroveSoundSensor
import time

PIN_A0 = 0
sensor = GroveSoundSensor(PIN_A0)

device_name = 'test device'
sql = """insert into grove_sound_sensor values (%s, current_timestamp, %s)"""

conn = psycopg2.connect(host=os.environ['PG_HOST'], port=os.environ["PG_PORT"], database=os.environ['PG_DB'], user=os.environ['PG_USER'], password=os.environ['PG_PASS'])
with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
  cur.execute(sql , (device_name, sensor.sound))
conn.commit()

4. プログラムの実行
データベースの接続情報を環境変数に設定してrecord_grove_sound_sensor.pyを実行します。
export PG_HOST=データベースホスト名またはIP
export PG_PORT=データベースのポート番号(※通常5432)
export PG_DB=データベース名
export PG_USER=ユーザ名
export PG_PASS=パスワード

python3 record_grove_sound_sensor.py

関連情報 ・Groveデバイスまとめ

Raspberry Pi Zeroと小型ターンテーブルをREST APIで制御する

2021年5月2日日曜日

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと超音波距離センサモジュールで距離をPostgreSQLに保存する

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと超音波距離センサモジュールで距離をPostgreSQLに保存するには以下の手順を実行します。

実装手順 1. データ保持用のテーブル作成
PostgreSQL側でデータ保持用のテーブルをあらかじめ作成しておきます。テーブル名称は適宜変更してください。
create table grove_ultrasonic_ranger
(
  device_name varchar(30) not null,
  data_ts timestamp not null,
  distance float,
  constraint pk_grove_ultrasonic_ranger primary key (device_name, data_ts)
);

2. grove.pyとpsycopg2モジュールをインストール
以下のコマンドでgrove.pyとpsycopg2モジュールをインストールします。
curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s -

pip3 install psycopg2-binary

3. センサーデータ取得・記録プログラム
以下のプログラムを保存します。

record_grove_ultrasonic_ranger.py
import os
import psycopg2
import psycopg2.extras
from grove.factory import Factory
import time

PIN_D5 = 5
sensor = GroveUltrasonicRanger(PIN_D5)

device_name = 'test device'
sql = """insert into grove_ultrasonic_ranger values (%s, current_timestamp, %s)"""

conn = psycopg2.connect(host=os.environ['PG_HOST'], port=os.environ["PG_PORT"], database=os.environ['PG_DB'], user=os.environ['PG_USER'], password=os.environ['PG_PASS'])
with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
  cur.execute(sql , (device_name, sensor.get_distance()))
conn.commit()

4. プログラムの実行
データベースの接続情報を環境変数に設定してrecord_grove_ultrasonic_ranger.pyを実行します。
export PG_HOST=データベースホスト名またはIP
export PG_PORT=データベースのポート番号(※通常5432)
export PG_DB=データベース名
export PG_USER=ユーザ名
export PG_PASS=パスワード

python3 record_grove_ultrasonic_ranger.py

関連情報 ・Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、Grove Base HAT for Raspberry Piと超音波距離センサモジュールで距離データを送受信する

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと超音波距離センサモジュールで距離を返すREST APIを作成する

Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと超音波距離センサモジュールで距離を取得する

Groveデバイスまとめ

Raspberry Pi Zeroと小型ターンテーブルをREST APIで制御する

2021年4月19日月曜日

Raspberry Pi Zeroに接続したDHT11センサーの温度・湿度データをPostgreSQLに保存する

DHT11センサーの温度・湿度データをPostgreSQLに保存するには以下の手順を実行します。

※Raspberry Pi ZeroとDHT11センサーモジュールの接続については、以下を参照してください。
Raspberry Pi ZeroとDHT11センサーモジュールで、温度・湿度を取得する

実装手順 1. データ保持用のテーブル作成
PostgreSQL側でデータ保持用のテーブルをあらかじめ作成しておきます。テーブル名称は適宜変更してください。
create table dht11_sensor
(
  device_name varchar(30) not null,
  data_ts timestamp not null,
  temperature float,
  humidity float,
  constraint pk_dht11_sensor primary key (device_name, data_ts)
);

2. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

3. dht11とpsycopg2モジュールがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、dht11とpsycopg2用の仮想環境を作成します。
sudo apt-get -y install libpq-dev

mkdir -p ~/dht11_pg

cd ~/dht11_pg

pipenv --python 3

pipenv install dht11 psycopg2-binary

pipenv shell

4. センサーデータ取得・記録プログラム
以下のプログラムを保存します。

record_dht11.py
import os
import psycopg2
import psycopg2.extras
import RPi.GPIO as GPIO
import dht11

# initialize...
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)

while True:
  instance = dht11.DHT11(pin=14)
  result = instance.read()
  if result.is_valid():
    print("Temperature: {:.1f}(C)".format(result.temperature))
    print("Humidity: {:.1f}(%)".format(result.humidity))

    device_name = 'test device'
    sql = """insert into dht11_sensor values (%s, current_timestamp, %s, %s)"""

    conn = psycopg2.connect(host=os.environ['PG_HOST'], port=os.environ["PG_PORT"], database=os.environ['PG_DB'], user=os.environ['PG_USER'], password=os.environ['PG_PASS'])
    with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
      cur.execute(sql , (device_name, result.temperature, result.humidity))
    conn.commit()
    break

GPIO.cleanup()

5. プログラムの実行
データベースの接続情報を環境変数に設定してrecord_dht11.pyを実行します。
export PG_HOST=データベースホスト名またはIP
export PG_PORT=データベースのポート番号(※通常5432)
export PG_DB=データベース名
export PG_USER=ユーザ名
export PG_PASS=パスワード

python record_dht11.py

関連情報 ・蓄積したデータを可視化するにはApache Supersetなどを使用することもできます。
Apache Supersetでデータセットを集計して二重軸時系列グラフ(Mixed Time-Series)で表示する

2021年4月11日日曜日

Raspberry Pi Zeroに接続した照度センサーモジュールのデータをPostgreSQLに保存する

照度センサーモジュールで取得した照度データをPostgreSQLに保存するには以下の手順を実行します。
Raspberry Pi ZeroとTSL25721 照度センサーの接続は「Raspberry Pi Zeroと照度センサーモジュールで照度を測る」を参照してください。

実行手順 1. データ保持用のテーブル作成
PostgreSQL側でデータ保持用のテーブルをあらかじめ作成しておきます。テーブル名称は適宜変更してください。
create table lux_sensor
(
  device_name varchar(30) not null,
  data_ts timestamp not null,
  lux float,
  constraint pk_lux_sensor primary key (device_name, data_ts)
);

2. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

3. smbusとpsycopg2モジュールがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、smbusとPostgreSQL用の仮想環境を作成します。
sudo apt-get -y install libpq-dev

mkdir -p ~/smbus_pg

cd ~/smbus_pg

pipenv --python 3

pipenv install psycopg2-binary smbus

pipenv shell

4. センサーデータ取得・記録プログラム
以下のプログラムを保存します。

record_lux.py
import os
import psycopg2
import psycopg2.extras
import smbus
import time

i2c = smbus.SMBus(1)
addr_tsl25721=0x39

FIELD_COMMAND = 0x80 # Write
FIELD_TYPE = 0x20 #  Auto-increment protocol transaction

REG_CONTROL = 0x0F # Control Register
VAL_CONTROL_RESET = 0x00 # Reset Value for Control Register
REG_CONFIG = 0x0D # Config Register
VAL_CONFIG_RESET = 0x00 # Reset Value for Config Register
REG_ATIME = 0x01 # ATIME(ALS time) Register
VAL_ATIME_C64 = 0xC0 # INTEG_CYCLE=64, Time=175ms
REG_ENABLE = 0x00 # Enable Register
VAL_ENABLE_PON = 0x01 # Power ON
VAL_ENABLE_AEN = 0x02 # ALS Enable
VAL_ENABLE = VAL_ENABLE_PON | VAL_ENABLE_AEN

REG_C0DATA = 0x14 # CH0 ADC low data register

# Initialize
# Reset Control Register
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONTROL, VAL_CONTROL_RESET)

# Reset Config Register
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONFIG, VAL_CONFIG_RESET)

# Set ALS time
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ATIME, VAL_ATIME_C64)

# Power on and enable ALS
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ENABLE, VAL_ENABLE)

def read_lux():
  atime = 0xC0 # 192
  gain = 1.0

  dat = i2c.read_i2c_block_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_C0DATA, 4)
  adc0 = (dat[1] << 8) | dat[0]
  adc1 = (dat[3] << 8) | dat[2]

  cpl = (2.73 * (256 - atime) * gain)/(60.0)
  lux1 = ((adc0 * 1.00) - (adc1 * 1.87)) / cpl
  lux2 = ((adc0 * 0.63) - (adc1 * 1.00)) / cpl
  lux = 0
  if ((lux1 <= 0) and (lux2 <= 0)) :
    lux = 0
  if (lux1 > lux2) :
    lux = lux1
  elif (lux1 < lux2) :
    lux = lux2
  return lux


while True:
  lux= read_lux()
  print("lux:{:.1f}".format(lux))
  device_name = 'tsl25721'
  sql = """insert into lux_sensor values (%s, current_timestamp, %s)"""
  conn = psycopg2.connect(host=os.environ['PG_HOST'], port=os.environ["PG_PORT"], database=os.environ['PG_DB'], user=os.environ['PG_USER'], password=os.environ['PG_PASS'])
  with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
    cur.execute(sql , (device_name, lux))
  conn.commit()
  time.sleep(1)

5. プログラムの実行
データベースの接続情報を環境変数に設定してrecord_lux.pyを実行します。
export PG_HOST=データベースホスト名またはIP
export PG_PORT=データベースのポート番号(※通常5432)
export PG_DB=データベース名
export PG_USER=ユーザ名
export PG_PASS=パスワード

python3 record_lux.py

2020年7月22日水曜日

Jupyterにipython-sqlをインストールしてSQLマジックセル内のクエリを実行する

ipython-sqlをインストールしてSQLマジックセル内のクエリを実行します。

〇実行例のスクリーンショット

〇実行例
以下のセルで、接続先のPostgreSQLホスト・ユーザ・パスワード・データベースを指定します。
%load_ext sql
dsl = 'postgres://username:password@dbhost:5432/dbname'
%sql $dsl

マジックセルに実行したいSQLクエリを記入します。
%%sql
select * from pg_database;

〇インストール方法
1. Debian系やRaspbianでは以下のコマンドで依存ライブラリをインストールしておきます。
sudo apt-get -y install libpq-dev python-dev

2. その後、pipenvの場合は以下のコマンドを実行します。
pipenv install psycopg2

pipenv install ipython-sql

関連情報 ・Raspberry Pi(Raspbian Buster)にJupyter Labをインストールする

2019年6月28日金曜日

DockerでPostgreSQLにクエリーを実行した結果をslackに通知するコンテナ(Alpine3.9ベース)を作成する

python3.7にslackclientとpandasとpsycopg2をインストールしたコンテナを作成し、PostgreSQLにクエリーを発行した結果が1行以上あればslackに通知するコンテナは以下の手順で作成します。
データベースのデータ監視などに利用する事ができます。

1.イメージの作成
docker build -t slack-pandas-pg:1.0 .

Dockerfile
FROM python:3.7-alpine3.9
RUN apk --no-cache add libstdc++ \
    postgresql-dev \
  && apk --no-cache --virtual pydeps add gcc \
    g++ \
    python3-dev \
    musl-dev \
    cython \
    libffi-dev \
  && pip install pandas \
  && pip install psycopg2 \
  && pip install slackclient \
  && apk del --purge pydeps
CMD ["/bin/sh"]

2. コンテナの実行
下記queryresult.pyの他にクエリーを保持したquery.txtと通知時のメッセージヘッダーを保持したheader.txtを同じフォルダに用意します。
Botsの登録などはあらかじめ行い、TOKENを控えてください。

queryresult.py
import os
import pandas as pd
import psycopg2
import slack

query = ""
with open(os.environ['QUERY']) as fquery:
  query = fquery.read()

header = ""
with open(os.environ['HEADER']) as fheader:
  header = fheader.read()

conn = psycopg2.connect(host=os.environ['PG_HOST'], port=os.environ["PG_PORT"], database=os.environ['PG_DB'], user=os.environ['PG_USER'], password=os.environ['PG_PASS'])
result = pd.read_sql(sql=query, con=conn)
if len(result) > 0:
  client = slack.WebClient(token=os.environ['SLACK_TOKEN'])
  response = client.chat_postMessage(
    channel=os.environ['SLACK_CHANNEL'],
    username=os.environ['SLACK_USER'], icon_emoji=os.environ['SLACK_ICON'],
    text=header + result.to_string())

PostgreSQLへの接続情報やslackの情報は下図のように環境変数で渡します。
docker run -e PG_HOST='dbhost' \
  -e PG_PORT='5432' \
  -e PG_DB='dbname' \
  -e PG_USER='postgres' \
  -e PG_PASS='pass' \
  -e SLACK_TOKEN='<slack token>' \
  -e SLACK_CHANNEL='#general' \
  -e SLACK_USER='mybot' \
  -e SLACK_ICON=':cat:' \
  -e QUERY='/tmp/query.txt'
  -e HEADER='/tmp/header.txt'
  -v `pwd`:/tmp  -it slack-pandas-pg:1.0 /usr/local/bin/python3 /tmp/queryresult.py

2019年5月19日日曜日

Dockerでpython3.7とYahoo! Finance Fix for Pandas Datareader、pandas、psycopg2がインストールされたコンテナを作成する

以下のコマンドとDockerfileを使用してYahoo! Finance Fix for Pandas Datareaderとpandas、psycopg2がインストールされたイメージを作成する事ができます。
docker build -t pandas-pg-yf:1.0 .

Dockerfile
FROM python:3.7-alpine3.9
RUN apk --no-cache add libstdc++ \
    postgresql-dev \
  && apk --no-cache --virtual pydeps add gcc \
    g++ \
    python3-dev \
    musl-dev \
    cython \
  && pip install pandas \
  && pip install psycopg2 \
  && pip install fix_yahoo_finance --upgrade --no-cache-dir \
  && pip install SQLAlchemy \
  && apk del --purge pydeps
CMD ["/bin/sh"]

コンテナを作成した後、以下のコマンドとサンプルコードでダウ平均の取得とPostgreSQLに接続確認を行うことができます。
docker run -v `pwd`/test.py:/tmp/test.py --rm -it pandas-pg-yf:1.0 /usr/local/bin/python3 /tmp/test.py

test.py
import pandas as pd
import psycopg2
import fix_yahoo_finance as yf

df = yf.download("^DJI")
print(df)

conn = psycopg2.connect(host='dbserver', port=5432, database='testdb', user='postgres', password='postgres')
result = pd.read_sql(sql="select current_user, version() as ver;", con=conn)
print(result)


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

2019年5月13日月曜日

DockerでJupyter LabとYahoo! Finance Fix for Pandas Datareader、ipython-sql、PostgreSQL11がインストールされたコンテナを作成する

Jupyter LabとYahoo! Finance Fix for Pandas Datareader、ipython-sql、PostgreSQLでPythonとSQLが使用できる環境を提供する事ができます。

〇Jupyter Labの実行画面


〇構築方法
1. イメージの作成
docker build -t jupyter-pg-yf .

Dockerfile
FROM jupyter/scipy-notebook
ENV TZ=Asia/Tokyo
USER root
RUN apt-get update \
  && apt-get -y install libpq-dev python-dev \
  && pip install psycopg2-binary \
  && pip install ipython-sql \
  && pip install mpl_finance \
  && pip install fix_yahoo_finance --upgrade --no-cache-dir \
  && apt-get clean
USER $NB_UID

2. Jupyter NotebookとPostgreSQLコンテナの構築・実行(docker-compose.ymlがあるフォルダで実行)
docker-compose up -d

docker-compose.yml
version: "2"
services:
  jupyter-pg-iexfinance:
    image: jupyter-pg-yf
    container_name: "jupyter-pg-yf"
    volumes:
      - "jupyter-data:/home/jovyan/work"
    ports:
      - "8888:8888"
    environment:
      JUPYTER_TOKEN: jupyter
      JUPYTER_ENABLE_LAB: 1
    depends_on:
      - db
  db:
    image: postgres:11-alpine
    container_name: "test-db"
    ports:
      - "5432:5432"
    volumes:
      - "db-data:/var/lib/postgresql/data"
    environment:
        POSTGRES_DB: test
        POSTGRES_PASSWORD: test
volumes:
  db-data:
    driver: local
  jupyter-data:
    driver: local

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

〇動作検証用コード
%load_ext sql
dsl = 'postgres://postgres:test@db:5432/test'
%sql $dsl

%%sql
select * from pg_database;


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

2019年5月9日木曜日

DockerでJupyter Lab、iexfinanceとipython-sql、PostgreSQL11がインストールされたコンテナを作成する

Jupyter Labとiexfinanceとipython-sql、PostgreSQLでPythonとSQLが使用できる環境を提供する事ができます。

〇Jupyter Labの実行画面


〇構築方法
1. イメージの作成
docker build -t jupyter-pg-iexfinance .

Dockerfile
FROM jupyter/scipy-notebook
ENV TZ=Asia/Tokyo
USER root
RUN apt-get update \
  && apt-get -y install libpq-dev python-dev \
  && pip install psycopg2-binary \
  && pip install ipython-sql \
  && pip install mpl_finance \
  && pip install iexfinance \
  && apt-get clean
USER $NB_UID

2. Jupyter NotebookとPostgreSQLコンテナの構築・実行(docker-compose.ymlがあるフォルダで実行)
docker-compose up -d

docker-compose.yml
version: "2"
services:
  jupyter-pg-iexfinance:
    image: jupyter-pg-iexfinance
    container_name: "jupyter-pg-iexfinance"
    volumes:
      - "jupyter-data:/home/jovyan/work"
    ports:
      - "8888:8888"
    environment:
      JUPYTER_TOKEN: jupyter
      JUPYTER_ENABLE_LAB: 1
    depends_on:
      - db
  db:
    image: postgres:11-alpine
    container_name: "test-db"
    ports:
      - "5432:5432"
    volumes:
      - "db-data:/var/lib/postgresql/data"
    environment:
        POSTGRES_DB: test
        POSTGRES_PASSWORD: test
volumes:
  db-data:
    driver: local
  jupyter-data:
    driver: local

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

〇動作検証用コード
jupyterとiexfinance0.4.0で米国株価データを取得して、ローソク足グラフを描画する

%load_ext sql
dsl = 'postgres://postgres:test@db:5432/test'
%sql $dsl

%%sql
select * from pg_database;


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

2019年5月6日月曜日

Dockerでpython3.7とpandasとpsycopg2がインストールされたコンテナを作成する

以下のコマンドとDockerfileを使用してpandasとpsycopg2がインストールされたイメージを作成する事ができます。
docker build -t pandas-pg:1.0 .

Dockerfile

FROM python:3.7-alpine3.9
RUN apk --no-cache add libstdc++ \
    postgresql-dev \
  && apk --no-cache --virtual pydeps add gcc \
    g++ \
    python3-dev \
    musl-dev \
    cython \
  && pip install pandas \
  && pip install psycopg2 \
  && apk del --purge pydeps
CMD ["/bin/sh"]

イメージを作成した後、以下のコマンドとサンプルコードでPostgreSQLに接続確認を行うことができます。
docker run -v `pwd`/test.py:/tmp/test.py  -it pandas-pg:1.0

test.py
import pandas as pd
import psycopg2

conn = psycopg2.connect(host='dbserver', port=5432, database='testdb', user='postgres', password='postgres')
result = pd.read_sql(sql="select current_user, version() as ver;", con=conn)
print(result)

コンテナ内でサンプルコード実行
python3 /tmp/test.py


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

2019年4月11日木曜日

DockerでJupyter Lab、ipython-sqlとPostgreSQL11がインストールされたコンテナを作成する

Jupyter Labとipython-sql、PostgreSQLでPythonとSQLが使用できる環境を提供する事ができます。

1. イメージの作成
docker build -t jupyter-pg .

Dockerfile
FROM jupyter/scipy-notebook
ENV TZ=Asia/Tokyo
USER root
RUN apt-get update \
  && apt-get -y install libpq-dev python-dev \
  && pip install psycopg2-binary \
  && pip install ipython-sql \
  && apt-get clean
USER $NB_UID

2. Jupyter NotebookとPostgreSQLコンテナの構築・実行(docker-compose.ymlがあるフォルダで実行)
docker-compose up -d

docker-compose.yml
version: "2"
services:
  jupyter-pg:
    image: jupyter-pg
    container_name: "jupyter-pg"
    volumes:
      - "jupyter-data:/home/jovyan/work"
    ports:
      - "8888:8888"
    environment:
      JUPYTER_TOKEN: jupyter
      JUPYTER_ENABLE_LAB: 1
    depends_on:
      - db
  db:
    image: postgres:11-alpine
    container_name: "test-db"
    ports:
      - "5432:5432"
    volumes:
      - "db-data:/var/lib/postgresql/data"
    environment:
        POSTGRES_DB: test
        POSTGRES_PASSWORD: test
volumes:
  db-data:
    driver: local
  jupyter-data:
    driver: local

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

〇動作検証用コード
%load_ext sql
dsl = 'postgres://postgres:test@db:5432/test'
%sql $dsl

%%sql
select * from pg_database;

〇Jupyter Labの実行画面


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

2019年3月25日月曜日

VagrantでJupyter LabとPostgreSQL11をインストールした仮想マシン(Ubuntu18.04)を構築する

Jupyter Labでインタラクティブなコンピューティング環境を提供する事ができます。

〇Jupyter Labの画面


構築方法 以下のVagrantfileで、Jupyter LabとPostgreSQL11 をインストールした仮想マシン(Ubuntu18.04)を構築できます。

Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "bento/ubuntu-18.04"
  config.vm.hostname = "ub1804jupyterpg11"
  config.vm.provider :virtualbox do |vbox|
     vbox.name = "ub1804jupyterpg11"
     vbox.cpus = 2
     vbox.memory = 2048
     vbox.customize ["modifyvm", :id, "--nicpromisc2","allow-all"]
  end
config.vm.network "private_network", ip: "192.168.55.106", :netmask => "255.255.255.0"
config.vm.network "public_network", ip:"192.168.1.106", :netmask => "255.255.255.0"
  config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get -y install language-pack-ja
sed -i.bak -e "s#http://archive.ubuntu.com/ubuntu/#http://ftp.riken.jp/pub/Linux/ubuntu/#g" /etc/apt/sources.list
localectl set-locale LANG=ja_JP.UTF-8
localectl set-keymap jp106
timedatectl set-timezone Asia/Tokyo

# install postgresql
echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list
apt-get -y install wget ca-certificates
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
apt-get update
apt-get upgrade
apt-get -y install postgresql-11

echo "listen_addresses='*'" >> /etc/postgresql/11/main/postgresql.conf

#sed -i 's/host.*all.*all.*127.0.0.1/#host    all             all             127.0.0.1/g' /etc/postgresql/11/main/pg_hba.conf

echo "host    all         all         127.0.0.1/32          password" >> /etc/postgresql/11/main/pg_hba.conf
echo "host    all         all         192.168.1.0/24          password" >> /etc/postgresql/11/main/pg_hba.conf
echo "host    all         all         192.168.55.0/24          password" >> /etc/postgresql/11/main/pg_hba.conf

systemctl restart postgresql.service
su - postgres << EOF
createdb -T template0 --locale=ja_JP.UTF-8 --encoding=UTF8 test
psql -c "
alter user postgres with password 'postgres';
create user test with password 'test';
grant all privileges on database test to test;
"
EOF
export PGPASSWORD=test
psql -h localhost -d test -U test -c "
create table messages (message_id integer not null, message varchar(100));
insert into messages values (1, 'hello world.');
insert into messages values (2, 'test message.');
"
EOF
echo "postgres:postgres" | chpasswd
systemctl restart postgresql.service

# install anaconda
wget https://repo.anaconda.com/archive/Anaconda3-2018.12-Linux-x86_64.sh
chmod +x Anaconda3-2018.12-Linux-x86_64.sh
./Anaconda3-2018.12-Linux-x86_64.sh -b -p /opt/anaconda
source /opt/anaconda/bin/activate
pip install --upgrade pip
pip install jupyterlab
pip install pygal

# install psycopg2
apt-get -y install libpq-dev python-dev
pip install psycopg2-binary

useradd py
mkdir -p /home/py
chown -R py:py /home/py
sudo -u py bash -c "mkdir /home/py/.jupyter"
sudo -u py bash -c "cat << EOF > /home/py/.jupyter/jupyter_notebook_config.py
c.JupyterApp.allow_remote_access = True
c.JupyterApp.ip = '0.0.0.0'
c.JupyterApp.open_browser = False
c.JupyterApp.port = 8080
c.JupyterApp.token = 'jupyter'
EOF"
cat << EOF > /etc/systemd/system/jupyter.service
[Unit]
Description=Jupyter notebook
[Service]
Type=simple
EnvironmentFile=/opt/anaconda/bin/activate
ExecStart=/opt/anaconda/bin/jupyter lab
User=py
Group=py
WorkingDirectory=/home/py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable jupyter
sudo systemctl start jupyter

echo 'access -> http://192.168.55.106:8080/?token=jupyter'
SHELL
end

〇動作検証用コード
import psycopg2

con = psycopg2.connect("dbname=test host=localhost user=test password=test")

try:
  cur= con.cursor()
  sql = "select message_id, message from messages"
  cur.execute(sql)

  for row in cur.fetchall():
    print(row)

except psycopg2.Error as er:
    print('psycopg2.Error:', er)
cur.close
con.close

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

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

2019年3月21日木曜日

VagrantでJupyter LabとPostgreSQL11をインストールした仮想マシン(Debian Stretch/9.6)を構築する

Jupyter Labでインタラクティブなコンピューティング環境を提供する事ができます。

〇Jupyter Labの画面


構築方法 以下のVagrantfileで、Jupyter LabとPostgreSQL11 をインストールした仮想マシン(Debian Stretch/9.6)を構築できます。

Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "bento/debian-9.6"
  config.vm.hostname = "db96jupyterpg11"
config.vm.network "public_network", ip:"192.168.1.107", :netmask => "255.255.255.0"
config.vm.network "private_network", ip: "192.168.55.107", :netmask => "255.255.255.0"
  config.vm.provider :virtualbox do |vbox|
     vbox.name = "db96jupyterpg11"
     vbox.gui = true
     vbox.cpus = 2
     vbox.memory = 2048
  end
  config.vm.provision "shell", inline: <<-SHELL
apt-get update
export DEBIAN_FRONTEND=noninteractive
apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade
apt-get -y install task-japanese gawk
sed -i -e 's/# ja_JP.UTF-8 UTF-8/ja_JP.UTF-8 UTF-8/' /etc/locale.gen
locale-gen
update-locale LANG=ja_JP.UTF-8
localectl set-locale LANG=ja_JP.UTF-8
localectl set-keymap jp106
timedatectl set-timezone Asia/Tokyo


# install postgresql
echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list
apt-get -y install wget ca-certificates
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
apt-get update
apt-get upgrade
apt-get -y install postgresql-11

echo "listen_addresses='*'" >> /etc/postgresql/11/main/postgresql.conf

echo "host    all         all         127.0.0.1/32          password" >> /etc/postgresql/11/main/pg_hba.conf
echo "host    all         all         192.168.1.0/24          password" >> /etc/postgresql/11/main/pg_hba.conf
echo "host    all         all         192.168.55.0/24          password" >> /etc/postgresql/11/main/pg_hba.conf

systemctl restart postgresql.service
su - postgres << EOF
createdb -T template0 --locale=ja_JP.UTF-8 --encoding=UTF8 test
psql -c "
alter user postgres with password 'postgres';
create user test with password 'test';
grant all privileges on database test to test;
"
EOF
export PGPASSWORD=test
psql -h localhost -d test -U test -c "
create table messages (message_id integer not null, message varchar(100));
insert into messages values (1, 'hello world.');
insert into messages values (2, 'test message.');
"
EOF
echo "postgres:postgres" | chpasswd
systemctl restart postgresql.service

# install anaconda
wget https://repo.anaconda.com/archive/Anaconda3-2018.12-Linux-x86_64.sh
chmod +x Anaconda3-2018.12-Linux-x86_64.sh
./Anaconda3-2018.12-Linux-x86_64.sh -b -p /opt/anaconda
source /opt/anaconda/bin/activate
pip install --upgrade pip
pip install jupyterlab

# install psycopg2
apt-get -y install libpq-dev python-dev
pip install psycopg2-binary

useradd py
mkdir -p /home/py
chown -R py:py /home/py
sudo -u py bash -c "mkdir /home/py/.jupyter"
sudo -u py bash -c "cat << EOF > /home/py/.jupyter/jupyter_notebook_config.py
c.JupyterApp.allow_remote_access = True
c.JupyterApp.ip = '0.0.0.0'
c.JupyterApp.open_browser = False
c.JupyterApp.port = 8080
c.JupyterApp.token = 'jupyter'
EOF"
cat << EOF > /etc/systemd/system/jupyter.service
[Unit]
Description=Jupyter notebook
[Service]
Type=simple
EnvironmentFile=/opt/anaconda/bin/activate
ExecStart=/opt/anaconda/bin/jupyter lab
User=py
Group=py
WorkingDirectory=/home/py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable jupyter
sudo systemctl start jupyter

echo 'access -> http://192.168.55.107:8080/?token=jupyter'
SHELL
end

〇動作検証用コード
import psycopg2

con = psycopg2.connect("dbname=test host=localhost user=test password=test")

try:
  cur= con.cursor()
  sql = "select message_id, message from messages"
  cur.execute(sql)

  for row in cur.fetchall():
    print(row)

except psycopg2.Error as er:
    print('psycopg2.Error:', er)
cur.close
con.close

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

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

2018年10月2日火曜日

DockerでJupyter Notebook、folium、requests、postgresqlがインストールされたコンテナのイメージを作成する

Jupyter Notebookと地図を描画できるパッケージfolium、HTTPリクエストを簡素化するrequests、postgresqlにアクセスするpsycopg2とPostgreSQLがインストールされたコンテナのイメージを作成するには、以下の手順を実行します。

〇foliumで描画した地図


○構築方法
以下の手順で、Jupyter Notebookとfolium, requests, psycopg2のコンテナを構築・実行します。
1. folium, requests, psycopg2を追加したJupyter Notebookイメージの作成(Dockerfileがあるフォルダで実行)
docker build -t scipy-notebook-requests-folium-pg .

Dockerfile
FROM jupyter/scipy-notebook
ENV TZ=Asia/Tokyo
USER root
RUN apt-get update \
  && apt-get -y install libpq-dev python-dev \
  && pip install psycopg2-binary \
  && pip install requests \
  && pip install folium \
  && apt-get clean
USER $NB_UID

2. Jupyter Notebookの構築・実行(docker-compose.ymlがあるフォルダで実行)
docker-compose up -d

docker-compose.yml
version: "2"
services:
  scipy-notebook:
    image: scipy-notebook-requests-folium-pg
    container_name: "scipy-notebook-requests-folium-pg"
    volumes:
      - "scipy-notebook-data:/home/jovyan/work"
    ports:
      - "8888:8888"
    environment:
      JUPYTER_TOKEN: jupyter
      JUPYTER_ENABLE_LAB: 1
    depends_on:
      - db
  db:
    image: postgres:10.5-alpine
    container_name: "test-db"
    ports:
      - "5432:5432"
    volumes:
      - "db-data:/var/lib/postgresql/data"
    environment:
        POSTGRES_DB: test
        POSTGRES_PASSWORD: test
volumes:
  db-data:
    driver: local
  scipy-notebook-data:
    driver: local

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

〇動作確認用コード
import folium

fm = folium.Map(location=[35.856999, 139.648849], zoom_start=10)

folium.Marker(location=[35.861729,139.645482], popup='さいたま市').add_to(fm)
folium.Marker(location=[35.975198, 139.752301], popup='春日部市').add_to(fm)
    
fm


○関連情報
・requestsパッケージに関する他の記事はこちらを参照してください。

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

2018年9月19日水曜日

AnsibleでApache NiFiとPostgreSQL10をインストールする(Ubuntu18.04用)

Apache Nifiは様々なデータを処理・分配するためのソフトウェアです。

〇Apache NiFiの画面


〇インストール方法
1.下準備
~/.ansible.cfgに以下の内容を設定します
[ssh_connection]
pipelining=True
[defaults]
host_key_checking = False

2. インストール対象ホストのユーザやパスワードを環境に合わせてinventoryファイルに記入します

inventory例
[nifi-pg]
192.168.55.61

[all:vars]
ansible_ssh_port=22
ansible_ssh_user=vagrant
ansible_ssh_pass=vagrant
ansible_sudo_pass=vagrant

3.inventory、kanboard.ymlを準備し、以下のコマンドを実行します。
ansible-playbook -i inventory nifi-pg.yml

nifi-pg.yml
- hosts: nifi-pg
  vars:
    - dbname: test
    - dbuser: test
    - dbpassword: test
  tasks:
    - name: configure sources.list
      blockinfile:
        dest: /etc/apt/sources.list.d/pgdg.list
        create: yes
        block: |
          deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main
      become: true
    - name: add an apt key
      apt_key:
        url: https://www.postgresql.org/media/keys/ACCC4CF8.asc
        state: present
      become: yes
    - name: install packages
      apt:
        name: ca-certificates
        state: latest
      become: yes
    - name: Install required software
      apt: name={{ item }} state=latest
      with_items:
        - postgresql-10
        - libpq-dev
        - python-dev
        - python-pip
      become: true
    - name: install psycopg2 using pip
      pip:
        name: "{{ item }}"
        state: forcereinstall
      with_items:
        - psycopg2-binary
      become: true
    - name: configure postgresql.conf
      blockinfile:
        dest: /etc/postgresql/10/main/postgresql.conf
        create: yes
        block: |
          listen_addresses='*'
      become: true
    - name: edit pg_hba.conf
      replace: dest=/etc/postgresql/10/main/pg_hba.conf regexp="host.*all.*all.*127.0.0.1" replace="#host    all             all             127.0.0.1"
      become: true
    - name: edit pg_hba.conf
      replace: dest=/etc/postgresql/10/main/pg_hba.conf regexp="^host.*all.*all.*::1/128.*ident" replace="host    all             all             ::1/128    password"
      become: true
    - name: configure postgresql.conf
      blockinfile:
        dest: /etc/postgresql/10/main/pg_hba.conf
        create: yes
        block: |
          host    all         all         127.0.0.1/32          password
          host    all         all         192.168.1.0/24          password
          host    all         all         192.168.55.0/24          password
      become: true
    - name: enable and start postgresq.service
      systemd:
        daemon_reload: yes
        enabled: yes
        state: started
        name: postgresql.service
      become: true
    - name: create PostgreSQL user
      postgresql_user:
        name: "{{ dbuser }}"
        password: "{{ dbpassword }}"
        login_user: postgres
        encrypted: yes
      become: true
      become_user: postgres
    - name: create a database
      postgresql_db:
        name: "{{ dbname }}"
        owner: "{{ dbuser }}"
        encoding: 'UTF-8'
        lc_collate: 'ja_JP.UTF-8'
        lc_ctype: 'ja_JP.UTF-8'
        template: 'template0'
        login_user: postgres
      become: true
      become_user: postgres
    - name: download jdbc driver
      get_url:
        url: https://jdbc.postgresql.org/download/postgresql-42.2.4.jar
        dest: /usr/share/java
      become: true
    - name: configure limits.conf
      blockinfile:
        dest: /etc/security/limits.conf
        create: yes
        block: |
          *  hard  nofile  50000
          *  soft  nofile  50000
          *  hard  nproc  10000
          *  soft  nproc  10000
      become: true
    - name: Install openjdk
      apt: name={{ item }} state=present
      with_items:
        - openjdk-8-jdk
      become: true
    - name: download nifi
      get_url:
        url: http://ftp.riken.jp/net/apache/nifi/1.7.1/nifi-1.7.1-bin.tar.gz
        dest: /opt
      become: true
    - name: extract nifi
      unarchive:
        remote_src: yes
        src: /opt/nifi-1.7.1-bin.tar.gz
        dest: /opt/
      become: true
    - name: setup systemd
      blockinfile:
        dest: /etc/systemd/system/nifi.service
        create: yes
        block: |
          [Unit]
          Description=Apache Nifi
          After=syslog.target network.target
          [Service]
          Type=forking
          ExecStart=/opt/nifi-1.7.1/bin/nifi.sh start
          ExecStop=/opt/nifi-1.7.1/bin/nifi.sh stop
          KillMode=none
          [Install]
          WantedBy=multi-user.target
      become: true
    - name: clean up
      file:
        state: absent
        path: /opt/nifi-1.7.1-bin.tar.gz
      become: yes
    - name: enable and start nifi.service
      systemd:
        daemon_reload: yes
        enabled: yes
        state: started
        name: nifi.service
      become: true

4.DBCPConnectionPoolで、以下のようにパラメータを設定してローカルのPostgreSQLにアクセスします。
Database Connection -> URL jdbc:postgresql://localhost:5432/test
Database Driver Class Name -> org.postgresql.Driver
Database Driver Location(s) -> /usr/share/java/postgresql-42.2.4.jar
Database User -> test
Password -> test


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

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

その他のAnsibleの記事

2018年9月14日金曜日

AnsibleでApache NiFiとPostgreSQL10をインストールする(CentOS7.5用)

Apache Nifiは様々なデータを処理・分配するためのソフトウェアです。

〇Apache NiFiの画面


〇インストール方法
1.下準備
~/.ansible.cfgに以下の内容を設定します
[ssh_connection]
pipelining=True
[defaults]
host_key_checking = False

v 2. インストール対象ホストのユーザやパスワードを環境に合わせてinventoryファイルに記入します

inventory例
[nifi-postgresql]
192.168.1.107

[all:vars]
ansible_ssh_port=22
ansible_ssh_user=vagrant
ansible_ssh_pass=vagrant
ansible_sudo_pass=vagrant

3.inventory、kanboard.ymlを準備し、以下のコマンドを実行します。
ansible-playbook -i inventory nifi-postgresql.yml

nifi-postgresql.yml
- hosts: nifi-postgresql
  vars:
    - dbname: test
    - dbuser: test
    - dbpassword: test
  tasks:
    - name: install epel-release
      yum:
        name: epel-release
        state: present
      become: yes
    - name: download postgresql repos
      get_url:
        url: https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
        dest: /tmp
      become: true
    - name: install repos
      yum: state=present name=/tmp/pgdg-centos10-10-2.noarch.rpm
      become: true
    - name: install PostgreSQL
      yum: name={{ item }} state=latest enablerepo=epel
      with_items:
        - postgresql10-server
        - postgresql10-devel
        - postgresql10-contrib
        - python-devel
        - python36-devel
        - python-pip
      become: true
    - name: install psycopg2 using pip
      pip:
        name: "{{ item }}"
        state: forcereinstall
      with_items:
        - psycopg2-binary
      become: true
    - name: initdb
      shell: /usr/pgsql-10/bin/postgresql-10-setup initdb
      become: yes
    - name: configure postgresql.conf
      blockinfile:
        dest: /var/lib/pgsql/10/data/postgresql.conf
        create: yes
        block: |
          listen_addresses='*'
      become: true
    - name: edit pg_hba.conf
      replace: dest=/var/lib/pgsql/10/data/pg_hba.conf regexp="host.*all.*all.*127.0.0.1" replace="#host    all             all             127.0.0.1"
      become: true
    - name: edit pg_hba.conf
      replace: dest=/var/lib/pgsql/10/data/pg_hba.conf regexp="^host.*all.*all.*::1/128.*ident" replace="host    all             all             ::1/128    password"
      become: true
    - name: configure postgresql.conf
      blockinfile:
        dest: /var/lib/pgsql/10/data/pg_hba.conf
        create: yes
        block: |
          host    all         all         127.0.0.1/32          password
          host    all         all         192.168.1.0/24          password
          host    all         all         192.168.55.0/24          password
      become: true
    - name: enable and start postgresql-10.service
      systemd:
        daemon_reload: yes
        enabled: yes
        state: started
        name: postgresql-10.service
      become: true
    - name: create PostgreSQL user
      postgresql_user:
        name: "{{ dbuser }}"
        password: "{{ dbpassword }}"
        login_user: postgres
        encrypted: yes
      become: true
      become_user: postgres
    - name: create a database
      postgresql_db:
        name: "{{ dbname }}"
        owner: "{{ dbuser }}"
        encoding: 'UTF-8'
        lc_collate: 'ja_JP.UTF-8'
        lc_ctype: 'ja_JP.UTF-8'
        template: 'template0'
        login_user: postgres
      become: true
      become_user: postgres
    - name: configure limits.conf
      blockinfile:
        dest: /etc/security/limits.conf
        create: yes
        block: |
          *  hard  nofile  50000
          *  soft  nofile  50000
          *  hard  nproc  10000
          *  soft  nproc  10000
      become: true
    - name: Install openjdk
      yum: name={{ item }} state=present
      with_items:
        - java-1.8.0-openjdk
      become: true
    - name: download connectorJ
      get_url:
        url: https://jdbc.postgresql.org/download/postgresql-42.2.4.jar
        dest: /usr/share/java
      become: true
    - name: download nifi
      get_url:
        url: http://ftp.riken.jp/net/apache/nifi/1.7.1/nifi-1.7.1-bin.tar.gz
        dest: /opt
      become: true
    - name: extract nifi
      unarchive:
        remote_src: yes
        src: /opt/nifi-1.7.1-bin.tar.gz
        dest: /opt/
      become: true
    - name: setup systemd
      blockinfile:
        dest: /etc/systemd/system/nifi.service
        create: yes
        block: |
          [Unit]
          Description=Apache Nifi
          After=syslog.target network.target
          [Service]
          Type=forking
          ExecStart=/opt/nifi-1.7.1/bin/nifi.sh start
          ExecStop=/opt/nifi-1.7.1/bin/nifi.sh stop
          KillMode=none
          [Install]
          WantedBy=multi-user.target
      become: true
    - name: setup systemd
      blockinfile:
        dest: /opt/nifi-1.7.1/bin/nifi-env.sh
        create: yes
        block: |
          
          JAVA_HOME=/usr/lib/jvm/jre-1.8.0
      become: true
    - name: clean up
      file:
        state: absent
        path: /opt/nifi-1.7.1-bin.tar.gz
      become: yes
    - name: enable and start nifi.service
      systemd:
        daemon_reload: yes
        enabled: yes
        state: started
        name: nifi.service
      become: true

4.DBCPConnectionPoolで、以下のようにパラメータを設定してローカルのPostgreSQLにアクセスします。
Database Connection -> URL jdbc:postgresql://localhost:5432/test
Database Driver Class Name -> org.postgresql.Driver
Database Driver Location(s) -> /usr/share/java/postgresql-42.2.4.jar
Database User -> test
Password -> test


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

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

その他のAnsibleの記事

2018年9月11日火曜日

DockerでMezzanine、PostgreSQL10.4がインストールされたコンテナ(Alpine3.8)を構築する

MezzanineはPython製のCMSです。

○Mezzanineの画面


○構築方法
以下の手順で、Mezzanineのコンテナを構築・実行します。

1. Mezzanineイメージの作成(Dockerfileがあるフォルダで実行)
docker build -t mezzanine-pg .

Dockerfile
FROM python:3.6-alpine3.8

RUN mkdir -p /opt/mezzanine
WORKDIR /opt/mezzanine
RUN apk update \
  && apk add --no-cache --virtual=build-deps jpeg jpeg-dev zlib-dev musl-dev gcc build-base python3-dev postgresql-dev\
  && pip install mezzanine psycopg2 \
  && apk del build-base build-deps gcc \
  && apk add --no-cache postgresql-client \
  && rm -rf /var/cache/apk/* \
  && mezzanine-project mysite \
  && echo $'#!/bin/sh \n\
export PGPASSWORD=mezzanine \n\
until psql -h db -U postgres -d mezzanine -c "\l" \n\
do \n\
  echo -n "." \n\
  sleep 1 \n\
done \n\
cd /opt/mezzanine/mysite \n\
sed -i -e \'s/"ENGINE": "django.db.backends.sqlite3",/"ENGINE": "django.db.backends.postgresql_psycopg2",/\' /opt/mezzanine/mysite/mysite/local_settings.py \n\
sed -i -e \'s/"NAME": "dev.db",/"NAME": "mezzanine",/\' /opt/mezzanine/mysite/mysite/local_settings.py \n\
sed -i -e \'s/"USER": "",/"USER": "postgres",/\' /opt/mezzanine/mysite/mysite/local_settings.py \n\
sed -i -e \'s/"PASSWORD": "",/"PASSWORD": "mezzanine",/\' /opt/mezzanine/mysite/mysite/local_settings.py \n\
sed -i -e \'s/"HOST": "",/"HOST": "db",/\' /opt/mezzanine/mysite/mysite/local_settings.py \n\
sed -i -e \'s/"PORT": "",/"PORT": "5432",/\' /opt/mezzanine/mysite/mysite/local_settings.py \n\
sed -i -e \'s/ALLOWED_HOSTS = \[.*\]/ALLOWED_HOSTS  = ["*"]/\' /opt/mezzanine/mysite/mysite/local_settings.py \n\
python manage.py createdb --noinput \n\
python manage.py migrate --noinput \n\
python manage.py runserver 0.0.0.0:80' > /opt/mezzanine/mysite/start.sh \
  && chmod +x /opt/mezzanine/mysite/start.sh
EXPOSE 80
VOLUME /opt/mezzanine/mysite
CMD ["/opt/mezzanine/mysite/start.sh"]

2. MezzanineとPostgreSQL10.4コンテナの構築・実行(docker-compose.ymlがあるフォルダで実行)
docker-compose up -d

docker-compose.yml
version: "2"
services:
  db:
    image: postgres:10.4-alpine
    container_name: "mezzanine-db"
    ports:
      - "5432:5432"
    volumes:
      - "db-data:/var/lib/postgresql/data"
    environment:
        POSTGRES_DB: mezzanine
        POSTGRES_PASSWORD: mezzanine
  mezzanine:
    image: mezzanine-pg
    container_name: "mezzanine"
    volumes:
      - "mezzanine-data:/opt/mezzanine/mysite"
    ports:
      - "80:80"
    depends_on:
      - db
volumes:
  db-data:
    driver: local
  mezzanine-data:
    driver: local

3.ブラウザから以下のURLにアクセス
http://<Dockerホスト名またはIP>/
※デフォルトユーザとパスワードはadmin/defaultです。


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

2018年8月30日木曜日

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

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

〇Apache Airflowの画面


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

Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "bento/centos-7.5"
  config.vm.hostname = "co75airflowpg"
  config.vm.provider :virtualbox do |vbox|
     vbox.name = "co75airflowpg"
     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

# download and install postgresql.
wget https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
rpm -Uvh pgdg-centos10-10-2.noarch.rpm

yum -y update
yum -y install postgresql10-server postgresql10-devel postgresql10-contrib
systemctl enable postgresql-10

# initialize postgresql server
/usr/pgsql-10/bin/postgresql-10-setup initdb

echo "listen_addresses='*'" >> /var/lib/pgsql/10/data/postgresql.conf

sed -i 's/host.*all.*all.*127.0.0.1/#host    all             all             127.0.0.1/g' /var/lib/pgsql/10/data/pg_hba.conf
sed -i 's#^host.*all.*all.*::1/128.*ident#host    all             all             ::1/128    password#g' /var/lib/pgsql/10/data/pg_hba.conf

echo "host    all         all         127.0.0.1/32          password" >> /var/lib/pgsql/10/data/pg_hba.conf
echo "host    all         all         192.168.1.0/24          password" >> /var/lib/pgsql/10/data/pg_hba.conf
echo "host    all         all         192.168.55.0/24          password" >> /var/lib/pgsql/10/data/pg_hba.conf
systemctl start postgresql-10.service

# create users and databases...
su - postgres << EOF
psql -c "
alter user postgres with password 'postgres';
"
createdb -T template0 --locale=ja_JP.UTF-8 --encoding=UTF8 airflow
EOF
export PGPASSWD=postgres

systemctl restart postgresql-10.service
su - postgres << EOF
psql -c "
create user airflow with password 'airflow';
alter database airflow owner to airflow;
"
EOF


yum -y install epel-release
yum update
yum -y install postgresql-devel
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 psycopg2
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 = postgresql+psycopg2://airflow:airflow@localhost:5432/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#result_backend = db+mysql://airflow:airflow@localhost:3306/airflow#celery_result_backend = db+postgresql://airflow:airflow@localhost/airflow#' 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に関する他の記事はこちらを参照してください。

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