Secure Command ServerをDocker Swarm化#2

こんばんは。さて、題名にもありますが、Secure Command SErverをDocker Swarm化ということですが、ついに実現します。それについてですが、自動構成ツールとして、Ansibleを利用します。Ansibleとは、もとはRedHat社のプロジェクトで、オープンソース化されたものです。

Ansible(アンシブル)は、レッドハットが開発するオープンソースの構成管理ツールである。サーバを立ち上げる際、あらかじめ用意した設定ファイルに従って、ソフトウェアのインストールや設定を自動的に実行する事が出来る。特に大規模なコンピュータ・クラスターを構築する時に、時間の短縮やミスの削減に有用である。構成管理に加え、オーケストレーションやソフトウェアデプロイメントの機能を持つ。

https://ja.wikipedia.org/wiki/Ansible_(ソフトウェア)

はい。らしいです。でも、これだけなら、シェルスクリプトでもいいわけです。しかし、Ansibleには、シェルスクリプトにはない、利点があります。それは、以下の通りです。

  • 記述のしやすさ
  • 冪等性が保たれること
  • ライブラリが豊富

が挙げられます。まず、記述のしやすさ、です。Ansibleは、基本YAML形式で書きます。YAMLとは、YAML Ain’t Markup Languageの略です。その「YAML」は何なのか、ということは、Wikipediaには、「再帰的」になるらしいです。つまり、

YAML Ain’t Markup Language Ain’t Markup Language Ain’t Markup Language Ain’t Markup Language Ain’t Markup Language Ain’t Markup Language Ain’t Markup Language …

という感じになります。つまり、YAMLのところが永遠にAin’t Markup Language になるということです。プログラミングの中でも、関数が、自分を際限なく呼び出すようなコード

Sub Recursive(X As String)
    Recursive(x)
End Sub

があります。こういうことを再帰的な呼び出しといいます。しかし、この場合は、再帰的な呼び出しとは言いません。

Sub NotRecursive(X As String)
    If X="Windows" Then
        NotRecursive(X & " Edge")
    End If
End Sub

違いは分かったでしょうか?それは、Ifで挟んでいることです。しかし、同じようにIfで挟んでいても、これは再帰的な呼び出しです。

Sub YesRecursive(X As String)
    If X="Windows" Then
        YesRecursive(X)
    End If
End Sub

なぜだかわかりましたか?それは、XをこのIf文のところの条件式でFalseになるような加工をしていないからです。この場合は一切加工をせず、渡しています。そのため、またこのIf文でTrueと判断され、また、そこ関数が実行され…を繰り返すため、再帰的な呼び出しになります。しかし、このような場合なら、再帰的にはなりません。

Private Dim NotRec As Boolean=True
Sub NoRecursive2(X As String)
    If NotRec And X="Windows" Then
        NotRec=False
        NoRecursive2(X)
    End If
End Sub

もうお分かりですね。この場合は、NotRec変数がTrueでかつ、Xの値がWindowsである場合というIf文です。それで、両方ともTrueと判断された場合のステートメントですが、そこでNotRecをFalseにしています。それにより、次実行されたときにまた同じステートメントを歩むことはなくなります。理由は言うまでもありません。NotRecがFalseになることで、If文が当てはまらなくなるからです。

おわかりいただけたでしょうか。プログラミングの話にまで脱線しましたが、再帰的、とはそういうことです。

では、話を戻します。Ansibleの話でした。このAnsible、YAMLを使用して記述するのでしたね。では、まず、YAMLを見ていただきたいと思います。

toplevel:
    windows:
        edge:
          - vendor: Microsoft
          - Version: 10.00
    android:
        chrome:
          - vendor: Google
          - Version: 20.00
    linux:
        firefox:
          - vendor: Mozilla
          - Version: 30.0.0

こんな感じです。どうですか?とても読みやすいですよね。では、YAMLと仲のいい、JSON(Javascript Object Notation)で見てみましょう。

{
    "toplevel":
        {"windows":
                  {edge: [
                          {"vendor": "Microsoft"},
                          {"Version": "10.00"},
                        ]
                  },
         "android":
                  {"chrome": [
                              {"vendor": "Microsoft"}.
                              {"Verison": "20.00"},
                             ]
                  },
         "linux":
                  {"firefox": [
                               {"vendor": "Mozilla"},
                               {"Version": "30.0.0"},
                  },
}

どうでしょうか。このJSONは読みやすくしていますが、中括弧{の関係が多く、見づらいです。中括弧をよく使う系の言語になれりる人にはいいですが、VB.NETや、Pythonなどは、中括弧や大かっこをあまり使わないため、それらのユーザは使いづらいと思われます。ちなみに一行書きしてみると、

{"toplevel":{"windows":{edge:[{"vendor":"Microsoft"},{"Version":"10.00"},]},"android":{"chrome":[{"vendor":"Microsoft"}.{"Verison":"20.00"},]},"linux":{"firefox":[{"vendor":"Mozilla"},{"Version":"30.0.0"},},}

はい。このフォーマットですと、一行で書いているように見えませんが、ほんとは、一行で書いています。この場合は、項目数が少ないため、見やすいですが、項目が多くなると、もっとみにくくくなります。

{[{"T":"CI.FeedbackInit","FID":"CI","Name":"Feedback","Text":"fbmoplk"}],[{"T":"CI.TabFocusChanged","TS":1659690607943,"Name":"visible","FID":"TabFocused"}],[{"T":"CI.TabFocusChanged","TS":1659690632826,"Name":"visible","FID":"TabFocused"}],[{"T":"CI.FeedbackInit","FID":"CI","Name":"Feedback","Text":"fbmoplk"}],[{"T":"CI.TabFocusChanged","TS":1659690607943,"Name":"visible","FID":"TabFocused"}],[{"T":"CI.TabFocusChanged","TS":1659690632826,"Name":"visible","FID":"TabFocused"}],[{"T":"CI.FeedbackInit","FID":"CI","Name":"Feedback","Text":"fbmoplk"}],[{"T":"CI.TabFocusChanged","TS":1659690607943,"Name":"visible","FID":"TabFocused"}],[{"T":"CI.TabFocusChanged","TS":1659690632826,"Name":"visible","FID":"TabFocused"}]}

これもまた、勝手に改行っぽく見えますが、一行だとみにくいです。ぜひ、コピーして、エディタなどで、右端で折り返す、を無効化して、見てみてください。

さて、また話が脱線しました。では、次の冪等性についてです。これは、「べきとうせい」と読みます。これは、何度やっても同じ結果になるということです。シェルスクリプトでは、既に実行してあると、また実行したときに、おかしくなる、ということがあります。また、そうならないようにすることも、大変です。また、この冪等性を利用して、このAsibleで、自動構成を作成するときも、デバッグが容易になります。なぜなら、何度やっても同じ結果になるのだから、さっきやったところを実行しても、変化がないからです。つまり、クリーンにしなくてもいいのです。

でも、冪等性は、シュルスクリプトでもできます。サーバ更新ならなおさらです。すでにある・インストールされているなら、何もしないコマンドは多いです。しかし、シェルスクリプトでは勝てない点があります。それは、便利なライブラリです。シェルスクリプトでは、コマンドを実行するだけです。しかし、そのコマンドの構文が難しかったり、手動入力が必要なものもあります。しかし、ユーザの作成、ファイルのコピー、リンクの作成、ディレクトリの作成などなど、簡単にできます。また、sudo権限でも実行できます。そして、コミュニティの使いやすいライブラリもあり、いいです。

そして、複数のサーバを一気に構成できることも利点です。sshでコマンドを実行するため、リモートサーバでも構成が可能です。そのため、「サーバAでの実行結果を書き込んで、それをサーバBとサーバCに送って、その結果をもとに実行する」なんてことが簡単にできます。シェルスクリプトでこれを実行しようとすると、相当な手間がかかるでしょう。

こんな感じにAnsibleには利点がいっぱいです。しかし、シェルスクリプトにはないデメリットがあります。それは、PythonとAnsibleのパッケージをインストールしておく必要があることです。

そして重要事項ですが、Secure Command Serverの更新が2022年08月06日0時00分から2022年08月06日6時00分まで、サーバの更新作業があります。内容は、Docker Swarmで構成しなおすことです。その時の自動構成ツールは、長々と紹介したAnsibleです。どうぞ、ご注意ください。サーバ更新作業のうち2回全部失敗しているので、今回は成功させたいです。怖いですが、成功するといいです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です