現在のディレクトリの次のレイアウトを考えてみましょう。
.
├── foobar.yml
└── roles
└── foobar
└── tasks
└── main.yml
foobar
私たちのキャラクター()が次のようなことをしているとしましょうroles/foobar/tasks/main.yml
。
---
- add_host:
name: "baz"
ansible_user: "root"
ansible_become: yes
ansible_ssh_host: "{{container.ip}}"
ansible_ssh_host_key_checking: no
ansible_ssh_private_key_file: "{{container.privkey}}"
ansible_ssh_extra_args: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
- wait_for:
port: 22
host: "{{container.ip}}"
timeout: 30
search_regex: OpenSSH
- apt:
pkg:
- vim-nox
- lsof
delegate_to: "baz"
become: true
become_user: root
...そして次のスクリプトは次のようになります。
---
- name: Configuring container and host
hosts: localhost
vars:
container:
ip: "172.17.0.2"
privkey: "/root/root_ssh/id_rsa"
roles:
- foobar
OpenSSHはプレイブックで提供されているようにIPv4で使用でき、秘密鍵は指定されたパス(u=rw,go=
たとえば0600、親ディレクトリは0700)に存在します。テスト中に、これらすべてを確認しました(例:stat
および使用debug
)。
最後の作業は次のように失敗しました。
TASK [foobar : apt] ***********************************************************************************************************************************************************************************************
task path: /home/username/ansible/test/roles/foobar/tasks/main.yml:18
<172.17.0.2> ESTABLISH SSH CONNECTION FOR USER: root
<172.17.0.2> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o 'IdentityFile="/root/root_ssh/id_rsa"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o 'User="root"' -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ControlPath=/home/username/.ansible/cp/0689044634 172.17.0.2 '/bin/sh -c '"'"'echo ~root && sleep 0'"'"''
<172.17.0.2> (255, '', "Warning: Permanently added '172.17.0.2' (ECDSA) to the list of known hosts.\r\nno such identity: /root/root_ssh/id_rsa: Permission denied\r\[email protected]: Permission denied (publickey).\r\n")
fatal: [localhost]: UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Warning: Permanently added '172.17.0.2' (ECDSA) to the list of known hosts.\r\nno such identity: /root/root_ssh/id_rsa: Permission denied\r\[email protected]: Permission denied (publickey).",
"unreachable": true
}
出力はssh
次のとおりです
Warning: Permanently added '172.17.0.2' (ECDSA) to the list of known hosts.
no such identity: /root/root_ssh/id_rsa: Permission denied
[email protected]: Permission denied (publickey).
ssh
...私と同じように、コマンドラインから同じコマンドを実行すると、sudo
このメッセージが表示されます(例:)。ここでエラーが発生するのは、/root/root_ssh/id_rsa
実際のユーザーがアクセスできないためですssh
。同等のコマンドを使用してsudo
呼び出すと、ssh
魅力のように動作します。
ただし、秘密鍵にアクセスするには、ssh
まず秘密鍵を呼び出す必要がありますroot
。
尋ねる:それでは、Ansibleをどのように使用できますか?become
同時に作成接続ssh
(例:次にssh
実行root
)しますか?
アンサーブルバージョン
$ ansible-playbook --version
ansible-playbook 2.9.4
config file = /home/username/ansible/precitec/ansible.cfg
configured module search path = [u'/home/username/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/dist-packages/ansible
executable location = /usr/bin/ansible-playbook
python version = 2.7.17 (default, Nov 7 2019, 10:07:09) [GCC 7.4.0]
私が試したこと
- 作業を
become
完了してくださいadd_host
- Ansibleが呼び出しにsudoを使用するように強制する設定
ansible_ssh_executable: "/usr/bin/sudo -- /usr/bin/ssh"
(およびそれらの組み合わせ)残念ながら、Ansibleは最終的にParamikoを使用します。sudo -- ssh
ssh
- ...創造性を発揮して設定してください
ansible_ssh_executable
(ansible_ssh_args
下記参照)。 apt
タスクを使用している場所にタスクを移動しますが、block
外部ブロックはapt
delegate_to
返品、を使用するbecome
と役に立ちません(下記参照)。
これらのどれも役に立ちません。
設定ansible_ssh_executable
とansible_ssh_args
ansible_ssh_executable: "/usr/bin/sudo"
ansible_ssh_args: "-- /usr/bin/ssh -C -o ControlMaster=auto -o ControlPersist=60s"
ansible_ssh_executable
Ansibleは値をチェックしているように見えるため、(たとえば)完全なコマンドラインを提供することは不可能です。sudo -- ssh
ブロックで梱包されています。
- name: Install packages
block:
- apt:
pkg:
- vim-nox
- lsof
delegate_to: "baz"
become: true
become: true