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

RHCE Ansibleシリーズ#2:アドホックコマンドの実行

Ansibleシリーズの最初のパートでは、Ansibleに精通し、インストールする方法を学びました。

このチュートリアルでは、Ansibleで静的インベントリを管理する方法を学習します。また、さまざまなAnsible構成設定についても理解できます。

さらに、いくつかのAnsibleモジュールを探索し、AnsibleAd-Hocコマンドを実行できるようになります。

すべてを見る前に、LHBProのすべてのメンバーに感謝します。このAnsibleシリーズは彼らのサポートがあれば可能です。まだプロメンバーでない場合は、サブスクリプションを選択することを検討してください。
Ansibleユーザーの作成

Ansibleでrootユーザーを使用してアドホックコマンドやプレイブックを実行することはできますが、rootユーザーにsshアクセスを許可することで発生する可能性のあるセキュリティリスクのため、これは絶対にお勧めできません。ベストプラクティスとは見なされません。

このため、すべてのホスト(制御ホストと管理対象ホスト)で(すべてのコマンドに対して)sudo権限を持つ専用のAnsibleユーザーを作成することをお勧めします。

AnsibleはSSHとPythonを使用して舞台裏ですべての汚い作業を行うため、Ansibleをインストールした後に実行する必要がある4つの手順は次のとおりです。

  1. すべてのホストで新しいユーザーを作成します。
  2. すべてのノードの新しいユーザーにsudo権限を付与します。
  3. コントロールノードで新しいユーザーのSSHキーを生成します。
  4. SSH公開鍵を管理対象ノードにコピーします。

それで、これ以上面倒なことはせずに、 elliotという名前の新しいユーザーを作成することから始めましょう。 すべてのホストで:

[[email protected] ~]# useradd -m elliot
[[email protected] ~]# useradd -m elliot
[[email protected] ~]# useradd -m elliot
[[email protected] ~]# useradd -m elliot
[[email protected] ~]# useradd -m elliot

エリオットを設定した後 すべてのホストのパスワード。手順2に進むことができます。 エリオットを付与できます / etc / sudoers に次のエントリを追加することにより、パスワードなしのすべてのコマンドに対するsudo権限 ファイル:

[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers

次に、ユーザー elliotとしてログインします コントロールノードでsshキーペアを生成します:

[[email protected] ~]$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/elliot/.ssh/id_rsa):       
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/elliot/.ssh/id_rsa.
Your public key has been saved in /home/elliot/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Xf5bKx0kkBCsCQ/7rc6Kv6CxCRTH2XJajbNvpzel+Ik [email protected]
The key's randomart image is:
+---[RSA 3072]----+
|        .oo .    |
|  . ooo  . o     |
| . = *=.o   o    |
|  o =.o+ . o . . |
| . . .. S . . o  |
|.     .. . . . . |
|.. .   oo.o   o o|
|. = o oo++.  . +.|
| + ..++Eoo.   o. |
+----[SHA256]-----+

最後に、エリオットをコピーできます ssh-copy-idを使用するすべての管理対象ホストへのパブリックsshキー 次のようにコマンドを実行します:

[[email protected] ~]$ ssh-copy-id node1
[[email protected] ~]$ ssh-copy-id node2
[[email protected] ~]$ ssh-copy-id node3
[[email protected] ~]$ ssh-copy-id node4

これで、パスワードの入力を求められることなく、すべての管理対象ノードにSSH接続できるようになります。 sshパスフレーズの入力のみが求められます(空のままにしない場合は、ハハ)。

Ansibleインベントリの構築

Ansibleインベントリファイルは、基本的に、サーバー、サーバーのグループ、またはAnsible(管理対象ノード)によって管理されるホストを参照するIPアドレスのリストを含むファイルです。

/ etc / ansible / hosts デフォルトのインベントリファイルです。次に、Ansibleで独自のインベントリファイルを作成する方法を説明します。

プロジェクトディレクトリの作成

/ etc / ansibleをいじりたくない ディレクトリ;すべてを/etc / ansibleに保持する必要があります そのままで、基本的に、インベントリファイルの作成、Ansibleプロジェクト構成ファイルの編集などの際の参照として使用します。

それでは、 / home / elliotという名前の新しいAnsibleプロジェクトディレクトリを作成しましょう。 名前付き演劇 これは、この時点から作成するすべてのAnsible関連のもの(プレイブック、インベントリファイル、ロールなど)を保存するために使用します:

[[email protected] ~]$ mkdir /home/elliot/plays

この時点から先に作成するものはすべて、コントロールノード上にあることに注意してください。

インベントリファイルの作成

/ home / elliot / Playsに変更します ディレクトリを作成し、 myhostsという名前のインベントリファイルを作成します すべての管理対象ノードのホスト名を追加して、次のようになります。

[[email protected] plays]$ cat myhosts 
node1
node2
node3
node4

これで、次のAnsibleコマンドを実行して、すべてを一覧表示できます。 myhostsのホスト インベントリファイル:

[[email protected] plays]$ ansible all -i myhosts --list-hosts
  hosts (4):
    node1
    node2
    node3
    node4

-i オプションを使用してmyhostsを指定しました インベントリファイル。 -iを省略した場合 オプションの場合、Ansibleは / etc / ansible / hostsでホストを検索します 代わりにインベントリファイル。

ここではホスト名を使用しており、Azureで作成したすべてのノード(vms)は同じサブネット上にあり、DNSはAzureによって処理されるため、DNSについて心配する必要はありません。

動作するDNSサーバーがない場合は、ノードのIPアドレス/ホスト名エントリを / etc / hostsに追加できます。 、以下に例を示します:

ホストグループとサブグループの作成

管理対象ホストをグループとサブグループに編成できます。たとえば、 myhostsを編集できます 2つのグループを作成するファイルテスト および製品 次のように:

[[email protected] plays]$ cat myhosts 
[test]
node1
node2

[prod]
node3
node4

製品でホストを一覧表示できます 次のコマンドを実行してグループ化します:

[[email protected] plays]$ ansible prod -i myhosts --list-hosts
  hosts (2):
    node3
    node4

Ansibleには2つのデフォルトグループがあります:

  1. all-インベントリ内のすべてのホストが含まれます
  2. グループ化されていない-どのグループのメンバーでもないすべてのホストが含まれます(すべてを除く)。

架空のホストnode5を追加しましょう myhostsグループ化されていないを示すインベントリファイル グループ:

[[email protected] plays]$ cat myhosts 
node5

[test]
node1
node2

[prod]
node3
node4

node5を追加したことに注意してください myhosts の最初(最後ではない)まで それ以外の場合は、 prodのメンバーと見なされます。 グループ。

これで、次のコマンドを実行して、すべてのグループ化されていないを一覧表示できます。 ホスト:

[[email protected] plays]$ ansible ungrouped -i myhosts --list-hosts
  hosts (1):
    node5

サブグループ(子)を含むグループ(親)を作成することもできます。次の例を見てください:

[[email protected] plays]$ cat myhosts 
[web_dev]
node1

[web_prod]
node2

[db_dev]
node3

[db_prod]
node4

[development:children]
web_dev
db_dev

[production:children]
web_prod
db_prod 

開発 グループには、 web_devにあるすべてのホストが含まれます さらに、 db_devにあるすべてのメンバー 。同様に、本番 グループには、 web_prodにあるすべてのホストが含まれます さらに、db_prod。に含まれるすべてのメンバー

[[email protected] plays]$ ansible development -i myhosts --list-hosts
  hosts (2):
    node1
    node3

[[email protected] plays]$ ansible production -i myhosts --list-hosts
  hosts (2):
    node2
    node4
Ansibleの構成

このセクションでは、最も重要なAnsible構成設定について学習します。シリーズ全体を通して、必要に応じて他の構成設定について説明します。

/etc/ansible/ansible.cfg デフォルトの構成ファイルです。ただし、 /etc/ansible/ansible.cfgを台無しにしないこともお勧めします 参照として使用してください。 Ansibleプロジェクトディレクトリに独自のAnsible構成ファイルを作成する必要があります。

ansible --version コマンドは、現在使用している構成ファイルを表示します:

[[email protected] plays]$ ansible --version
ansible 2.9.14
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/elliot/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Dec  5 2019, 15:45:45) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]

出力からわかるように、 /etc/ansible/ansible.cfg 独自のansible.cfgをまだ作成していないため、現在使用中です プロジェクトディレクトリ内のファイル。

/etc/ansible/ansible.cfg さまざまなAnsible構成設定とセクションの全体が含まれています:

[[email protected] plays]$ wc -l /etc/ansible/ansible.cfg 
490 /etc/ansible/ansible.cfg

Ansible構成ファイルで定義する必要がある2つの最も重要なセクションは次のとおりです。

  1. [デフォルト]
  2. [privilege_escalation]

[デフォルト] セクションでは、知っておく必要のある最も重要な設定を次に示します。

  • 在庫- インベントリファイルのパスを指定します。
  • remote_user- 管理対象ホストに接続してプレイブックを実行するユーザーを指定します。
  • フォーク- Ansibleが並行して管理/処理できるホストの数を指定します。デフォルトは5です。
  • host_key_checking- SSHキーホストチェックをオン/オフにするかどうかを指定します。デフォルトはTrueです。

[privilege_escalation] セクションでは、次の設定を構成できます。

  • になる- 特権の昇格を許可/禁止する場所を指定します。デフォルトはFalseです。
  • become_method- 特権昇格方法を指定します。デフォルトはsudoです。
  • become_user- 特権昇格によって取得するユーザーを指定します。デフォルトはrootです。
  • become_ask_pass- 特権昇格パスワードを要求するかどうかを指定します。デフォルトはFalseです。

これらの設定をメモリにコミットする必要はないことに注意してください。それらはすべて/etc/ansible/ansible.cfgに文書化されています 。

次に、独自の ansible.cfgを作成します Ansibleプロジェクトディレクトリの構成ファイル/home / elliot / Plays 次の設定を行います:

次に、 ansible --versionを実行します もう一度コマンドします。新しい構成ファイルが有効になっていることを確認する必要があります:

[[email protected] plays]$ ansible --version
ansible 2.9.14
  config file = /home/elliot/plays/ansible.cfg
  configured module search path = ['/home/elliot/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Dec  5 2019, 15:45:45) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
Ansibleでのアドホックコマンドの実行

この時点までは、Ansibleのインストール、セットアップ、構成を行っているだけです。 これで、本当の楽しみが始まります!

Ansibleアドホックコマンドは、1つ以上の管理対象ノードで単一のタスクを実行するために使用できる優れたツールです。一般的なAnsibleアドホックコマンドは、一般的な構文に従います。

ansible host_pattern -m module_name -a "module_options"

Ansibleアドホックコマンドがどのように機能するかを理解する最も簡単な方法は、単にコマンドを実行することです!したがって、先に進んで、次のアドホックコマンドを実行します。

[[email protected] plays]$ ansible node1 -m command -a "uptime"
Enter passphrase for key '/home/elliot/.ssh/id_rsa':
node1 | CHANGED | rc=0 >>
18:53:01 up 5 days, 18:03,  1 user,  load average: 0.00, 0.01, 0.00

sshキーのパスフレーズを入力するように求められた後、node1の稼働時間が表示されました。次に、下の図を確認して、実行したアドホックコマンドの各要素を理解してください。

あなたはおそらく今までにそれを推測したでしょう。 ansibleモジュール Ansible APIで使用できる再利用可能なスタンドアロンスクリプトです 、または ansible またはansible - プレイブック プログラム。

コマンドモジュールは、Ansibleが提供しなければならない多くのモジュールの1つです。 ansible-doc -lを実行できます 利用可能なすべてのAnsibleモジュールを一覧表示するコマンド:

[[email protected] plays]$ ansible-doc -l | wc -l
3387

現在、3387のAnsibleモジュールが利用可能であり、それらは日ごとに増加しています!オプションとして実行したい任意のコマンド方法をAnsibleコマンドモジュールに渡すことができます。

空のsshキーパスフレーズがない場合(私のように)。次に、 ssh-agentを実行する必要があります 毎回パスフレーズの入力を求められるという不必要な頭痛の種を避けるために、Ansibleは管理対象ノードにアクセスしようとします:

[[email protected] plays]$ eval `ssh-agent`
Agent pid 218750
[[email protected] plays]$ ssh-add
Enter passphrase for /home/elliot/.ssh/id_rsa: 
Identity added: /home/elliot/.ssh/id_rsa ([email protected])
接続のテスト

より深刻なタスクに入る前に、Ansibleがすべての管理対象ノードに接続できるかどうかをテストすることをお勧めします。このために、 pingを使用できます モジュールを作成し、すべての管理対象ホストを次のように指定します。

[[email protected] plays]$ ansible all -m ping 
node4 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
node3 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
node1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
node2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

あなたが出力のすべての成功で見ることができるように。 Ansibleのpingに注意してください モジュールにはオプションは必要ありません。 Linuxコマンドの場合と同様に、一部のAnsibleモジュールにはオプションが必要ですが、必要ないものもあります。

Ansibleモジュールのドキュメント

誰かがAnsibleについてあなたが一番好きなことを私に尋ねたら;すぐにそれはドキュメントだと思います。 Ansibleは非常によく文書化されており、すべて自分の端末の快適さから生まれています。

特定のAnsibleモジュールの使用方法が必要な場合は、 ansible-docを実行できます。 モジュール名が続きます。

たとえば、 pingの説明を表示できます モジュールと実行による使用方法:

[[email protected] plays]$ ansible-doc ping

これにより、 pingが開きます モジュールドキュメントページ:

モジュールのドキュメントを読むときは、特に注意して、オプションの前に等号(=)が付いているかどうかを確認してください。この場合、これは必須のオプションであり、含める必要があります。

また、一番下までスクロールすると、アドホックコマンドまたはAnsibleプレイブック(後で説明します)を実行する方法の例をいくつか見ることができます。

コマンドvs.シェルvs.生モジュール

人々がしばしば互いに混同する3つのAnsibleモジュールがあります。これらは次のとおりです:

  1. コマンド
  2. シェル

これらの3つのモジュールは同じ目的を達成します。管理対象ノードでコマンドを実行します。ただし、3つのモジュールを分ける重要な違いがあります。

コマンドで配管やリダイレクトを使用することはできません モジュール。たとえば、次のアドホックコマンドはエラーになります:

[[email protected] plays]$ ansible node2 -m command -a "lscpu | head -n 5"
node2 | FAILED | rc=1 >>
lscpu: invalid option -- 'n'
Try 'lscpu --help' for more information.non-zero return code

これは、コマンド モジュールはパイプまたはリダイレクトをサポートしていません。パイプまたはリダイレクトを使用する場合は、代わりにシェルモジュールを使用できます。同じコマンドをもう一度実行しますが、今回はシェルを使用します 代わりにモジュール:

[[email protected] plays]$ ansible node2 -m shell -a "lscpu | head -n 5"
node2 | CHANGED | rc=0 >>
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              1
On-line CPU(s) list: 0

チャームのように機能します!ノード2に出力されたlscpuコマンドの最初の5行が正常に表示されました。

Ansibleは、SSHおよびPythonスクリプトを舞台裏で使用して、すべての魔法を実行します。さて、 モジュールはSSHを使用し、Ansibleモジュールサブシステムをバイパスします。このように、Pythonが(管理対象ノードに)インストールされていない場合でも、そのrawモジュールは管理対象ノードで正常に機能します。

node4でPythonバイナリを改ざんしたので(自分で行わないでください)、シェルを実行した場合に何が起こるかを模倣できます。 またはコマンド Pythonがインストールされていないノードのモジュール:

[email protected]:/usr/bin# mkdir hide
[email protected]:/usr/bin# mv python* hide/

ここで、シェルを使用してAnsibleをアドホックで実行するとどうなるかを確認します。 またはコマンド node4をターゲットとするモジュール:

[[email protected] plays]$ ansible node4 -m shell -a "whoami"
node4 | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "module_stderr": "Shared connection to node4 closed.\r\n",
    "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n",
}
[[email protected] plays]$ ansible node4 -m command -a "cat /etc/os-release"
node4 | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "module_stderr": "Shared connection to node4 closed.\r\n",
    "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n",
    "msg": "The module failed to execute correctly, you probably need to set the interpreter.\nSee stdout/stderr for the exact error",
    "rc": 127
}

エラーが発生します!今、私は同じタスクを達成しようとします。今回はを使用します モジュール:

[[email protected] plays]$ ansible node4 -m raw -a "cat /etc/os-release"
node4 | CHANGED | rc=0 >>
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
Shared connection to node4 closed.

ご覧のとおり、3つのモジュールのうち、タスクを正常に実行したのはrawモジュールだけでした。ここで、node4で行った混乱を修正します。

[email protected]:/usr/bin/hide# mv * ..

3つのモジュールのさまざまなユースケースを要約するために、以下の表を作成しました。

説明 コマンド シェル
簡単なコマンドを実行する はい はい はい
リダイレクトを使用してコマンドを実行する いいえ はい はい
Pythonなしでコマンドを実行する いいえ いいえ はい

大丈夫!これで、2番目のAnsibleチュートリアルは終了です。

Ansibleプレイブックを作成して実行する方法を学習するので、次のチュートリアルにご期待ください。メンバーになることを忘れないでください:)


Linux
  1. RHCE Ansibleシリーズ#8:AnsibleVaultを使用したコンテンツの暗号化

  2. RHCE Ansibleシリーズ#7:Jinja2テンプレート

  3. RHCE Ansibleシリーズ#6:Ansibleでの意思決定

  1. RHCE Ansibleシリーズ#5:Ansibleループ

  2. RHCE Ansibleシリーズ#4:Ansible変数、ファクト、レジスタ

  3. RHCE Ansibleシリーズ#11:Ansibleを使用したシステムの管理

  1. RHCE Ansibleシリーズ#10:RHELシステムの役割

  2. RHCE Ansibleシリーズ#9:Ansibleの役割

  3. WINEで実行中のプログラムからシェルコマンドを実行