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に移行します。 そして、コンソールで単一のコマンドを使用して、完全に機能するサーバーをゼロから作成する喜びは、その過程で役立ちます。