开源展览会 – 幻灯片

介绍Submarine.js

在构建管理方面,引入一种新的哲学,取代了简单的幂等性。

2019年9月24日

这是一个开源展览会的演示幻灯片。


const TodaysMessages=[
  インフラ構成管理の現状と問題 - Ansibleの場合",
  “Submarine.jsのアプローチ",
  それだけじゃない Submarine.jsの強み",
];

構成管理指的是一种管理方法。

请先看一下这个字符串


构成管理是指对某物的组成和管理。

「◯」里面的字是什么?
「◯ri◯am◯en」


构成管理是指管理一个系统、组织或者事物中各个部分之间关系的过程。

凡事皆有形,总会被破坏。
要修复它,就必须记住原来的形态。

请将构成进行管理。


基础设施的构建管理现状

在Ansible中,使用YAML管理配置信息。

tasks:
  - name: Set host variables based on distribution
    include_vars: "{{ ansible_facts.distribution }}.yml"

handlers:
  - name: restart web service
    service:
      name: "{{ web_service_name | default('httpd') }}"
      state: restarted

引用自:https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html


冪等性的含义是

    • 同じ操作を何回実行しても、同じ結果が得られること

 

    • インフラの構成管理の世界では、何回同じコードを実行しても、同じサーバの状態が得られるという意味で使われる

 

    Webの世界ではHTTPのGETやPUTメソッドは冪等だけど、POSTは冪等ではないなどと言われる

已经建立的服务器,已经设定为不需要进行任何更改。


幂等性的现实

    • Ansibleでは、冪等性を保証するために膨大なモジュールを提供している

 

    • ほしい機能がない(探せない)こともある

 

    • ないときは、自分で冪等なコードを書く

 

    -> これが バグの温床 になりやすい
2019-09-24 03.45.26 docs.ansible.com 916e0ba87951.png

摘自:https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html


何かを何回実行しても同じ結果を返すコードのことを冪等なコードと呼びます。

    1. 确认当前状态的方法

 

    1. 定义所需的状态

 

    用于过渡到另一个状态的方法

同时执行三件事情的复杂代码。


Submarine.js的方法

将它们分别作为不同的事物对待。

    1. 现在状态的查询方式 -> 查询

应有状态的定义 -> 测试

进行状态转移的方式 -> 命令

const Submarine=require('Submarine');

const CorrectServerState=class extends Submarine {
  query(){
    return {
      file_content: String.raw`
        test -r /tmp/submarine/hogehoge \
          && cat /tmp/submarine/hogehoge \
          || echo 'File not readable' \
            >&2
      `,
    };
  }

  test(stats){
    return {
      file_content_is_hogehoge: stats.file_content === 'hogehoge',
    };
  }

  command(){
    return String.raw`
      mkdir -p /tmp/submarine \
        && echo 'hogehoge' \
          > /tmp/submarine/hogehoge
    `;
  }
 

}


const state=new CorrectServerState({
  conn: 'ssh',
  host: 'server1',
});


state.correct()
  .then(console.log);

Submarine.js的方法论

将状态的引用和修改分开的理念在其他领域中也存在。

    • オブジェクト指向 -> CQS(コマンド・クエリの分離)

 

    • https://en.wikipedia.org/wiki/Command–query_separation

データベース -> CRUD(Create, Read, Update, Delete)
REST API -> (GET, PUT, DELETE, POST)


Submarine.js的优势

    • コードに秩序が生まれる

 

    • Shellで書いても、まあまあ見やすい

 

    • if文が少なくてすむ

 

    • 膨大なモジュールを提供する必要がないのでコア機能の開発に注力できる

 

    • ユーザの学習コストも下がる

 

    • queryだけ実行、testだけ実行も可能

 

    • Ansibleはサーバに変更がかかるか コードを実行するまで分からない

バッチ実行前のテストに利用できる

Submarine.js的优势不仅仅只有这个。

通过使用Node.js进行开发

    • 変数、定数のスコープがつかえる

 

    • Ansibleでは、ほとんどの変数・定数はグローバル

 

    • classと継承の概念によりDIが可能に

 

    • フロントエンド、サーバサイド、インフラの全てがJavaScriptで開発可能

 

    TypeScriptと組み合わせて静的型付けも可能

Submarine.js的优点不仅限于此

只有Submarine.js才有的独特功能

    • Remote-to-remoteのファイルコピー

 

    • Ansibleではremote-to-local, local-to-remoteと段階を踏む必要がある

 

    • query, test, commandの実行をHTTPエンドポイント化

 

    GUI化も検討中

标志

Submarine1.0-510.png

const Intro={
  name: 'Submarine.js',
  repository: 'https://gitlab.com/mjusui/submarine'
  catch_copy: 'From submarine, you could see a full of iceberg',
  advertisement: '試験導入いただける企業を募集中。DMください',
  twitter_account: '@Mjusui',
  history: [
    "大学ではWebクローラの研究開発",
    "新卒でデータセンターのインフラエンジニア",
    "アドテク業界に転職、インフラエンジニアは継続",
  ],
  likes: [
    'Programming',
    'Baremetal server',
    'Philosophy',
    'Inovation',
    'Linux mint',
    'Vivaldi browser',
  ],
};

广告
将在 10 秒后关闭
bannerAds