【Ansible Tower/AWX】名前解決されない接続先をホスト名で指定する方法


この記事はプロモーションを含みます。

Ansible

ホーム > Ansible Tower・AWX リファレンス

名前解決出来ない接続先の場合、IPアドレスを指定しますが、AnsibleAWX・TowerでIPアドレスで接続先を指定するのは管理の面で不便です。今回は、名前解決出来ない場合でも、接続先をホスト名で指定する方法について解説します。

まずは、

 ・IPアドレスで指定した場合、どのような不都合が発生するの?
 ・名前解決出来ない接続先に接続しようとした場合、どうなるの?

について、説明したいと思います。

その後、接続先をホスト名で指定する方法について説明したいと思います。

接続先をIPアドレスで指定する場合の問題点

接続先をIPアドレスで指定する場合の問題は2点あるので、それぞれ説明します。

AWXでホスト一覧で接続先が判断し辛い

AnsibleAWX(Tower)のWEB画面で、ホストの一覧を表示させると、以下のように表示されます。

各ホストの説明が設定されている場合は問題無いですが、設定されていない場合は、IPアドレスのみで接続先を判断する必要があります。
接続先ホストが少ない場合は問題無いかもしれませんが、数百台もIPアドレスのみで接続先の機器を判断するのは事故の元になりますよね。

説明欄に接続先の機器情報を記載することで回避することは可能ですが、こちらも機器の数が多くなると手間も増えます。(手間でも記載しておく方が良いとは思いますが。。)
以上より、問題の1つとして挙げてみました。

ジョブの実行結果における接続先情報がIPアドレスのみ

Ansibleでジョブを実行した際、以下のような結果が表示されます。

Using /etc/ansible/ansible.cfg as config file
SSH password: 
PLAY [all] *********************************************************************
TASK [ディレクトリのコピー] **************************************************************
changed: [192.168.56.105] => {"changed": true, "checksum": null, "dest": "/home/release2/test_dir_01", "gid": 1000, "group": "awx", "md5sum": null, "mode": "0777", "owner": "awx", "size": 30, "src": "/home/release/test_dir_01", "state": "directory", "uid": 1000}
PLAY RECAP *********************************************************************
192.168.56.105             : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

実行結果の5行目や7行目を見てみると、接続先がIPアドレスで表示されています。
こちらも先ほどの問題と同様に接続先の機器数が増えると、IPアドレスだけでは判断出来ませんよね。

これらが、接続先をIPアドレスで指定した場合の問題点になります。

名前解決出来ない接続先を指定した場合のエラー

接続先をIPアドレスで指定した場合の問題点を挙げました。
では、接続先をホスト名で指定すればいいのでは?と思いますよね。
DNSサーバーなどが構築されており、名前解決されている場合は問題無いのですが、名前解決されていない場合は、ホスト名とIPアドレスを紐付けることが出来ません。
その場合に表示されるエラーを確認してみたいと思います。

Using /etc/ansible/ansible.cfg as config file
SSH password: 

PLAY [all] *********************************************************************

TASK [ディレクトリのコピー] **************************************************************
fatal: [SYUTAKUPDB01]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname syutakupdb01: Name or service not known", "unreachable": true}

PLAY RECAP *********************************************************************
SYUTAKUPDB01               : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0

下記はエラー部分を抜粋したものです。
エラー情報として出力されている「UNREACHABLE」は、機器への接続に失敗したというものです。

fatal: [SYUTAKUPDB01]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname syutakupdb01: Name or service not known", "unreachable": true}

接続先をホスト名で指定する方法

では、本題の接続先をホスト名で指定する方法についてご説明します。

1つ目は、Linux OSで提供されているhostsファイルを使用する方法です。
これは、こちらの記事を参考にして頂ければと思います。

2つ目として、Ansible AWX(Tower)のみで名前解決する方法です。
どのように設定するか見ていきましょう。

まず、ホストの設定画面に移動します。
メインメニュー > インベントリー > 設定を行うインベントリー > ホスト > 設定を行うホスト です。

下記のように、ホストの変数に「ansible_ssh_host: ホストに対応したIPアドレス」を追加します。

設定は以上です。この状態でジョブを実行してみます。

名前解決後のジョブの実行

以下が、名前解決後のジョブの実行結果になります。

Using /etc/ansible/ansible.cfg as config file
SSH password: 

PLAY [all] *********************************************************************

TASK [ディレクトリのコピー] **************************************************************
ok: [SYUTAKUPDB01] => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3.6"}, "changed": false, "checksum": null, "dest": "/home/release2/test_dir_01", "gid": 1000, "group": "awx", "md5sum": null, "mode": "0777", "owner": "awx", "size": 30, "src": "/home/release/test_dir_01", "state": "directory", "uid": 1000}

PLAY RECAP *********************************************************************
SYUTAKUPDB01               : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

「unreachable=0」となり、接続に成功したことが分かります。
また、接続先の表示もIPアドレスではなく、ホスト名「SYUTAKUPDB01」で表示されるようになりました。

記事は以上です。名前解決出来ない状況でも変数「ansible_ssh_host」にIPアドレスを設定することで、こちらのIPアドレスが優先的に使用されます。
結局IPアドレスを設定していますが、ホスト名入力欄に直接入力した場合より、ログの出力情報が見やすくなると思います。
また、AWX(Tower)の画面上だけで設定可能で、手軽なのもいいですよね。是非使ってみて下さい。

コメント

タイトルとURLをコピーしました