やりたいこと
トップレベル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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/13 08:40
2020/10/13 08:54 編集
2020/10/13 09:10
2020/10/13 09:17
2020/10/13 09:28
2020/10/13 10:01
2020/10/13 11:45
2020/10/13 13:31
2020/10/14 00:31
2020/10/14 05:12