开源展览会 – 幻灯片
介绍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では、冪等性を保証するために膨大なモジュールを提供している
-
- ほしい機能がない(探せない)こともある
-
- ないときは、自分で冪等なコードを書く
- -> これが バグの温床 になりやすい
摘自:https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html
何かを何回実行しても同じ結果を返すコードのことを冪等なコードと呼びます。
-
- 确认当前状态的方法
-
- 定义所需的状态
- 用于过渡到另一个状态的方法
同时执行三件事情的复杂代码。
Submarine.js的方法
将它们分别作为不同的事物对待。
-
- 现在状态的查询方式 -> 查询
应有状态的定义 -> 测试
进行状态转移的方式 -> 命令
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化も検討中
标志
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',
],
};