2018年9月17日月曜日

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

MezzanineはPython製のCMSです。

○Mezzanineの画面


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

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

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 mariadb-dev build-base \
  && pip install mezzanine \
  && pip install mysqlclient \
  && apk del mariadb-dev build-base build-deps gcc \
  && apk add mariadb-client mariadb-connector-c \
  && rm -rf /var/cache/apk/* \
  && mezzanine-project mysite \
  && echo $'#!/bin/sh \n\
until mysql -h db -u root -pmezzanine mezzanine\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.mysql",/\' /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": "root",/\' /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": "3306",/\' /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とMariaDBコンテナの構築・実行(docker-compose.ymlがあるフォルダで実行)
docker-compose up -d

docker-compose.yml
version: "2"
services:
  db:
    image: mariadb:10.3
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    container_name: "mezzanine-db"
    volumes:
      - "db-data:/var/lib/mysql"
    ports:
      - "3306:3306"
    environment:
        MYSQL_DATABASE: mezzanine
        MYSQL_ROOT_PASSWORD: mezzanine
  mezzanine:
    image: mezzanine
    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です。

2018年9月16日日曜日

DockerでGrafanaとPrometheusのコンテナを構築・実行する

PrometheusとGrafanaでサーバーを監視して、各種情報を可視化する事ができます。

〇Grafanaの画面


〇コンテナの構築・実行
1.prometheus.ymlを環境に合わせて編集します

prometheus.ymlの例
global:
  scrape_interval:     15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets:
        - '192.168.1.10:9100'

2. コンテナの構築と実行
以下のdocker-compose.ymlと上記のprometheus.ymlを使用して、GrafanaとPrometheusのコンテナを構築・実行します。
docker-compose up -d

docker-compose.yml
version: "2"
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
    ports:
      - "9090:9090"
  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - "3000:3000"
    depends_on:
      - prometheus
    environment:
      GF_SECURITY_ADMIN_USER: admin
      GF_SECURITY_ADMIN_PASSWORD: admin
volumes:
  prometheus-data:
    driver: local

3. Grafanaにアクセス
ブラウザからhttp://<DockerホストまたはIP:3000/にアクセスします。

JupyterとdatapackageでIMFの一人当たり実質国内総生産(ローカル通貨)データを取得する

Jupyterとdatapackageで、IMFの一人当たり実質国内総生産(ローカル通貨)データを取得してグラフ描画するには、以下のコードを実行します。

〇出力グラフ


サンプルコード

以下のコードで、一人当たり実質国内総生産(ローカル通貨)データを取得してグラフを描画します。
%matplotlib inline
import matplotlib.pyplot as plt
from datapackage import Package
import pandas as pd

package = Package('https://datahub.io/core/imf-weo/datapackage.json')

for resource in package.resources:
  if resource.name == "values_csv":
    df = pd.read_csv(resource.descriptor['path']) 
    df = df.query("Indicator=='NGDPRPC' and Country in ('JPN')")
    df = df[['Country','Year','Value']]
    df['Value'] = df['Value'].astype(float)
    df.set_index(["Country", "Year"], inplace=True)
    ax = df.unstack(level=0).plot()
    plt.xticks(rotation=90)
    plt.legend(loc='best')
    plt.show()

動作確認バージョン

datapackage=1.14.1 (2020/07/15確認)

関連情報

様々なデータを取得できるdatapackageのまとめ

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

Jupyterとdatapackageで月別の金価格データを取得する


Jupyterとdatapackageで、月別の金価格データ(USD)を取得して、グラフ描画します。

〇画面


〇コード
%matplotlib inline
import matplotlib.pyplot as plt
from datapackage import Package
import pandas as pd

package = Package('https://datahub.io/core/gold-prices/datapackage.json')

for resource in package.resources:
  if resource.name == "data_csv":
    df = pd.read_csv(resource.descriptor['path'], index_col='date', parse_dates=True)
    #df = df.query("date >= '1970-01-01'")
    ax = df.plot()
    plt.xticks(rotation=90)
    plt.legend(loc='best')
    plt.show()


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

AnsibleでMariaDBとLimeSurveyをインストールする(Ubuntu16.04用)

LimeSurveyで、オンラインアンケートを設置することができます。

〇LimeSurveyの管理者画面


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

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

inventory例
[lime-survey]
192.168.1.107

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

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

limesurvey.yml
- hosts: lime-survey
  vars:
    - dbname: limesurvey
    - dbuser: limesurvey
    - dbpassword: limesurvey
    - dbhost: localhost
    - dbport: 3306
  tasks:
    - name: set password for root
      shell: echo "mariadb-server-10.1 mysql-server/root_password password root" | sudo debconf-set-selections
      become: yes
    - name: set password for root
      shell: echo "mariadb-server-10.1 mysql-server/root_password_again password root" | sudo debconf-set-selections
      become: yes
    - name: install mariadb
      apt:
        name: mariadb-server
        state: present
      become: yes
    - name: enable and start mariadb
      systemd:
        name: mysql
        enabled: yes
        state: started
      become: yes
    - name: Install required software
      apt: name={{ item }} state=present
      with_items:
        - libmysqlclient-dev
        - python-pip
      become: true
    - name: install MySQL-python using pip
      pip:
        name: "{{ item }}"
        state: forcereinstall
      with_items:
        - pip
        - MySQL-python
      become: true
    - name: create db
      mysql_db:
        name={{ dbname }}
        state=present
        encoding=utf8
        login_user=root
      become: true
    - name: create and grant a database user
      mysql_user:
        name={{ dbuser }}
        password={{ dbpassword }}
        priv="limesurvey.*:ALL"
        state=present
      become: true
    - name: Install apache and php modules
      apt: name={{ item }} state=present
      with_items:
        - apache2
        - libapache2-mod-php7.0
        - php7.0-gd
        - php7.0-json
        - php7.0-mysql
        - php7.0-pdo
        - php7.0-curl
        - php7.0-mbstring
        - php7.0-mcrypt
        - php7.0-xml
        - php7.0-zip
      become: true
    - name: download limesurvey
      get_url:
        url: https://github.com/LimeSurvey/LimeSurvey/archive/3.14.0+180730.tar.gz
        dest: /tmp/
      become: true
    - name: extract limesurvey
      unarchive:
        remote_src: yes
        src: /tmp/LimeSurvey-3.14.0-180730.tar.gz
        dest: /opt/
      become: true
    - name: change owner
      file:
        path: /opt/LimeSurvey-3.14.0-180730
        owner: www-data
        group: www-data
        recurse: yes
      become: true
    - name: symlink
      file:
        path: /var/www/html/limesurvey
        state: link
        src: /opt/LimeSurvey-3.14.0-180730
      become: true
    - name: clean up
      file:
        state: absent
        path: /tmp/LimeSurvey-3.14.0-180730.tar.gz
      become: yes
    - name: start apache2.service
      systemd:
        name: apache2
        state: restarted
      become: yes

4.ブラウザからhttp://192.168.55.107/limesurveyにアクセスして、「日本語 - Japan」を選択して「Start installation」をクリックします


5.ライセンスを確認して、同意できるのであれば「同意する」をクリックします


4.「インストール前のチェック」画面で「次へ」をクリックします


6.「データベース設定」画面で、以下の項目を入力して「次へ」をクリックします
データベース形式: MySQL
データの場所: localhost
データベースユーザー: limesurvey
データベースパスワード: limesurvey
データベース名: limesurvey


7.「データベースを作成する」をクリックします


8.「管理者設定」画面で管理者情報等を入力して、「次へ」をクリックします


9.インストーラ完了画面



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

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

2018年9月15日土曜日

AnsibleでnextcloudとMariaDBをインストールする(Ubuntu18.04用)

nextcloudで、Dropboxのようにファイルを管理・共有する事ができます。

〇nextcloudの画面


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

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

inventory例
[nextcloud]
192.168.1.61

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

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

nextcloud-mariadb.yml
- hosts: nextcloud
  vars:
    - dbname: nextcloud
    - dbuser: nextcloud
    - dbpassword: nextcloud
    - dbhost: localhost
    - dbport: 3306
  tasks:
    - name: set password for root
      shell: echo "mariadb-server-10.1 mysql-server/root_password password root" | sudo debconf-set-selections
      become: yes
    - name: set password for root
      shell: echo "mariadb-server-10.1 mysql-server/root_password_again password root" | sudo debconf-set-selections
      become: yes
    - name: install mariadb
      apt:
        name: mariadb-server
        state: present
      become: yes
    - name: enable and start mariadb
      systemd:
        name: mysql
        enabled: yes
        state: started
      become: yes
    - name: Install required software
      apt: name={{ item }} state=present
      with_items:
        - libmysqlclient-dev
        - python-pip
      become: true
    - name: install MySQL-python using pip
      pip:
        name: "{{ item }}"
        state: forcereinstall
      with_items:
        - pip
        - MySQL-python
      become: true
    - name: create db
      mysql_db:
        name={{ dbname }}
        state=present
        encoding=utf8
        login_user=root
      become: true
    - name: create and grant a database user
      mysql_user:
        name={{ dbuser }}
        password={{ dbpassword }}
        priv="{{ dbuser }}.*:ALL"
        state=present
      become: true
    - name: Install apache and php modules
      apt: name={{ item }} state=present
      with_items:
        - apache2
        - libapache2-mod-php7.2
        - php7.2-gd
        - php7.2-json
        - php7.2-mysql
        - php7.2-pdo
        - php7.2-curl
        - php7.2-mbstring
        - php7.2-xml
        - php7.2-zip
        - php7.2-imagick
        - php7.2-intl
        - unzip
      become: true
    - name: download nextcloud
      get_url:
        url: https://download.nextcloud.com/server/releases/nextcloud-13.0.5.zip
        dest: /tmp/
      become: true
    - name: extract nextcloud
      unarchive:
        remote_src: yes
        src: /tmp/nextcloud-13.0.5.zip
        dest: /opt/
      become: true
    - name: change owner
      file:
        path: /opt/nextcloud
        owner: www-data
        group: www-data
        recurse: yes
      become: true
    - name: symlink
      file:
        path: /var/www/html/nextcloud
        state: link
        src: /opt/nextcloud
      become: true
    - name: clean up
      file:
        state: absent
        path: /tmp/nextcloud-13.0.5.zip
      become: yes
    - name: start apache2.service
      systemd:
        name: apache2
        state: restarted
      become: yes

2.ブラウザからhttp://<対象ホスト>/nextcloud/にアクセスして、初期設定を行います。管理者の情報の他、以下の情報を指定します。
DB user: nextcloud, DB password: nextcloud, DB: nextcloud, DB host: localhost:3306


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

その他のAnsibleの記事

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

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

〇Apache Airflowの画面


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

Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "bento/centos-7.5"
  config.vm.hostname = "co75airflowmariadb"
  config.vm.provider :virtualbox do |vbox|
     vbox.name = "co75airflowmariadb"
     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 mariadb
yum -y install mariadb mariadb-server
sudo systemctl enable mariadb.service
sudo systemctl start mariadb.service
mysql -uroot -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 mariadb-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に関する他の記事はこちらを参照してください。