Skip to content

Latest commit

 

History

History
388 lines (257 loc) · 10.6 KB

source.markdown

File metadata and controls

388 lines (257 loc) · 10.6 KB

% NixOps & Nix DevOps % Tokyo NixOS Meetup % 2016年3月24日

This month in Nix - News from the front

This month in Nix - Reddit topics

This month in Nix - ML topics

This month in Nix - Tokyo NixOS

DevOpsとは

  • Buzzword
  • デプロイメントから
  • 組織改善まで
  • "シスアドミン版のアジャイル"
  • 今日はソフトウェアデプロイメント改善と自動化を中心とします

DevOpsが解決をする問題

  • 問題のないソフトウェアをリリースする
    • 環境の統一
    • 継続的インテグレーション(CI)、品質保証(QA)
  • 簡単、早い、正しいデプロイメント
    • 専用ツール
  • リリース反復↑、品質↑、リスク↓、効率↑

DevOpsツール

Nix特徴

  • 環境とパッケージを別々に管理

  • 依存地獄解決

  • 設計でDevOps問題を部分的に解決

  • 元々デプロイメントを解決するために開発された

  • nix論文より

    This thesis is about getting computer programs from one machine to another - and having them still work when they get there.

NixのDevOpsスタック

開発環境管理: nix-shell

  • 特定な環境を起動するツール

  • nix-shellを試す

    $ nix-shell -p redis --run "redis-server"
    $ nix-shell -p redis --run "redis-cli"
  • nixファイルで定義した環境を読み込める

  • デモ: python開発用nix-shell

    examples/nix-shell/python.nix
  • デモ: haskell開発用nix-shell

    examples/nix-shell/haskell.nix

nix-shell tips

  • -I nixpkgs=パラメーターで特定なnixpkgsバージョンを利用できます
  • --pureで純粋な環境を利用
  • hookも利用できます

開発環境管理: コンテナー

  • systemd-nspawnベース
  • Web開発に向いてる
  • configuration.nixで宣言
  • Vagrantと似た使い方ができます
  • configuration.nixと同じオプションを利用できます
  • ネットワーク定義 (hostAddress, localAddress)
  • シェアフォルダー (bindMounts)

開発環境管理: コンテナー

  • サンプル

    containers.httpd = {
    
      privateNetwork = true;
      hostAddress    = "10.0.0.11";
      localAddress   = "10.0.0.12";
      autoStart      = true;
    
      config = { config, pkgs, ... }: { 
    
        # ポート開放
        networking.firewall.allowedTCPPorts = [ 80 ];
    
        # アパッチhttpdを有効
        services.httpd = {
          enable       = true;
          adminAddr    = "[email protected]";
          documentRoot = "${pkgs.valgrind.doc}/share/doc/valgrind/html";
        };
    
      };
    };
  • [email protected]ユニットで管理される

  • コンテナーにログインできます

    $ nixos-container login CONTAINER-NAME
    $ nixos-container root-login CONTAINER-NAME

ソフトウェアをパッケージ

  • Nixファイルでパッケージを定義
  • nix-buildでパッケージビルド
  • nix-copy-closureでクロージャを他マシンにコピー
  • nix-envで環境にインストール

クロージャー

  • パッケージとランタイム依存のセット

  • ストアパースに対して、クロージャーをnix-storeコマンドで確認できます

    $ nix-store -qR STORE-PATH
  • --graphパラメーターでクロージャーのdotファイルを生成できます

    $ nix-store -q --graph STORE-PATH > CLOSURE.dot
    $ nix-shell -p python27Packages.xdot --run "xdot CLOSURE.dot"
  • nix-copy-closureでクロージャーを他マシンに移動できます

    $ nix-copy-closure --to USER@SERVER STORE-PATH
    $ nix-copy-closure --from USER@SERVER STORE-PATH
  • nix-env -iでパッケージをインストールできます

    $ nix-env -i STORE-PATH

カスタムパッケージのデプロイ

NixOps

  • NixOSデプロイメントを自動化
  • コマンドラインツール: nixops
  • 論理ネットワークと物理ネットワークを別々に管理
  • sqliteを利用(~/.nixops/deployments)
  • Amazon EC2, Google CE、一般サーバ等のサポート

NixOps利用流れ

  • デプロイメントを作成

    $ nixops create LOGICAL.nix PHYSICAL.nix -d DEPLOYMENT
  • デプロイメントをリストアップ

    $ nixops list
  • デプロイメントの情報確認

    $ nixops info -d DEPLOYMENT
  • デプロイメントを展開

    $ nixops deploy -d DEPLOYMENT
    
  • マシンに接続

    $ nixops ssh -d DEPLOYMENT MACHINE
    

NixOpsで独自パッケージをデプロイ

NixOpsで独自モジュールをデプロイ

  • モジュール例: binserverの紹介

  • デモ: python webサービス

    examples/nixops/module/
    

NixOps + コンテナーで独自モジュールをデプロイ

  • デモ: python webサービス

    examples/nixops/module+container/
    

NixOps: noneバックエンド

  • noneバックエンドは普通のサーバをターゲットします

  • サーバにNixOSインストールが必要

  • 参考ファイル

    examples/nixops/none/
    

NixOps例

NixOps Tips

  • 論理定義ファイルをNAME.logical.nix、物理定義ファイルをNAME.physical.nixにするとわかりやすい

  • -I nixpkgs=パラメーターで各コマンドに特定なチャンネルを利用できる

    $ nixops deploy -d DEPLOYMENT -I nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-15.09-small.tar.gz
    $ nixops deploy -d DEPLOYMENT -I nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-unstable-small.tar.gz
    $ nixops deploy -d DEPLOYMENT -I nixpkgs=/home/foo/nixpkgs/
  • json形式でデプロイメントのインポート・エクスポートできます

    $ nixops export -d DEPLOYMENT > FILE.json
    $ nixops import -s DEPLOYMENT < FILE.json
  • パラメーターを設定する事ができます

    $ nixops set-args --arg active true
  • デプロイメントは変更できます

    $ nixops modify -d DEPLOYMENT -n NEWNAME LOGICAL.nix PHYSICAL.nix

DisNix

  • DisNixはNixを利用して、サービスの自動デプロイメントツール(異質環境対応)
  • DisNix
    • サービスモデル: サービスとその依存関係定義
    • インフラモデル: 物理ネットワーク定義
    • デプロイメントモデル: サービスをインフラのマップ定義

DisNixとNixOps

  • NixOpsはNixOSの自動デプロイメントツール
  • DisNixはNixベースのサービスデプロイメントツール

DockerとNix

  • dockerToolsでdockerイメージを生成できます

  • デモ: redisを含めたイメージを生成

    examples/docker/
    
    $ docker load < NIX-STORE
    $ docker run IMAGE COMMAND 

リンク