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

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

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

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

Q&A

解決済

1回答

1790閲覧

トップレベルPlaybookを整理したい

ntaniuch

総合スコア12

Ansible

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

0グッド

0クリップ

投稿2020/10/13 07:51

編集2020/10/13 12:12

やりたいこと

トップレベルPlaybookだけ階層を下げて、増えすぎたPlaybookを整理したい

  • トップレベルPlaybookはロールなどを使っておらず1ファイルで完結しています

■これまで

ansible-playbook --check -i inventory/<servers>.ini fact.yml

■やりたい構成

ansible-playbook --check -i inventory/<servers>.ini work/fact.yml

問題

やりたい構成でやってみると group_vars に設定した認証情報を読んでくれない。

fatal: [<サーバー名>]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Warning: Permanently added '<サーバー名>,<サーバーIP>' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic).", "unreachable": true}

環境

こんなディレクトリ構成で実行しています。

<top directory> |- group_vars/prd_lin.yml # 認証情報を格納 |- inventory/<サーバ名>.ini # インベントリ。グループ名を記載して、group_varsから認証情報を取得 |- ansible.cfg # 内容は後述 |- work/fact.yml # 件の移動したいPlaybook

それぞれ中身はこんな感じです。

ansible-playbook -i inventory/fact.ini work/fact.yml

$ cat work/fact.yml

# fact.yml --- - hosts: all gather_facts: no become: yes become_user: opc tasks: - setup: - debug: msg="{{ item }}" loop: - "{{ inventory_hostname }} : {{ ansible_nodename }} : {{ ansible_os_family }}"

$ cat inventory/fact.ini

# fact.ini [prd_lin] <ホストFQDN>

$ cat group_vars/prd_lin.yml

ansible_user: opc ansible_connection: ssh ansible_port: 22 ansible_ssh_private_key_file: <絶対パスで記載>

$ cat ansible.cfg

[defaults] inventory_ignore_extensions = ~, .orig, .bak, .cfg, .retry, .pyc, .pyo, .md interpreter_python = auto_silent callback_whitelist = profile_tasks log_path= ansible.log remote_tmp = ~/.ansible/tmp forks = 15 gathering = smart fact_caching = jsonfile fact_caching_connection = ./connect/facts fact_caching_timeout = 3600 display_args_to_stdout = false [privilege_escalation] become = true [ssh_connection] control_path = %(directory)s/%%h-%%r ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null host_key_checking = False

調べたこと

ansible.cfgはトップディレクトリ直下のものを使ってくれていそうです。
(挙動的にはトップレベルPlaybookと同じ階層ではなくて、ansible-playbookコマンドを叩いた階層のものを使ってくれていそうですね。)

$ ansible-playbook -i inventory/fact.ini work/fact.yml -vvv ansible-playbook 2.9.11 config file = <top directory>/ansible.cfg★ configured module search path = ['<user home>/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = <user home>/.local/lib/python3.6/site-packages/ansible executable location = /usr/local/bin/ansible-playbook python version = 3.6.8 (default, Aug 7 2019, 08:02:28) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39.0.1)] Using <top directory>/ansible.cfg as config file★ host_list declined parsing <top directory>/inventory/fact.ini as it did not pass its verify_file() method script declined parsing <top directory>/inventory/fact.ini as it did not pass its verify_file() method auto declined parsing <top directory>/inventory/fact.ini as it did not pass its verify_file() method yaml declined parsing <top directory>/inventory/fact.ini as it did not pass its verify_file() method Parsed <top directory>/inventory/fact.ini inventory source with ini plugin

そして接続出来ていない理由ですが、group_varsに記載した認証情報がうまく使えていないためのようです。

■接続出来ない場合

・group_varsに記載した秘密鍵や、ポート情報が表示されない。

$ ansible-playbook -i inventory/fact.ini work/fact.yml -vvv ・・(中略) TASK [setup] *********************************************************************************************************************************************************** task path: <top directory>/work/fact.yml:8 Tuesday 13 October 2020 20:21:18 +0900 (0:00:00.036) 0:00:00.036 ******* <<ターゲットノード名>> ESTABLISH SSH CONNECTION FOR USER: None <<ターゲットノード名>> SSH: EXEC ssh -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=<user home>/.ansible/cp/884b7719cc <ターゲットノード名> '/bin/sh -c '"'"'echo ~ && sleep 0'"'"'' <<ターゲットノード名>> (255, b'', b"Warning: Permanently added '<ターゲットノード名>,<IP>' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic).\r\n")

■接続出来る場合

・group_varsに記載した秘密鍵や、ポート情報が表示される。

$ ansible-playbook -i inventory/fact.ini fact.yml -vvv ・・(中略) TASK [setup] *********************************************************************************************************************************************************** Tuesday 13 October 2020 20:23:19 +0900 (0:00:00.038) 0:00:00.038 ******* <<ターゲットノード名>> ESTABLISH SSH CONNECTION FOR USER: opc <<ターゲットノード名>> SSH: EXEC ssh -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ★Port=22 -o 'IdentityFile="<user home>/<秘密鍵相対パス>/<秘密鍵名>"'★ -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="opc"' -o ConnectTimeout=10 -o ControlPath=<user home>/.ansible/cp/0fa6c29352 <ターゲットノード名> '/bin/sh -c '"'"'echo ~opc && sleep 0'"'"'' <<ターゲットノード名>> (0, b'/home/opc\n', b"Warning: Permanently added '<ターゲットノード名>,<IP>' (ECDSA) to the list of known hosts.\r\n")

問題の暫定対応策

以下のようにインベントリファイルに変数まで書き、group_varsを読みに行かなくてもよいようにすることでPlaybookは実行することが出来ました。

こちらgroup_varsを読ませるためのうまい書き方か、最悪コマンドから明示的に指定する方法はあるのでしょうか?
またそもそも何故group_varsを読んでくれないのでしょうか?

$ cat inventory/fact.ini

[prd_lin] <ホストFQDN> [prd_lin:vars] ansible_user=opc ansible_connection=ssh ansible_port=22 ansible_ssh_private_key_file=<絶対パスで記載> become_user=root

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

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

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

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

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

guest

回答1

0

ベストアンサー

基本的に階層を変えるだけであれば問題なく動くはずです。
importしているタスクがなければ。

エラーを見る限りはホスト追加ができていないようなので、
試しですが、playbookに以下を追加して実行してはいかがでしょうか?

yaml

1- name: playbook 2 hosts: 3 vars: 4 ansible_host_key_checking: false 5 tasks: 6 ~省略~

playbook(tasksの前まで)およびインベントリファイルの記載をお願いできますでしょうか。
機密部分はマスクしてください。

投稿2020/10/13 08:05

comefigo

総合スコア1045

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

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

ntaniuch

2020/10/13 08:40

> playbook(tasksの前まで)およびインベントリファイルの記載をお願いできますでしょうか。 > 機密部分はマスクしてください。 ありがとうございます。問い合わせ部分に追記しました。
ntaniuch

2020/10/13 09:10

ご回答ありがとうございます! ただ、ansible.cfgをworkディレクトリ配下において試しているのですが、同じエラーになってしまいます。 頂いた情報を元に何とかしてみたいと思います。
comefigo

2020/10/13 09:17

control_path が気になりますね。 私は使ったことないですが、踏み台サーバ経由で接続しているのでしょうか?
ntaniuch

2020/10/13 09:28

> control_path が気になりますね。 かつては踏み台サーバ経由でしたが、今は直接ターゲットにつないでいます。 この行はコメントアウトしても結果は変わらずです・・
ntaniuch

2020/10/13 11:45

> host_key_checking = Falseは[defaults]に設定するべきではないでしょうか? ご指摘ありがとうございます。 こちらも修正して、[defaults]配下にしましたが、挙動は変わりませんでした。 一度"-vvv"オプションを付けて挙動を確認したところ、以下が判明しました。 ・ansible.cfgは<top directory>直下の元々あったansible.cfgの方を見ていました。 ・どうもgroup_varsの情報が読めていない模様 確認したログなどを質問文に追記しました。
ntaniuch

2020/10/14 00:31

ありがとうございます! group_varsをinventory配下に持っていくことで解決出来ました! ご丁寧にありがとうございます。ベストアンサー3つくらい付けたいところです。大変助かりました!
comefigo

2020/10/14 05:12

いえいえ。 解決されてよかったです。 引き続きよろしくお願い致します。 ちなみにSlackにAnsible日本ユーザ会もありますので、興味がございましたら是非ご参加くださいませ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問