├── .gitignore ├── roles ├── gcp │ └── main.yml ├── common │ └── tasks │ │ └── main.yml ├── python │ ├── templates │ │ ├── rodeo.conf │ │ ├── jupyter.conf │ │ └── jupyter_notebook_config.py │ └── tasks │ │ └── main.yml ├── aws │ └── tasks │ │ └── main.yml └── R │ └── tasks │ └── main.yml ├── group_vars └── all.yml ├── site.yml └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | site.retry 3 | -------------------------------------------------------------------------------- /roles/gcp/main.yml: -------------------------------------------------------------------------------- 1 | - name: GCP SDKのインストール。認証は面倒なので各自ログイン後gcloud initを実行 2 | apt: name={{ item }} state=latest update_cache=yes 3 | become: yes 4 | with_items: 5 | - google-cloud-sdk 6 | -------------------------------------------------------------------------------- /group_vars/all.yml: -------------------------------------------------------------------------------- 1 | # 環境ごとの変数 2 | # 自動でAWSのSDKを使いたい場合は設定する。GCPの認証は各自 3 | 4 | 5 | ### Python関連 6 | python_version: anaconda3-5.3.1 7 | 8 | ### R関連 9 | r_studio_binary_url: https://download2.rstudio.org/ 10 | r_studio_binary_name: rstudio-server-0.99.903-amd64.deb 11 | 12 | 13 | ### AWS関連 14 | aws_access_key: hogehoge 15 | aws_secret_access_key: hogehoge 16 | -------------------------------------------------------------------------------- /roles/common/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | - name: 基本パッケージをインストール。初回は時間かかるのでコーヒーでも飲んでて下さい。(各自好きに追加して下さい。Python、R関連は別role) 4 | apt: name={{ item }} state=latest update_cache=yes 5 | become: yes 6 | with_items: 7 | - git 8 | - vim 9 | - emacs 10 | - build-essential 11 | - mosh 12 | - tmux 13 | - supervisor 14 | - htop 15 | -------------------------------------------------------------------------------- /roles/python/templates/rodeo.conf: -------------------------------------------------------------------------------- 1 | [program:rodeo] 2 | directory=/home/{{ ansible_env.USER }}/ ; 作業ディレクトリ 3 | command=Rodeo -no-browser --port=8888 4 | numprocs=1 5 | autostart=true ; autostartする 6 | autorestart=true ; 自動で再起動させる 7 | user={{ ansible_env.USER }} ; 起動ユーザ 8 | redirect_stderr=true ; 標準エラーを出力する 9 | stdout_logfile=/home/{{ ansible_env.USER }}/rodeo.log ; ログファイルの出力先 -------------------------------------------------------------------------------- /roles/python/templates/jupyter.conf: -------------------------------------------------------------------------------- 1 | [program:jupyter] 2 | directory=/home/{{ ansible_env.USER }}/ ; 作業ディレクトリ 3 | command=/home/{{ ansible_env.USER }}/.pyenv/shims/jupyter notebook 4 | numprocs=1 5 | autostart=true ; autostartする 6 | autorestart=true ; 自動で再起動させる 7 | user={{ ansible_env.USER }} ; 起動ユーザ 8 | redirect_stderr=true ; 標準エラーを出力する 9 | stdout_logfile=/home/{{ ansible_env.USER }}/jupyter.log ; ログファイルの出力先 -------------------------------------------------------------------------------- /site.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | - hosts: all 4 | roles: 5 | - common 6 | tags: 7 | - python_only 8 | - r_only 9 | 10 | - hosts: all 11 | roles: 12 | - python 13 | tags: 14 | - python_only 15 | 16 | - hosts: all 17 | roles: 18 | - R 19 | tags: 20 | - r_only 21 | 22 | - hosts: all 23 | roles: 24 | - aws 25 | - gcp 26 | tags: 27 | - python_only 28 | - r_only 29 | -------------------------------------------------------------------------------- /roles/python/templates/jupyter_notebook_config.py: -------------------------------------------------------------------------------- 1 | 2 | c = get_config() 3 | 4 | # matplotlibで描画したものがnotebook上で表示できるようにする 5 | c.IPKernelApp.pylab = 'inline' 6 | # 全てのIPから接続を許可 7 | c.NotebookApp.ip = '*' 8 | # IPython notebookのログインパスワード 9 | #c.NotebookApp.password = 'sha1:<ハッシュ化されたパスワード>' 10 | # 起動時にブラウザを起動させるかの設定(デフォルトは起動させる) 11 | c.NotebookApp.open_browser = False 12 | # ポート指定(デフォルトは8888) 13 | c.NotebookApp.port = 8888 14 | -------------------------------------------------------------------------------- /roles/aws/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | - name: AWS CLIインストール 4 | become: yes 5 | pip: name=awscli executable=/home/{{ ansible_user }}/.pyenv/shims/pip 6 | 7 | - name: AWS Credential設定 KEYはgroup_varsに記載 8 | args: 9 | creates: ~/.aws 10 | shell: | 11 | mkdir ~/.aws 12 | ( 13 | echo '[default]' 14 | echo 'aws_access_key_id = {{ aws_access_key }}' 15 | echo 'aws_secret_access_key = {{ aws_secret_access_key }}' 16 | ) > ~/.aws/credentials 17 | ( 18 | echo '[default]' 19 | echo 'output = json' 20 | echo 'region = ap-northeast-1' 21 | ) > ~/.aws/credentials 22 | -------------------------------------------------------------------------------- /roles/R/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | - name: Rリポジトリ登録。Ubuntuバージョンはansible_lsb.codename|lowerで取得可能 4 | become: yes 5 | lineinfile: > 6 | dest=/etc/apt/sources.list 7 | line="deb http://cran.ism.ac.jp//bin/linux/ubuntu/ {{ ansible_lsb.codename|lower }}" 8 | 9 | - name: Rリポジトリ公開鍵登録 10 | become: yes 11 | shell: apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 12 | 13 | - name: apt update & R関連apt-get 14 | apt: name={{ item }} state=latest update_cache=yes 15 | become: yes 16 | with_items: 17 | - r-base 18 | - r-base-dev 19 | - gdebi-core 20 | 21 | - name: R Studioダウンロード(DLバイナリ名はgroup_varsで管理、新しいのが出たら各自変更 22 | become: yes 23 | get_url: url="{{ r_studio_binary_url }}{{ r_studio_binary_name }}" dest=/tmp 24 | 25 | - name: R Studioインストール 26 | become: yes 27 | shell: gdebi -n /tmp/{{ r_studio_binary_name }} 28 | 29 | - name: R xgboostインストール 30 | become: yes 31 | shell: | 32 | ( 33 | echo 'install.packages("drat", repos="https://cran.rstudio.com")' 34 | echo 'drat:::addRepo("dmlc")' 35 | echo 'install.packages("xgboost", repos="http://dmlc.ml/drat/", type = "source")' 36 | ) | Rscript - 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 分析環境Ansible 2 | 3 | 分析環境構築に必要そうなものをとりあえずまとめました。 4 | 5 | 方針としては、全部入りを目指しているので、必要と思うものはバンバン入れて下さい。 6 | 7 | # 動作環境 8 | 9 | * Python2系のみ 10 | * Ubuntu 15.04で動作確認済 11 | 12 | # 構築環境概要 13 | 14 | Infrastructure as Codeなんでここには概要のみ 15 | 16 | ### Python 17 | 18 | * Anaconda - バージョンはgroup_varsで管理 19 | * xgboost 20 | * jupyter notebook が8888で自動起動 21 | 22 | ### R 23 | 24 | 最新版をダウンロード。 25 | 26 | * R 27 | * RStudio - 8787で自動起動 28 | 29 | ### クラウド 30 | 31 | * AWS - group_varsにkeyが記載できるので,awsコマンドが使えます 32 | * GCP - 一応aptでSDK入れたが、gcloud init やgcloud auth loginなどインタラクティブが多いのでアカウント自動設定は未実装。改善求む 33 | 34 | # 使用方法 35 | 36 | 分析環境は都度マシンが変わるのでinventryファイルは用意せず、コマンドライン指定を想定 37 | 38 | 最も基本的な使用方法は下記。-i 以下の**ダブルクオート**と**末尾カンマ**は必須なので注意 39 | 40 | ``` 41 | # ansible-playbook -i "[IPアドレス]," -u [ユーザ名] -k site.yml 42 | # 秘密鍵指定は --private-key オプション 43 | ansible-playbook -i "192.168.33.10," -u vagrant -k site.yml 44 | 45 | # 時間掛かるのでローカル(分析サーバ上で)実行したい場合は以下 46 | ansible-playbook -i "localhost," --connection=local site.yml 47 | ``` 48 | 49 | Anacondaインストールに非常に時間かかるので、PythonのみRのみのインストールにも対応 50 | 51 | 詳細はsite.ymlのtagsを参照 52 | 53 | ``` 54 | # Pythonのみ 55 | ansible-playbook -i "192.168.33.10," -u vagrant -k site.yml --tags python_only 56 | 57 | # Rのみ 58 | ansible-playbook -i "192.168.33.10," -u vagrant -k site.yml --tags r_only 59 | ``` 60 | -------------------------------------------------------------------------------- /roles/python/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | - name: Python関連apt-get (本体はpyenv, 大体Rodeo関連(Rodeoはサーバで動かないことが判明したが一応入れておく)) 4 | apt: name={{ item }} state=latest 5 | become: yes 6 | with_items: 7 | - libxml2-dev 8 | - libxslt1-dev 9 | - python-dev 10 | - zlib1g-dev 11 | - libdbusmenu-gtk4 12 | - libgtk2.0-dev 13 | - libindicator7 14 | - indicator-application 15 | - libappindicator1 16 | - libnotify4 17 | - libnotify-bin 18 | - libnss3-dev 19 | 20 | - name: pyenv導入、インストールバージョンはgroup_varsで管理 21 | args: 22 | creates: ~/.pyenv 23 | shell: | 24 | git clone https://github.com/yyuu/pyenv.git ~/.pyenv 25 | ( 26 | echo 'export PYENV_ROOT=~/.pyenv' 27 | echo 'export PATH=$PYENV_ROOT/bin:$PATH' 28 | echo 'eval "$(pyenv init -)"' 29 | ) >> ~/.bash_profile 30 | 31 | - name: Anacondaインストールとpyenv globalに設定。時間かかります。アップデートは更に時間かかるのでしてません。group_varsのインストールバージョンを変えるか、各自"conda update --all -y"等実行をお願いします。 32 | shell: | 33 | bash -lc " \ 34 | pyenv install {{python_version}}; \ 35 | pyenv rehash; \ 36 | pyenv global {{python_version}}; \ 37 | " 38 | 39 | - name: Xgboostインストール 40 | pip: name=xgboost executable=/home/{{ ansible_env.USER }}/.pyenv/shims/pip 41 | 42 | 43 | - name: supervisor起動 44 | service: name=supervisor state=started enabled=yes 45 | 46 | - name: Jupyter設定ファイルディレクトリ作成 47 | file: path=~/.jupyter state=directory 48 | 49 | - name: Jupyter設定ファイル設置 50 | template: src=jupyter_notebook_config.py dest=~/.jupyter/jupyter_notebook_config.py 51 | 52 | - name: Jupyterデーモン設定 port:8888で起動 53 | become: yes 54 | template: src=jupyter.conf dest=/etc/supervisor/conf.d/jupyter.conf 55 | 56 | - name: Jupyter起動 57 | become: yes 58 | ignore_errors: True 59 | shell: | 60 | supervisorctl reread 61 | supervisorctl reload 62 | supervisorctl start jupyter 63 | --------------------------------------------------------------------------------