GNU/Linux >> Linux の 問題 >  >> Linux

Ansibleを使用して自宅で更新を自動化する方法

自宅では、24時間年中無休で稼働するITデバイスをいくつか所有しています。それらを最新の状態に保ち、更新を自動的にインストールするために、私は仕事をAnsibleに任せています。 Ansibleをまったく初めて使用する場合は、次の場所で優れた紹介を見つけることができます:

  • Ansible入門
  • Linuxシステム管理者向けのAnsibleの謎を解き明かす
  • AnsibleforLinuxシステム管理者向けクイックスタートガイド

私のホームネットワークには次のデバイスが含まれています:

  • RaspbianOSを実行している2つのRaspberryPi
  • Debian10バスターを実行している私のKVMホスト
  • 2つのRHEL8ホスト
  • Synology DS213air
  • 分離されたネットワーク上の4つのRHELホスト

赤い四角でマークされたホストは私のAnsibleコントロールノードです。その仕事は私のLinux環境を更新することです。このホストは環境内の他のすべてのホストに到達できるため、これを選択しました。 Red Hat Enterprise Linux 7(RHEL)-Ansibleホストなどの他のホストは、分離されたネットワーク内のホストにのみ到達できます。

[次のこともお勧めします:AnsiblePlaybookの作成方法]

前提条件

すべてのホストに、sudoを使用できるユーザーアカウントがあります root権限でコマンドを実行します。便宜上、SSHキーペアを作成し、Ansibleを使用して更新するホストにSSH公開キーを配布しました。 SSHキーの生成についてサポートが必要な場合は、TylerCarriganによるLinuxでのssh-keygenの使用とキーベースの認証の共有を確認してください。

ホストを使用するにはRHEL8-Squid Ansibleコントロールノードとして、Ansibleを提供するリポジトリを有効にしてインストールする必要があります:

$ sudo subscription-manager repos --enable=ansible-2.9-for-rhel-8-x86_64-rpms
$ sudo dnf -y install ansible

その他のディストリビューションについては、公式ドキュメントをご覧ください。

Ansibleのデフォルト設定ファイルは/etc/ansible/ansible.cfgにあります。 。このファイルはRPMパッケージによって出荷および制御されるため、~/.ansible.cfgにカスタム構成ファイルを作成するのが好きです。 オリジナルをコピーして編集するだけです。変更を加えたのはほんのわずかです:

$ egrep -v "^$|^#|^\[" ~/.ansible.cfg
inventory      = ~/ansible/hosts
private_key_file = /home/user/.ssh/ansible_id_rsa

ご覧のとおり、ansibleを作成しました HOMEのディレクトリ ホストインベントリファイルを保存するディレクトリ。また、Ansibleがネットワーク上のノードに接続するために使用するSSH秘密鍵へのパスも指定しました。

この構成では、すべての魔法は私のHOMEから制御されます ディレクトリであり、次のジョブを実行するためにAnsibleコントロールノードに対するroot権限は必要ありません。

静的インベントリファイルを作成する

このユースケースでは、FQDNを使用してホストを~/ansible/hostsに配置することにより、静的インベントリファイルを使用します。 ファイル。

[special]
localhost
tower-pc.lan

[yum]
rhel7-ansible.private1
rhel7-t1.private1
rhel8-t1.private1
rpm-repo-r8.private1
podhost-r8-1.lan

[apt]
raspi-sht21.lan
pi-hole.lan

[ipkg]
diskstation.lan

ご覧のとおり、ネットワーク上のホストを、使用するパッケージマネージャーごとにグループ化しました。これは、プレイブックを作成して更新するときに便利です。グループ[特別] Ansibleコントロールノード自体と、Ansibleコントロールノードが実行されるKVMハイパーバイザーが含まれています。

Ansibleのインベントリの詳細については、「インベントリを作成する方法」を参照してください。

接続を確認する

ホストを更新するプレイブックを作成する前に、Ansibleコントロールノードが RHEL8-Squidであるかどうかを確認します。 次のアドホックコマンドを使用して、すべてのホストに接続できます。

$ ansible all -m ping -T 30
rhel7-t1.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
rhel7-ansible.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
rpm-repo-r8.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
rhel8-t1.private1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
podhost-r8-1.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: Platform linux on host tower-pc.lan is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
tower-pc.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: sftp transfer mechanism failed on [diskstation.lan]. Use
ANSIBLE_DEBUG=1 to see detailed information
[WARNING]: Platform linux on host diskstation.lan is using the discovered
Python interpreter at /usr/bin/python, but future installation of another
Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/
reference_appendices/interpreter_discovery.html for more information.
diskstation.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: Platform linux on host pi-hole.lan is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
pi-hole.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
[WARNING]: Platform linux on host raspi-sht21.lan is using the discovered
Python interpreter at /usr/bin/python, but future installation of another
Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/
reference_appendices/interpreter_discovery.html for more information.
raspi-sht21.lan | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

Ansible接続のデフォルトのタイムアウトは10秒です。私のSynologyDiskstation ほとんどの場合スタンバイモードで、オプション-Tを使用しています 30秒のタイムアウトを指定して、ウェイクアップする時間を与えます。

現時点では警告は気にならないので、プレイブックの作成に進みます。

アドホックコマンドについて詳しく知りたい場合は、公式ドキュメントのアドホックコマンドの概要をご覧ください。

プレイブック

私のプレイブックには3つの演劇が含まれています。各プレイは、[特別]を除いて、インベントリ内の特定のグループに属するホストでタスクを実行します 。この簡単な例では、各プレイはホストのグループに接続し、ホストを更新し、更新がインストールされた場合は後で再起動します。

更新がインストールされたかどうかを判断するために、登録したタスクの戻り値を格納する変数を登録します。これらを使用して、タスクのステータスが変更されているかどうかを確認します。そうである場合、システムは再起動されます。プレイブックは次のとおりです:

---
- hosts: yum
  tasks:
  - name: Update all installed packages using YUM module
    yum:
      name: '*'
      state: latest
      update_cache: yes
      update_only: yes
    register: yum_update_status

  - name: Remove packates not needed anymore
    yum:
      autoremove: yes

  - name: Reboot when packages were updated
    reboot:
    when: yum_update_status.changed

- hosts: apt
  tasks:
  - name: Update all installed packages using APT module
    apt:
      name: '*'
      state: latest
      update_cache: yes
      only_upgrade: yes
    register: apt_update_status

  - name: Remove packages not needed anymore
    apt:
      autoremove: yes

  - name: Reboot when packages were updated
    reboot:
      post_reboot_delay: 60
    when: apt_update_status.changed

- hosts: ipkg
  tasks:
  - name: Update the Packages installed on Diskstation
    command: /opt/bin/ipkg update && /opt/bin/ipkg upgrade

お気づきかもしれませんが、ディスクステーション 再起動されませんでした。これは、ユーザースペースツールのみが更新され、再起動する必要がないためです。 ディスクステーションで新しいOSバージョンが利用できる場合 、Ansibleモジュールがまだないため、手動で更新します。ホストのtower-pc.lanと同様の話です およびrhel8-squid.lan 。私はわざとこのプレイブックからそれらを除外しました。 AnsibleコントロールノードとKVMハイパーバイザーは、手動で更新するのに十分重要です。

最初のプレイブックの実行を見てみましょう:

$ ansible-playbook -T 30 -b --ask-become-pass pkg_update.yml
BECOME password:

PLAY [yum] **************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [podhost-r8-1.lan]
ok: [rhel7-t1.private1]
ok: [rhel8-t1.private1]
ok: [rpm-repo-r8.private1]
ok: [rhel7-ansible.private1]

TASK [Update all installed packages using YUM module] *******************************************************************************************
ok: [rhel8-t1.private1]
ok: [podhost-r8-1.lan]
ok: [rpm-repo-r8.private1]
ok: [rhel7-t1.private1]
ok: [rhel7-ansible.private1]

TASK [Remove packates not needed anymore] *******************************************************************************************************
ok: [rhel7-t1.private1]
ok: [rhel7-ansible.private1]
ok: [rhel8-t1.private1]
ok: [podhost-r8-1.lan]
ok: [rpm-repo-r8.private1]

TASK [Reboot when packages were updated] ********************************************************************************************************
skipping: [rhel7-ansible.private1]
skipping: [rhel7-t1.private1]
skipping: [rhel8-t1.private1]
skipping: [rpm-repo-r8.private1]
skipping: [podhost-r8-1.lan]

PLAY [apt] **************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [pi-hole.lan]
ok: [raspi-sht21.lan]

TASK [Update all installed packages using APT module] *******************************************************************************************
changed: [pi-hole.lan]
changed: [raspi-sht21.lan]

TASK [Remove packages not needed anymore] *******************************************************************************************************
ok: [pi-hole.lan]
ok: [raspi-sht21.lan]

TASK [Reboot when packages were updated] ********************************************************************************************************
changed: [pi-hole.lan]
changed: [raspi-sht21.lan]

PLAY [ipkg] *************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [diskstation.lan]

TASK [Update the Packages installed on Diskstation] *********************************************************************************************
changed: [diskstation.lan]

PLAY RECAP **************************************************************************************************************************************
diskstation.lan            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
pi-hole.lan                : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
podhost-r8-1.lan           : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
raspi-sht21.lan            : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
rhel7-ansible.private1     : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
rhel7-t1.private1          : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
rhel8-t1.private1          : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
rpm-repo-r8.private1       : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   

ご覧のとおり、私のRHELマシンはすでに最新のものでした。更新または削除するものがないため、再起動は必要ありません。一方、私のRaspberry Piにはアップデートがあり、インストールされていました。その後、両方のデバイスが再起動されました。 ディスクステーション ステータスが変更されました 、 それも。ただし、これはcommandを使用しているためです。 変更されたを返すモジュール ノード上の何かが変更されたかどうかに関係なく、実行するたびに。

[Red Hatの無料ガイド:ビジネスを自動化するための5つのステップ。 ]

まとめ

この記事では、Ansible自動化を使用してLinuxデバイスを自宅で最新の状態に保つ方法の簡単ですがあまり洗練されていない例を示しました。いくつかのAnsibleモジュールと簡単なコマンドを使用して、プレイブックのさまざまなプレイでインベントリのグループを使用する方法を示します。


Linux
  1. AnsiblePlaybookの作成方法

  2. OracleLinux8にAnsibleをインストールする方法

  3. Linux ユーザーのホーム ディレクトリのクリアとデフォルトへのリセットを自動化するにはどうすればよいですか?

  1. phpMyAdminで複数のホストを追加する方法

  2. strace はどのように使用する必要がありますか?

  3. リモートホストの OS バージョンを取得するために Ansible プレイブックを作成する方法

  1. Ansibleでファイルを作成する方法

  2. AnsiblePlaybookで変数を使用する方法

  3. Ansibleを使用してVimを設定する方法