質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

Q&A

解決済

1回答

3789閲覧

DHCPで設定したアドレスをAnsibleから静的に設定し直したい

sasaki0628

総合スコア106

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

0グッド

0クリップ

投稿2020/06/18 04:30

DHCPサーバーを利用してWindowsのターゲットノードに 168.200.100.50 のIPアドレスを動的に設定しています。
Ansibleのプレイブック実行により 168.200.100.50 を静的に設定し直す方法があれば教えて頂きたいです。
(NICはひとつしかありません。)

変数定義ファイルには

ipaddr: 168.200.100.50
netmask: 255.255.255.0
prefix: 24
gateway: 168.200.100.254

が書かれており、この変数を利用することができます。

動的に設定したアドレスを削除し、静的にアドレスを設定する以下のタスクを試したのですが、
やはり途中で疎通が取れなくなることが問題で、エラーになりました。

- name: setup: - name: win_shell: | Remove-NetIPAddress -IPAddress "{{ ansible_ip_addresses[0] }}" -AddressFamily "IPv4" -Confirm:$false route delete 0.0.0.0 {{ gateway }} New-NetIPAddress -InterfaceAlias "イーサネット" -IPAddress "{{ ipaddr }}" -PrefixLength {{ prefix }} -AddressFamily "IPv4" -DefaultGateway "{{ gateway }}"

何かうまい方法があれば教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

上記のような経験はないですが、気になったことを書かせてください。

・上記とは関係ないですが、対象のWindowsホストのIPを静的に設定した場合、DHCPサーバでその割り当てたIPを静的IPとして登録していますでしょうか?静的IPとして登録していないとDHCPサーバで同じIPを他のマシンに割り当てるリスクが発生するかと思います

やはり途中で疎通が取れなくなることが問題で、エラーになりました

エラーの内容はなっていますでしょうか?
IP割り当て時にネットワーク切断するので、エラーになったのかなと推測しています。
一般的に新しいIPへの疎通確認用の処理を挟んでから再度そのホストに接続するような処理を追加するとかで対策できるかと思います。

ちなみに途中で疎通エラーになったが、実際は対象のホストのIPは変わっているのでしょうか?

投稿2020/06/18 04:46

comefigo

総合スコア1045

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sasaki0628

2020/06/22 06:29

>DHCPサーバでその割り当てたIPを静的IPとして登録していますでしょうか? DHCPサーバーで動的に割り当てたアドレスと同じアドレスを静的に設定する予定です。 実行すると、以下のようなエラーメッセージになります。 途中で疎通エラーになったようですが、実際は対象のホストのIPは変わっており、 ignore_errors: true で処理を継続させ、win_ping で疎通を取ることができています。 failed_when: false が何故か効果がないのですが、これは諦めるしかないでしょうか。 The full traceback is: Traceback (most recent call last): File "/usr/lib/python3.6/site-packages/winrm/protocol.py", line 248, in send_message root = ET.fromstring(ex.response_text) File "/usr/lib64/python3.6/xml/etree/ElementTree.py", line 1315, in XML return parser.close() File "<string>", line None xml.etree.ElementTree.ParseError: no element found: line 1, column 0 During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/lib/python3.6/site-packages/ansible/executor/task_executor.py", line 146, in run res = self._execute() File "/usr/lib/python3.6/site-packages/ansible/executor/task_executor.py", line 645, in _execute result = self._handler.run(task_vars=variables) File "/usr/lib/python3.6/site-packages/ansible/plugins/action/normal.py", line 46, in run result = merge_hash(result, self._execute_module(task_vars=task_vars, wrap_async=wrap_async)) File "/usr/lib/python3.6/site-packages/ansible/plugins/action/__init__.py", line 923, in _execute_module res = self._low_level_execute_command(cmd, sudoable=sudoable, in_data=in_data) File "/usr/lib/python3.6/site-packages/ansible/plugins/action/__init__.py", line 1071, in _low_level_execute_command rc, stdout, stderr = self._connection.exec_command(cmd, in_data=in_data, sudoable=sudoable) File "/usr/lib/python3.6/site-packages/ansible/plugins/connection/winrm.py", line 548, in exec_command result = self._winrm_exec(cmd_parts[0], cmd_parts[1:], from_exec=True, stdin_iterator=stdin_iterator) File "/usr/lib/python3.6/site-packages/ansible/plugins/connection/winrm.py", line 509, in _winrm_exec self.protocol.cleanup_command(self.shell_id, command_id) File "/usr/lib/python3.6/site-packages/winrm/protocol.py", line 390, in cleanup_command res = self.send_message(xmltodict.unparse(req)) File "/usr/lib/python3.6/site-packages/winrm/protocol.py", line 251, in send_message raise ex File "/usr/lib/python3.6/site-packages/winrm/protocol.py", line 243, in send_message resp = self.transport.send_message(message) File "/usr/lib/python3.6/site-packages/winrm/transport.py", line 323, in send_message response = self._send_message_request(prepared_request, message) File "/usr/lib/python3.6/site-packages/winrm/transport.py", line 339, in _send_message_request raise WinRMTransportError('http', ex.response.status_code, response_text) winrm.exceptions.WinRMTransportError: Bad HTTP response returned from server. Code 400 fatal: [TEST-SERVER]: FAILED! => { "msg": "Unexpected failure during module execution.", "stdout": "" } ...ignoring
comefigo

2020/06/22 07:44

実際にIPが変わっているのであれば、単純にIP割り当て時によるネットワーク切断と判断しても問題なさそうですね。 IP割り当て処理でignore_errors: Trueにしても効果ないのは、割り当て処理の結果が返ってくる前にIP割り当てによるネットワークが切断されるためです。 なので、async:1/poll:0を追加して、IP割り当て処理を非同期処理(戻り値を待たずに処理を投げっぱなしにする)として実行し、その次のタスクでwin_ping で成功したら、ホスト再接続処理(同じIPならもしかしたら不要かも?)を追加する。 もしホスト再接続処理を実装するならば、以前の接続先を一回クリアしなければならない。 処理は以下のような感じです。 同一IPということなので、ひとまず再接続処理なしで後続のタスクが流れるかを確認してみてください。 ダメならこちらの処理を追加してみてください。 --- # インベントリのホストを削除する - meta: refresh_inventory # add_hostモジュールでインベントリに動的に登録する - add_host: 省略 参考にどうぞ https://qiita.com/CsFactoryitter/items/411f9a2da528b0c9dd7f
sasaki0628

2020/06/22 09:02

非同期処理をしたところタスクが成功するようになりました。 同じIPだったので再接続処理は不要でした。 - meta: refresh_inventory というのも初めて知りました。 Ansible の理解が深まりました。ありがとうございました。
comefigo

2020/06/22 16:26

解決されたようならよかったです! enjoy ansible life !
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問