読者です 読者をやめる 読者になる 読者になる

execjsonに新規ジョブを追加する方法

execjson

execjson に新規ジョブを追加する際の対応についてまとめる。
例としてLinuxのパスワードリセットを自動化する場合の変更点をまとめる。

1. HTMLへの追加
execjsonでは、SRのインプットとしてHTMLを使用する。
このため、template/app1/index.html で以下の変更を加えている。

1-1. テンプレートdiv要素の追加
+<div id="passwdresetostemplate" style="display:none">
+<div class="operation">
+パスワードリセット(OS):<b class=passwdresetosstart>[+]</b><input id="" type="text" name="name" value="passwdresetos" hidden>
+サーバー:<input id="" type="text" name="server">
+ユーザー名:<input id="" type="text" name="username">
+</div>
+</div>

入力は 1つのdiv要素となっており、SRの名前として、"passwdresetos" を使用している。SR名は、ここ以外に何度か出てくる値となっており、execjson 内で一意になっている必要がある。
また、div要素の idは "SR名+template"となっている必要がある。

div要素の中では、input 要素で、入力項目を指定する。主に、text, select 等を使用しているが、それ以外も使用できると思う。
※ ここの各input項目のname は、fabric の引数名として、直接渡される。


1-2. ジョブ追加用の select/option への追加
 operation:<select id="sortofop" name="sortofop" onchange="addjob()">
...
+<option value="passwdresetos">パスワードリセット(OS)</option>
...
 </select>

HTML後半の select/option の中に、今回追加するジョブを加える。optionのvalue は、SR名と一致させる必要がある。


2. django view (app1/views.py) への追加

2-1. (オプション)複数 operation への対応
+operationswithseveralops=['mkdir','filetransfer','editcron','editat',
+ 'passwdresetos'
+]

パスワードリセットは複数オペレーションを持つ作業のため、SR名を operationswithseveralops のリストに追加している。
※ ジョブとオペレーションの違いについては後述、、

2-2. セッション取り込みロジックへの反映
def consumeoperationargs(jobname, duprp):
...
 + elif (jobname=="passwdresetos"):
 +  return consume(duprp, ["server", "username"])
...

execjson 内では、フォームとして上がってきた値をセッションDBに追加するため、各ジョブごとに該当するフォームの項目をargs(JSONのobj) として取り込んでいる。このため、django のview側でも、HTMLで指定した値を持つ必要がある。値は、consumeoperationargs 内の分岐として指定している。

3. batch/do.py への反映

+operationswithseveralops=['mkdir','filetransfer','editcron','editat',
+ 'passwdresetos'
+]

fabric にコマンドを渡す際、実行サーバーを指定する必要があるが、この部分は、batch/do.py の xxx_parse という、一連の関数で制御している。passwdresetos は、"server" で指定された値をそのまま使うので、generic_parse という関数を使用しており、こちらは operationswithseveralops に追加することで、対象となる。
※ そうでない場合、xxx_parse を別途作成する必要がある(ファイル転送などで個別のxxx_parse を使用)

4. batch/fabfileへの反映

+def passwdresetos(username):
+ sudo("faillog -u %(username)s -r")

実際に実施するコマンドをfabfileに反映する。(今回は faillog -u xxx -r を発行するのみ)

追加作業は以上となる。プログラミング経験がさほど無い、サーバー担当者でも書けるように作ったつもりだが、どうだろうか、、

SRの受け方は、Excelやワードで書く、メールの本文にフリーフォーマットで書く、専用のWeb画面を書く、等があるかと思うが、それぞれコマンドの自動発行がしづらい、入力チェックが出来ない、構築・導入に時間がかかる、等のデメリットがある。


execjson では、これらのいいとこ取りが出来ているのではないか、と思っている。

 

追記: ジョブとオペレーションの違いについて

execjsonの中では ジョブとオペレーション、というくくりがあるが、ジョブ、は一つのSR項目、に対応しており、オペレーションは、ジョブの中で指定される項目の一つ、という扱いになる。

基本的にはオペレーションとジョブは1対1だが、一部のジョブでは、ジョブとオペレーションが1対多にしたかったため、これを指定できる仕組みを入れている。
※ パスワードリセットでは、一つのジョブで、複数のユーザーのパスワードをリセット出来るようにしたかった。(複数のジョブを指定すれば済むことではあるが、、)