Ansibleはそれほど単純ではありません

3台のサーバーがありますが、専門のシステム管理者ではありません。 これは、4つのデータベースと1ダースのアプリケーションにもかかわらず、バックアップがどこでも実行されていないことを意味します。サーバーで問題が発生すると、うるさくため息をつき、壁にプレートを投げて、2年前にEOLに到達しました。 更新させていただきますが、すべてをバックアップおよび再配置するために、おそらく1週間を割り当てる必要があります。 yum update



およびapt-get upgrade



を忘れるのは簡単です。



もちろん、これは間違っています。 私は長い間シェフとパペットを見てきましたが、それは私のすべての問題を解決すると思っていました。 しかし、私はおなじみのプロジェクトの構成を見て延期しました。 同じことを検討する必要があります、ルビーに対処するため、レビュー、妨害および制限に従って、多数に対処するために。 2週間前、George amarao記事は命を与えるキックになりました。 記事自体ではなく、構成管理システムの列挙です。 コメントと少しグーグルを読んだ後、私は決めた:私はアンシブルを取ります。 なぜならPython、そして誰も問題について文句を言わないからです。







それでは、私が最初になります。



最初に、公式Webサイトの無用のクイックスタートビデオから始めて、Ansibleのドキュメントとチュートリアルを多数掘り下げました。 もちろん、さまざまなタスクのために作成され、さまざまな人々によって書かれたものも多くありますが、共通点が1つあります。教科書は、Ansibleを既に理解している人々のために作られました。 球状のサーバーを真空で使用している人にとっては、役割、モジュール、およびタスクがあることを示唆するだけで十分です。 しかし、私はきれいなスレートを持って来て、見つけたすべての熊手を集めました。 この投稿が皆さんの回避に役立つことを願っています。



gitから自動的に更新されるアプリケーションなど、構成管理システムの奇跡が予想されました。 しかし、Ansibleは、新しいサーバーをセットアップするときにアクションのシーケンスを保持するための単なる方法であることが判明しました。 Ansibleでできるのは、コンソールから自分でできることだけです。 奇跡はありません。



スタート。 放浪者



タスク:ipを保存したいので、新しいホストを作成しません。 つまり、コントロールパネルで液滴をクリアし、Ansibleを使用して初期化します。 計画:プレイブックを作成し、Vagrantでデバッグします。



始めるのはとても難しいです。 すべてのAnsibleチュートリアルは、サーバーアドレスを登録する必要があるインベントリの説明から始まります。 しかし、この浮浪者にはどんなIPがありますか? 悪魔は彼を知っています。 Ansibleのドキュメントには、Vagrantでプレイブックを実行する方法に関する指示があります。 Vagrantのドキュメントには、Ansibleを接続するための手順が記載されていますが、まったく同じではありません。 その結果、私はipの検索で得点し、一般的なものを取りました:プレイブックを実行する最小限のVagrantfile







 Vagrant.configure(2) do |config| config.vm.box = "ubuntu/xenial64" config.vm.network "forwarded_port", guest: 80, host: 8080 #    ,  : config.ssh.insert_key = false config.vm.provision "ansible" do |ansible| ansible.verbose = "v" ansible.playbook = "playbook.yml" end end
      
      





私はプレイブックの草案をスケッチし、 vagrant up



役割を作成し、 vagrant up



を立ち上げvagrant up



。 離陸しませんでした。 公式のxenialイメージはVirtualBox専用であり、Fedora Linuxでは仮想化はlibvirt経由です。 私は長い間正しいコマンドを思い出しました: vagrant up --provider virtualbox



。 次に、構文エラーがyamlで修正されました(最初に必須のハイフンが3つあるのはなぜですか?)。 Ansibleを再起動するためのボックスを起動した後、Vagrant Provisionを記述することに注意してください。



そして最初の驚き:Ubuntu 16.04ボックスにはデフォルトでpythonはありません! パッケージマネージャがpythonで記述されているFedoraのワイルドネス。 私が見つけたように、Ansibleはそのモジュールをサーバーにアップロードし、そこで実行します。 StackOverflowに移動し、魔法のタスクを見つけます(より正確には、1つのタスクの10のバリエーションであり、最適な方法は不明です)。



 - name: Install python for Ansible become: yes raw: test -e /usr/bin/python || (apt -qy update && apt install -y python-minimal) register: output changed_when: output.stdout
      
      





スーパーユーザーになろう!



ドキュメントと例でさえ、多くは明確ではありません。 たとえば、Vagrantがremote_user



再定義する理由や、各ボックスに独自のスーパーユーザーがあることが判明した理由はわかりません。 rootのみが存在するクリーンサーバーでプレイブックを実行し、スーパーユーザーを作成する必要があります。 しかし、明らかに、これはクリーンなサーバー上とは異なる方法で、浮浪者の下で行う必要があります。 一般に、明確ではありません。ステージング用と制作用の2つのプレイブックがありますか?



またはここでbecome



become_user



become



なりbecome_user



。一方は他方を意味しません。 サーバーを構成するためにルートを常時オンにする必要がある場合、これらのどれをルートプレイブックで指定する必要がありますか? 最初に、 become: yes



を置き、2番目のタスクごとbecome: yes



become_user: root



を書きbecome_user: root



。 その後、 become_user



なしbecome_user



すべてがルートからbecome_user



することがbecome_user



ました! ルートはデフォルト値であり、実際、私は最初からsudo -i



を手放すことなく作成しました。



ここのどこかで、長い間ラップトップのシステムを更新していなかったことを思い出し、 dnf update



を起動しdnf update



。 プレイブックで入浴を続けます。 Vagrantは機能し、次のタブのdnfはVirtualBoxを更新しました。 次のvagrant provision



言ったので、これは必要ではないようです:「すべてが壊れて、私は責任を負わない」。 彼にはVirtualBoxがなく、「 起動時に予期せず終了コード1(0x1)で終了します 」-少なくともクラックします。 vboxheadless -h



コマンド(私は実際のdevoopではないので、グーグルで検索しました)はエラー-1912を示しました。 インターネットでは、誰もが1つとして答えます。VirtualBoxを再インストールします。 そこに性交、助けにはならない。 必死に、libvirtのxenialボックスを見つけて切り替えました。 選択肢がある場合に適しています。



いくつかの例からたくさんのパラメーターを使用してapt呼び出しタスクをコピーし、 update_cache=yes



を別のタスクとして実行するとよいことがわかりました。 そして、このタスク、この問題は、常に「変更」を返します。 1時間に1回以下の頻度で更新を確認するために、 cache_valid_time=3600



を設定する必要があることが判明しました。 最初は86400(日)と書くつもりでしたが、王冠でAnsibleに電話するつもりはありませんが、月に一度-彼を生かしてください。



データベースを拡張しましょう



PostgreSQLのインストール-コンソールの5行またはAnsibleの叙事詩全体。 ある時点で、 become_user: postgres



を実行する必要があります。 そして、ボックスは奇妙なエラーを生成しました:「 非特権ユーザーになったときにAnsibleが作成する必要がある一時ファイルにアクセス許可を設定できませんでした 」。 Ansibleがサーバーにモジュールをロードし、そこで起動する方法を覚えていますか? さて、彼はそれらをrootまたは別のスーパーユーザーからダウンロードしますが、postgresユーザーはそれらにアクセスできません。 これは不運です。



StackOverflowが再び役立ちます。3つの方法があります。 その1つは、 ansible.cfg



を作成し、内部でpipelining=True



を記述することansible.cfg



(発生した他の問題を解決するために、一時的にpipelining=False



設定します)。 2番目の方法は、文字通り「それをしないでください」です。 3番目は最も単純ですacl



パッケージをインストールすると、すべてが魔法のように動作します。 むしろ、別の方法では機能しません。「 sudo:パスワードが必要です 」。 さて、問題は何ですか、ここからパスワードはどこから来ますか、私は鍵を手に入れますか?



結局のところ、私はユーザーの浮浪者によって、キーなしで仮想マシンに入ります。 これは私たちの前で、私たちのために作られました。 become_user



でAnsibleは明らかにsudo -u postgres



を実行し、ユーザーbecome_user



のパスワードが必要です。 パスワードはありません。



私はオプションを整理し始めています。 become_method: su



サーバーがパスワードを要求するためにbecome_method: su



クラッシュしますが、Ansibleはこれを理解していません。 sudo su postgres



はパスワードを要求しないので、彼がそこで行うことは理解できません。 ファイル/etc/sudoers.d/vagrant



は、「 /etc/sudoers.d/vagrant



vagrant ALL=(ALL) ...



/etc/sudoers.d/vagrant



書き込むオプションがあります。括弧内の単語を使用すると、パスワードなしでsudo -u



を実行できるためです。 しかし、その後、プレイブックはVagrantのために投獄され、私はまだ本でそれを実行する必要があります。 不正確。



絶望から私は完全に削除しようbecome



ます。 Postgresは予想通り実行されます: " ユーザーのpostgresのピア認証に失敗しました" "。 私はスチュワーデスを掘り出します。 新しい計画:法の世界のすべてを持っているユーザーzverikの下で役割を開始します。 プレイブックを2つに分割しました。最初のpythonをインストールしてユーザーを作成し、2番目はremote_user: zverik



他のすべてを設定および構成します。 私はそれを始めています。 また、「 sudo:パスワードが必要です 」。 なんで? はい、Vagrantはremote_user



値を渡し、変更することを許可しません。 いまいましい。



逃げるために、私はテキストエディタを開き、これらのメモを書き始めました。 この時点で、私はAnsibleで1週間半から2時間働いており、postgresでデータベースを作成していませんでした。 教科書では、それはすべてとてもシンプルに見えます...私はFirefoxのAnsibleに関連するタブを数えました:48個。 48。 合計の約6分の1。



次に、Vagrantfileでansible.force_remote_userを無効にし、プロビジョニングを再開しました。 やったー、新しい間違い! ユーザーログインzverikは証明書に対してのみ機能することを思い出してください。 しかし、私は証明書を持っているので、 vagrant ssh -p



機能し、パスワードなしでログインします。 ソリューションをansible.cfg



証明書へのパスを指定する必要があります。 remote_user



と同じ理由で機能しませんremote_user



勝ちます。 今回はメイン変数をオーバーライドするのが簡単です:プレイブックに追加します“ ansible_ssh_private_key_file: "{{ lookup('env', 'HOME') }}/.ssh/id_rsa"



"そしてそれは動作します! あまりうまくいきませんでしたが、乾杯!



ユーザーを見つけた後、役割のつづりは時計仕掛けのようになりました。 6つのタスク、60のタスクの1つの役割が既に用意されています。 しかし、教科書に書かれているよりも始めるのは難しいです。



便利なもの



プレイブックを書くとき、たくさんの便利な小さなものを見つけたり、グーグルで検索したりします。 ドキュメントに記載されているものもあれば、記事に記載されているものもあります(ハブで「Ansible」を探してください)。 それらのいくつかを以下に示します。



コマンドを実行するには、 command



またはshell



モジュールのみ。 ドキュメンテーションが書いているように、後者は極端な場合のみであるため、出力と&&



リダイレクトを忘れてください。 結果は常に「変更」されますが、これは悪いことです。 changed_when



パラメーター(より便利なことにargs



ブロックで、 chdir



とともに)、またはregister



およびchanged_when



結果を制御します。 実行前に条件を確認すると便利です。最初の偵察command + register + changed_when: False



で、コマンドを実行する必要があるかどうか保存されたstdoutをチェックするwhen



使用します。



command



モジュールへの呼び出しが少ないほど良い。 Google:ほとんど常にモジュールがあります。 たとえば、最初にcommand: npm install -g {{ item }}



から、 npm: name={{ item }} global=yes



npm: name={{ item }} global=yes



ことがわかりました。 構成を確認する必要がなく、作業の結果がstdout行になく、便利な構造になるため、モジュールは常にコマンドよりも優れています。



構成ファイルはほとんどの場合、 lineinfile



lineinfile



て修正できますlineinfile



、正規表現で行を検索し、別の行で置き換えます。 blockinfile



モジュールは、テキストブロック全体を追加します。 ニュアンスがあります:複数のタスクが1つのファイルに書き込まれている場合、 marker: # {mark} block name



を再定義する必要がありmarker: # {mark} block name



。 そうでなければ、誰もが他の人のブロックを圧倒します。



PostgreSQLテーブルを変更する前に、pg_tablesで状態を確認すると便利です。 例:



 command: psql -A -t -d {{ gisdb }} -c "SELECT tableowner FROM pg_tables WHERE schemaname = 'public' AND tablename = 'spatial_ref_sys'"
      
      





継承がすべてです。条件式とwith_items



、ほぼ同一の2つのタスクの代わりに作成できる場合は、そうします。 別のファイルで同様のパラメーターを持つ繰り返しタスクのグループを取り出し、 vars



include_role



を介して呼び出しinclude_role



。 役割のパラメーター化についてはまだあるはずですが、私はまだ学習中であり、1つの役割があります。



記事の1つで、車輪を再発明するのではなく、 Ansible Galaxyカタログで適切な役割を探すようにというアドバイスを見つけました。 確かに、php-fpmとpostfixは何千人もの人々をあなたの前に置き、便利なデフォルトを持つよく書かれた役割がしばしばあります。



一方、 apt: pkg=apache2



が私のすべての問題を解決するとき、 geerlingguy.apache



の役割を演じるポイントは何ですか? または、ここで、ソースからosm2pgsqlをインストールする役割を見つけました。2014年には、古いsudo: yes



使用していsudo: yes



。 つまり、もちろん、 roles_path = roles.galaxy:roles



を作成し、すべてのロールをインストールするためのプレイブックを作成しましたが、今のところ設定するものはありません。 これは次のようなものです。



 - hosts: localhost vars: galaxy_path: roles.galaxy tasks:   - name: Remove old galaxy roles     file: path={{ galaxy_path }} state=absent   - name: Install Ansible Galaxy roles     local_action: command ansible-galaxy install -r requirements.yml --roles-path {{ galaxy_path }}
      
      





また、 requirements.yml



Galaxyの各ロールの行を記述しrequirements.yml







 - src: .
      
      





彼らはプレイブックを書き、最後までVagrantで機能しましたか? さて、箱をvagrant destroy



して再作成してください。 いくつかのジャムを絶対に見つけてください:忘れられたsudo、モードの欠落:実行可能ファイルの場合は0755、パッケージの欠落( dnf provides



ヘルプまたはインストールするapt-file



)。 最後に、最も重要なこと:2回目の実行後、 vagrant provision



を「変更:0」にする必要があります。



***



どのシステムを選択しても、サーバーを構成管理システムに転送することは困難です。 しかし、最初のレーキフィールドの後、プレイブックのプログラミングは主張しています。 主な目的は、燃え尽きないように目標を忘れないことです。ここで、ターゲットオペレーティングシステムUbuntu 16.04を入手し、1か月後にサーバーを難なく18.04に移行します。 そして、コンソールで単一のコマンドを使用して、完全に機能するサーバーをゼロから作成する喜びは、その過程で役立ちます。



All Articles