Ansibleは、Vagrantでプロビジョニングbashシェルを実行することとどう違うのですか?


39

問題を解決するためにシェルスクリプトを使用した経験を持つITシステム管理者のチームは、代わりにAnsibleを使用することを考えています。

Ansibleとシェルスクリプトの記述を継続して使用することには、大きな違いと正当な理由がありますか?

回答:


29

私はAnsibleを使用したことはありませんでしたが、数週間以来、シェルスクリップと比較して、Ansibleがどれほど優れているかを把握しようとしています。多くの失敗した試行の後-最も明白な質問の1つに答えることでドキュメントが失敗することを証明します-私は最終的にそれを得たと思います:

では、紹介ビデオを見て、潜在的な新規ユーザーとしてランダムにAnsible ansの紹介資料を見てみましょう。熟練したシェルプログラマーがすぐに作成できるものと比較しましょう。

私の結論は、シェルスクリプト上で、Ansibleは基本的に1.システムが望ましい状態に一致することをチェックする可能性、2。監視機能を含むと思われる有料システムであるAnsible Towerと統合する機能です。不変のサーバーパターンを実装する場合など、いくつかの重要なケースでは、ポイント1はおそらくあまり有用ではないため、リストはかなり薄くなります。

私の結論は、Ansibleがシェルスクリプトよりも優れているという利点は、ドキュメントに記載されているように、利用可能なモジュールで十分にカバーされている少数の楽観的なケースでは理にかなっているが、一般的なケースでは小さいか、仮説的でさえあるということです。熟練したシェルプログラマーにとって、これらの利点は、トレードオフの他の側面によって相殺される可能性が最も高いでしょう。

しかし、これはおそらく、紹介資料がどれほど悪いかを証明しているだけかもしれません!

クイックスタートビデオ:

あるクイックスタートビデオが。それは…と主張するページから始まります。これらは実際には主張ではなく、箇条書きリストであり、プレゼンテーションで批判的な判断を一時停止するために一般的に使用されるアーティファクトです。

1. Ansibleは簡単です:

1.1人間が読める自動化–仕様は技術文書であり、どのように

  name: upgrade all packages
  yum:
    name: '*'
    state: latest

シェルスクリプトで見つかった対応するyum呼び出しよりも読みやすいですか?さらに、AppleScriptと連絡を取った人は誰でも、「人間が読める自動化」と読むと笑って死にます。

1.2特別なコーディングスキルは必要ありません–正式な仕様を書かない場合のコーディングとは何ですか?彼らは条件、変数を持っているので、どうやってコーディングしないのですか?そして、なぜ私はプログラムできないものが必要なのでしょうか?文は不正確です!

1.3順番に実行されるタスク–まあ、コードゴルフ愛好家の中には、タスクを無秩序に実行する言語を知っている人もいるかもしれませんが、順番にタスクを実行することは例外的ではありません。

1.4すぐに生産性を向上させる–熟練したシェルプログラマーが生産性を向上させました。この反論は、最初の議論と同じくらい深刻です。

2. Ansibleは強力です

アーティファクトを販売するための人気のあるセールスマンのトリックは、人々を欺いて、彼らがこれらのアーティファクトの「力」を手に入れると信じ込ませることです。車や等張性飲料の広告の歴史は、説得力のある例のリストを提供するはずです。

ここでは、Ansibleは「アプリの展開」を実行できますが、シェルスクリプトは確実に「構成管理」を実行できますが、これは機能ではなくツールの目的の単なる説明であり、少し気取っているように見えますが例はありませんGNU Parallelができることを超えて。

3. Ansibleはエージェントレスです

コラムを埋めるために、彼らは3つの異なる方法でこれがsshだけを必要とすることを書きました。誰もが知っているようにこれはデーモンであり、世界構成管理に浸透しているこれらのエージェントとは関係ありません!

ビデオの残りの部分

ビデオの残りの部分では、インベントリ(サーバーなどのリソースの静的リスト)を紹介し、3つのサーバーに同時にApacheを展開する方法を示します。これは、リソースが非常に動的であり、クラウドプロバイダーが提供するコマンドラインツールによって列挙され、パイプ|演算子を使用してシェル関数によって消費される作業方法とは実際には一致しません。また、Apacheを3つのサーバーに同時に展開するのではなく、マスターインスタンスイメージを作成し、それを使用して、正確なレプリカの1つである3つのインスタンスを起動します。したがって、議論の「オーケストレーション」の部分はあまり適切に見えません。

ランダムドキュメンテーションのステップ1:EC2との統合

EC2はAmazonのコンピューティングサービスであり、EC2とのやり取りはいくつかのAnsibleモジュールによってサポートされています。(他の一般的なクラウドコンピューティングプロバイダーも提供されています):

# demo_setup.yml

- hosts: localhost
  connection: local
  gather_facts: False

  tasks:

    - name: Provision a set of instances
      ec2:
         key_name: my_key
         group: test
         instance_type: t2.micro
         image: "{{ ami_id }}"
         wait: true
         exact_count: 5
         count_tag:
            Name: Demo
         instance_tags:
            Name: Demo
      register: ec2

対応するシェルスクリプトは、JSONで置き換えられたYAMLと本質的に同じです。

provision_a_set_of_instances()
{
  aws --output=text ec2 run-instances --image-id …   
}

またはJSONバージョン

provision_a_set_of_instances()
{
  aws --output=text ec2 run-instances --cli-input-json "$(provision_a_set_of_instances__json)"  
}

provision_a_set_of_instances__json()
{
  cat <<EOF
{
    "ImageId": … 
}
EOF
}

どちらのバージョンも基本的に同じです。ペイロードの大部分は、YAMLまたはJSON構造の初期化値の列挙です。

ランダムなドキュメント作成手順2:継続的デリバリーとローリングアップグレード

このガイドの大部分は本当に興味深い機能を示していません:変数を紹介します(IIRC、シェルスクリプトにも変数があります!)、Ansibleモジュールがmysqlを処理するため、「mysqlユーザーを作成する方法XYの特権を使用して」のように終了します

# Create Application DB User
mysql --host "${mysql_host}" --user "${mysql_user}" --password "${mysql_password}" "${mysql_table}" <<EOF
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
EOF

「どうすればansibleでXYの特権を持つmysqlユーザーを作成できますか」を検索すると、

- name: Create Application DB User
  mysql_user: name={{ dbuser }} password={{ upassword }}
              priv=*.*:ALL host='%' state=present

違いはおそらくあまり意味がありません。そのページでは、Ansibleにテンプレートメタプログラミング言語があることもわかります

{% for host in groups['monitoring'] %}
-A INPUT -p tcp -s {{ hostvars[host].ansible_default_ipv4.address }} --dport 5666 -j ACCEPT
{% endfor %}

これを見ると、たまたま快適な領域にいることになります。宣言型言語のためのこの種の単純なメタプログラミングは、BSD Makefilesとまったく同じ理論的パラダイムです!私はどの広範囲にプログラムされているために起こる(私はYAMLパーサを介して、私のプレイブックを実行することはできませんので、この抜粋ショーたちYAMLファイルでの作業の約束が破られていることなど)。また、Ansibleが評価順序の微妙な技術を議論する必要があることも示しています。変数を言語の「宣言部」で拡張するか、言語の「命令」メタ部で拡張するかを決定する必要があります。ここでは、シェルプログラミングがより簡単であり、明示的 evalまたは外部スクリプトソーシングを除き、メタプログラミングはありません。仮想シェルの抜粋は次のようになります

enumerate_group 'monitoring' | {
  while read host; do
    …
  done
}

Ansibleバリアントと比較した場合の複雑さはおそらく許容範囲です。言語のプレーンで規則的な退屈な構成要素を使用するだけです。

ランダムドキュメンテーションのステップ3:テスト戦略

最後に、Ansibleの最初の実際に興味深い機能であることが判明しました。「Ansibleリソースは、desired-stateのモデルです。そのため、サービスの開始、パッケージのインストールなどをテストする必要はありません。Ansibleは、これらが宣言的に正しいことを保証するシステムです。代わりに、あなたのプレイブックでこれらのことを主張してください。」今では少し面白くなり始めていますが、

  1. 利用可能なモジュールによって容易に実装される少数の標準的な状況は別として、私はテストを実装するビットを自分でフィードする必要があります。

  2. インストールの適合性の確認は、不変のサーバーパターンが実装されているコンテキストではあまり重要ではない場合があります。実行中のすべてのシステムは通常、マスターイメージ(インスタンスイメージまたはdockerイメージ)から生成され、更新されることはありません。代わりに新しい。

対処されていない懸念:保守性

Ansibleの紹介資料は、保守性の問題を無視しています。本質的に型システムがないため、シェルスクリプトはJavaScript、Lisp、またはPythonの保守容易性を備えています。大規模なリファクタリングは、広範な自動テストスイート、または少なくとも簡単な対話型テストを可能にする設計によってのみ成功します。とは言っても、シェルスクリプトはシステム構成と保守の共通語ですが、ほぼすべてのプログラミング言語にはシェルへのインターフェイスがあります。したがって、シェル構成ビットのさまざまなビットを一緒に接着するために使用することにより、高度な言語の保守性の利点を活用することは完全に実行可能です。OCamlについては、Rashellを書きました これは、サブプロセスの共通の相互作用パターンの手を本質的に提供します。これにより、構成スクリプトのOCamlへの変換は本質的に簡単になります。

Ansibleの側面では、プレイブックの非常に弱い構造とメタプログラミング機能の存在により、シェルスクリプトの場合と同様に状況が本質的に悪くなります。マイナス点は、Ansibleの単体テストの書き方が明らかでないことです。 、およびアドホックな高レベル言語を導入するという議論はまねることができません。

構成ステップのべき等性

Ansibleのドキュメントは、べき等の設定手順を記述する必要性に注意を喚起します。より正確には、ステップシーケンスabaabに簡略化できるように構成ステップを記述する必要があります。つまり、構成ステップを繰り返す必要はありません。これは、dem等性よりも強い条件です。Ansibleでは、プレイブックで任意のシェルコマンドを使用できるため、Ansible自体は、このより強力な条件が尊重されることを保証できません。これは、プログラマーの規律にのみ依存しています。


これはマニュアルのように思えます...印象的です!
Pierre.Vriens

4
私はこれ以上同意できませんでした。私たちは1年以上Ansibleを使用しており、今ではDockerコンテナーを使用しています。Dockerコンテナーは、古くて良いbashスクリプトで構築されています。私の意見では、状態の定義も非常に興味深い機能ですが、既に述べたように、対応するAnsibleモジュールを持たないサービスが非常に多いため、常にbashコマンドにフォールバックする必要があります。もちろん、不変コンテナのみをサーバーに展開するため、この場合、状態を定義することは実際には何の利点もありません。
アンドレアス

1
ansibleを徹底的に使用した後、先験的に行ったすべてのポイントを確認できます。べき等は可能ですが、ansibleによって強制されません(悪い市民についてはvmware_guestモジュールを参照してください)、マクロシステムでの作業は非常に苦痛であり、構造化データで最も基本的な処理を実行することさえ信じられないほど困難です、いくつかの基本的なことは間違っています(プレイブック形式は、治療なしではUnixファイルモードを食べることができません)そして、唯一の本当の良いことは、ansibleのために書かれた有用な関数の負荷です。そのため、Red Hatがその製品をプッシュしていなかった場合、広く採用されていることを理解できません。
マイケルルバルビエグリュネ

1
@Andreasシェルまたはコマンドモジュールにフォールバックする必要がある多くの場合がありますが、それはあなたのansibleプレイがi等であることを意味しません。コアモジュール自体は、アクションを実行する必要があるかどうかをチェックするだけで、べき等性を維持します。シェルまたはコマンドモジュールで同じことを行うには、最初に何かを行う必要があるかどうかを確認するタスクを実行し、その出力を登録してから、最初のタスクからの出力に基づいて2番目のタスクで条件を実行します。
レビ

1
@MichaelLeBarbierGrünewald、私は全体的に同意しなければなりません、Ansibleと仕事をしたとき、実行するのは本当に苦痛でしたし、以前のクラウドベースの会社のインフラストラクチャに接続してLinuxをプロビジョニングするためにプレイブックをまとめるのに数週間かかる仕事ディストリビューション、LAMP / LEMPなどをインストールします。完了すると時間を節約できましたが、起動して実行するまでに1か月ほどかかりました。私たちの誰もマスターbashスクリプト作成者ではなかったため、これは代替手段ではありませんでした。
ダニエル

22

この方法で言えば、Ansibleに固有の利点がある場合でも、使い慣れたツール(この場合はシェルスクリプト)を使用する利点を上回る必要があります。私はそれに対する明確な答えがあるとは思わない。

チームがシェルでAnsibleが提供するものを達成できる場合:

  1. 宣言的でべき等の構成管理
  2. 業界で人気のあるサービスのための再利用可能なスニペット(つまり、プレイブック)へのアクセス。
  3. 再試行、ローリングロジックなどによるリモート実行の信頼性の高い管理

その後、彼らはおそらく彼らが知っていることに固執することができます。

結局のところ、BASHで「ガード」を実装できます。さまざまなサーバー構成タスクを解決するためのBASHの既存の多くの作業を見つけることができます(基本的には、Dockerfileの90%がbashインストールコードです)。Ansible / Salt / Chef-Zeroが提供するものにかなり近づくことができます。実際に既存のソリューション全体をこれらのツールに移植する必要はありません。

NIH(ここでは発明されていません)の傾向と、より堅牢なソリューションを支持する確立された適切なスクリプトを捨てるというバランスの取れた行為です。

念頭に置いておく必要がある最後の考慮事項は、チームにさらに多くの人を採用しようとすると、テクノロジースタックがどのように評価されるかです。Ansibleの経験を持つ人を見つけるのは、特定の自家製スクリプトCMツールの経験がある人を見つけるよりもはるかに簡単です。これは厳密に技術的な考慮事項ではなく、文化的な考慮事項です。独自のAnsibleを発明する奇妙な組織になりたいですか、それとも仕事に適したツールを見つける合理的な組織になりたいですか?これらの決定は、才能を引き出す能力に影響します。


4
あなたの答えが気に入りました。また、bashチームがi等性、実行管理、および再利用を目的としており、基本的に独自の構成管理フレームワークを作成する場合、コストがかかり、社内プロジェクトにとっては非常に厄介なものになる可能性があることも言及します。
ᴳᵁᴵᴰᴼ

また、特に利用可能な経験を天びんに置いて、あなたの答えを購読します。私は2つの小さな批評家がいます:1つ はdem 等性ですこれはもちろん構成システムの重要な側面ですが、Ansible Playbookで可能なシェルコマンドを使用することができるため、システムはせいぜいi等性を使用するように誘導することができます。(実際には、べき等性aba = abよりも強力なものが必要です。)次に、インスタンスイメージを使用して不変のサーバーパターンを実装する場合など、いくつかの重要なケースでリモート実行の信頼性のある管理が完全に無関係になる場合があります。
マイケルルバルビエグリューネ

13

上記の答えはその一部をカバーしていますが、重要な要素の1つである収束設計を逃しています。少し前にhttps://coderanger.net/thinking/でChefのコンテキストでこれについていくつかの言葉を書きましたが、短いバージョンはbashスクリプトは一連の指示であり、Ansibleプレイブック(またはChefレシピ、Salt状態など)は、目的の状態の説明です。そこに到達するために必要な手順ではなく、必要な状態を文書化することで、より多くの開始状態に対処できます。これは、かなり前にCFEngineで概説されたPromise Theoryの中心であり、私たち(構成管理ツール)がすべてコピーしてからの設計です。

tl; dr Ansibleコードはあなたが望むことを示し、bashコードは物事を行う方法を示します。


2
誰かがそれについて学びたいなら、本や記事のような「約束の理論」への参照やその他の貴重な資料を追加できますか?
エフゲニー

1
それは、i等のbashコードを書くことができると言ったとき、私がほのめかしたことです(つまり、任意のポイントで開始し、複数回実行し、目的の状態に収束できます)。しかし、あなたの答えはそれをより明確にしました。
アサフラビー

ええ、i等は収束システムの重要な特性ですが、2つは常に直接リンクしているわけではありません:)約束の理論の資料に関しては、マーク・バージェス(CFEngineの作成者)にはいくつかの本があり、私が戻ったときにリンクを見つけることができますラップトップ。
-coderanger


3

リモートホストでansibleプレイブックを実行する際の問題が少なくなることに注意してください。それがansibleを実行する主な理由です。シェルスクリプトを使用している場合でも、リモートホストへのscp'ingのスクリプトを作成する方法が必要です。


この意味で、Ansibleはsshの単なるラッパーではありませんか?
エフゲニー

基本的にははい。sshを実行し、Pythonスクリプトをリモートでコピーして実行します。つまり、あなたのansibleモジュールがいくつかのpythonライブラリに依存している場合、このライブラリは状況によってはリモートマシン上に存在する必要があるということです。
アサフラビー

1
また、sshの設定を台無しにすると、マシンからロックアウトされます。これは、プッシュとプルの通常の欠点です。
テンシバイ

1

それは2019年であり、私はほんの数日を賢明な学習曲線に費やしました、そしてここに絶対的な真実があります:Ansibleはトラブルの価値がない。

それは終了しておらず、Windows上では実行されず、YAMLの設定と誤解を招くエラーメッセージの組み合わせが目を出血させます。それはほとんど故意にひどいようで、私はそれを真剣に意味します。それは明らかに、redhat sysadminsのフラストレーションのある開発者側プロジェクトの成果です。おそらくヒップスター。

プロビジョニング以外の機能を必要とせず、特定の1つのOSでのみプロビジョニングする場合。残念なことに、まともなshell.scriptを書きます。

今のところ、プロジェクト全体は、初心者がRTFMに告げられ、なぜグラフィック設定を構成するためのGUIを書けないのかを尋ねたために馬鹿にされた初期のLinuxフォーラムを思い出させます。あなたはそれを取得しないのですか?あなたは窓に固執する必要があります...多分私は..幸せなVI-ing。

Dockerを使用します。何よりも。Dockerはとてつもなくシンプルで強力です。

しかし、既存のスズを絶対にプロビジョニングする必要がある場合はどうでしょうか?本当の選択肢は何ですか?

まあ...まだありません。しかし、私はあなたにこれを約束します、ansibleが良くならない限り、すぐにあります。ファンボーイがどれだけ力を入れても、それが失敗であることを許しても... 10分の5の努力だからです。

bashスクリプトをSCPで作成し、トラブルを回避します。


まず、Win_RMまたはSSHを介してWindowsで動作します。次に、yaml構文は非常に優れており、プログラムで生成できますが、一部のエラーは、例外中にJavaまたはPythonがガットを吐き出すことと誤解を招く可能性があります。第三に、単にスクリプトをサーバーにSCPするという概念は、非常に動的なクラウド環境では適用できません。どのサーバー?サーバーは毎日変わる可能性があります。Ansibleを使用すると、簡単に構成可能なインベントリプラグインを使用して、サーバーをグループ化し、変数を割り当てることができます。Ansibleの価値はないと思います。私はあなたの環境にとってはやり過ぎだと思います。
レビ

@Leviはい。ansibleがWindowsで実行されず、スキーマを持たない設定があり、同じタスクを達成するための別の方法よりも学習曲線が長く、保守コストが高いという私のすべての欠点があります。
リチャード

クラウド環境の場合、学習曲線を正当化する可能性がある種類の大規模企業向けの他のアプローチがあります。ansibleの機能を理解しています。ニッチが見当たらない。
リチャード

ニッチは、複数のマシン用の使いやすい自動化フレームワークです。LinuxほどWindowsには適していません。msdosやネットウェアにとっても素晴らしいことではありません。それは2019年です、Windowsサーバーは最近の小さな役に立たないニッチです。
ダイアスニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.