サポートしているお客様のシステムと、自分のLinuxデバイスの更新プロセスを合理化することにしました。一連の複雑なスクリプトは長い間私に役立ってきましたが、このタスクにAnsibleを使用することの利点は、あまりにも多く、見逃すことはできません。
この一連の記事のパート1では、実際の更新プロセスについて説明し、プレイブックの構造を確立し、キーワードとコメントを提示しました。プレイブックには3つの演劇が含まれています。各プレイは、システムのカテゴリを管理します。 Play 1はAnsibleコントローラーデバイス(プライマリワークステーション)を処理し、Play2と3はサーバーと残りのワークステーションを管理します。
この2番目の記事は、2番目のプレイを調べることから始めましょう。
セカンドプレイ
これがセカンドプレイ全体です。このプレイの目的は、ファイアウォールとサーバーで更新を実行することです。
サーバー(および他のすべてのホスト)が更新されている間、ファイアウォールが稼働している必要があります。これにより、サーバーはインターネットにアクセスして更新パッケージをダウンロードできます。 DHCPおよびネームサービスを提供するためにファイアウォールおよびその他のホストが更新されている間、サーバーを実行する必要があります。これを実現するために、このプレイでは2つのホストを一度に1つずつ更新します。
これら2つのホストの名前は、 [all_servers]に含まれています。 /etc/ansible/hosts
のグループ インベントリファイル。
#######################################################################
#######################################################################
# Play 2 - Do servers
#######################################################################
#######################################################################
- name: Play 2 - Install updates for servers yorktown and wally
hosts: all_servers
serial: 1
remote_user: root
vars:
run: false
reboot: false
tasks:
#######################################################################
# Do some preliminary checking
#######################################################################
- name: Install the latest version of the doUpdates script
copy:
src: /root/ansible/Updates/files/doUpdates
dest: /usr/local/bin
mode: 0774
owner: root
group: root
- name: Check for currently available updates
command: doUpdates -c
register: check
- debug: var=check.stdout_lines
#######################################################################
# Do the updates.
#######################################################################
# Install all available updates
- name: Install all current updates
dnf:
name: "*"
state: latest
when: (check.stdout | regex_search('updates ARE available')) and run == "true"
- name: Update the man database
command: mandb
when: run
- name: Reboot if necessary and reboot extra variable is true
reboot:
when: (check.stdout | regex_search('reboot will be required')) and reboot == "true" and run == "true"
[次のこともお勧めします:AnsibleTowerの紹介]
この2回目のプレイ全体は、2行を除いて、最初のプレイとほぼ同じです。
シリアル :この追加のステートメントは、Ansibleに、一度に1つのホストで、つまり、並列ではなく直列でこの再生を実行するように指示します。 all_serversの場合 インベントリ内のグループに10台のサーバーが含まれている場合、このプレイが一度に2台のサーバーに対して実行されるように、2台などのより高い制限を使用できます。この場合、wally
が必要です 、ファイアウォール、yorktown
が稼働するようにする サーバーはインターネットにアクセスして、更新されたパッケージをダウンロードできます。両方が同時に実行されない限り、これら2つのホストがどちらのシーケンスで更新されるかは関係ありません。
再起動 :Ansibleには再起動機能が組み込まれているため、このプレイではLinuxのpoweroffコマンドの代わりにそれを使用できます。 Ansible再起動機能の重要な機能は、再起動が成功し、リモートホストが稼働しており、SSH通信が再び機能していることを確認することです。このデフォルトのタイムアウトは10分で、その後Ansibleはエラーをスローします。
3回目のプレイ
そして、これが3番目のプレイです。この再生により、ネットワーク上の残りのすべてのホストが更新されます。これらのホストの名前は、[ワークステーション]に含まれています。 /etc/ansible/hosts
のグループ インベントリファイル。
#######################################################################
#######################################################################
# Play 3 - Do all workstations except david
#######################################################################
#######################################################################
- name: Play 3 - Install updates for all workstations except david
hosts: workstations
strategy: free
remote_user: root
vars:
run: false
reboot: false
tasks:
#######################################################################
# Do some preliminary checking
#######################################################################
- name: Install the latest version of the doUpdates script
copy:
src: /root/ansible/Updates/files/doUpdates
dest: /usr/local/bin
mode: 0774
owner: root
group: root
- name: Check for currently available updates
command: doUpdates -c
register: check
- debug: var=check.stdout_lines
#######################################################################
# Do the updates.
#######################################################################
# Install all available updates
- name: Install all current updates
dnf:
name: "*"
state: latest
when: (check.stdout | regex_search('updates ARE available')) and run == "true"
- name: Reboot if necessary and reboot extra variable is true
reboot:
when: (check.stdout | regex_search('reboot will be required')) and reboot == "true" and run == "true"
このプレイブックには、ホストのリスト以外に1つだけ変更があります。
戦略 :無料 戦略は、Ansibleにこのプレイのタスクを自由に実行するように指示します。このプレイのタスクは、ホストが実行できるのと同じ速さで各ホストで実行されます。これは、一部のホストが、プレイブックの最初のタスクでさえ、他の遅いホストが完了する前に最後のタスクを完了する可能性があることを意味します。 STDOUTデータストリームを読むと、まるで自由に見えるかもしれません。
各戦略は個別のプラグインであり、このキーワードで使用できるプラグインは他にもいくつかあります。デフォルトは線形です 、次のタスクに進む前に、すべてのホストで各タスクを実行します。 host_pinned プラグインは、次のホストに移動する前に、各ホストでプレイ中のすべてのタスクを実行します。 デバッグ プラグインはタスクをインタラクティブに実行するため、プレイをデバッグできます。
プレイブックの実行
次のコマンドを使用してこのプレイブックを実行します:
# ansible-playbook -e "run=true reboot=true" doUpdates.yml
-e
オプションは「追加変数」を表します。ここでは、各プレイで定義された2つの変数の値を指定します。この場合、両方を trueに設定します 更新を実行し、必要に応じて再起動(電源オフ)を実行できるようにします。
STDOUT
は再現しません かなり長いので、ここのデータストリーム。
最終的な考え
ネットワークの詳細を反映するためにいくつかの変更を加えると、このプレイブックを使用して更新タスクを自動化できます。私と同じようなプレイブックを使用して更新を実行することは、Ansibleの使用を開始するための良い方法です。複雑なタスクを実行できるいくつかのキーワードを使用していますが、これは比較的単純なプレイブックです。パーソナルワークステーションを更新するための最初のプレイから始めましたが、残りはほとんどコピー/貼り付けでしたが、ホストのさまざまなグループのニーズに対応するためにいくつかの小さな変更が加えられました。
はい、これを行う他の方法があります。おそらく、3回のプレイではなく、1回または2回のプレイで条件文を使用してさまざまなタスクを使用できたはずです。または、条件とブロックを使用して、特定のホストを異なる方法で処理することもできます。個人的には、個々のプレイは、1つのプレイでタスクを処理する方法を変更しても、他のプレイに影響を与えないように、ロジックを十分に分離するのに役立つと思います。私の意見では、全体的なロジックが記述、理解、および管理が簡単であるため、この分離もよりエレガントです。
[Red Hatの無料ガイド:ビジネスを自動化するための5つのステップ。 ]
リソース
私が見つけた最も完全で有用なドキュメントは、AnsibleWebサイトのAnsibleユーザーガイドです。このドキュメントは参照用であり、ハウツーまたは入門用のドキュメントではありません。
Opensource.comは、Ansibleに関する多くの記事を何年にもわたって公開しており、それらのほとんどが私のニーズに非常に役立つことがわかりました。 Red Hat Enable Sysadmin Webサイトにも、有益であることがわかったAnsibleの記事がたくさんあります。
良いが簡潔なmanページもいくつかあります。