0

我正在 Raspberry PI 2 上探索新安装的 Archlinux 安装,如下所示:

ansible -i PI2 arch -m setup -c paramiko -k -u alarm -vvvv

这对我来说是:针对与用户“警报”连接的 IP 触发设置模块,要求输入该特定用户的密码。然而,最终尝试连接的用户是“root”。

这是调试响应:

Loaded callback minimal of type stdout, v2.0 <192.168.1.18> ESTABLISH CONNECTION FOR USER: root on PORT 22 TO 192.168.1.18 192.168.1.18 | UNREACHABLE! => { "changed": false, "msg": "ERROR! Authentication failed.", "unreachable": true }

库存如下所示: [arch] 192.168.1.18

以下是一些可能相关或不相关的事情:

  • 不允许通过 root 进行 ssh 登录
  • sudo 未安装
  • 默认用户和通行证是“警报”:“警报”
  • 没有 ssh 密钥被复制到机器,因此 paramiko 连接尝试

未被忽略并导致连接成功的是添加ansible_user=alarm到清单文件中的 IP 行。

编辑 在官方文档中找到了这个有趣的段落:http://docs.ansible.com/ansible/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable指出:

Another important thing to consider (for all versions) is that connection specific variables override config, command line and play specific options and directives. For example:

ansible_user will override-uand远程用户:`

原来的问题似乎仍然存在。清单中没有提及ansible_user,为什么使用 root 而不是明确提到的用户 via - u

EDIT_END

这是预期的行为吗?

谢谢

4

2 回答 2

0

您不需要将 paramiko 指定为连接类型,Ansible 会找出该部分。您可能有一个group_vars目录,其中为此主机定义了一个ansible_user或变量,它可能会覆盖警报用户。ansible_ssh_user

我能够在 ansible 2.0.0.2 上复制您的测试,而对运行 Raspian 的树莓派 2 没有任何问题:

➜  ansible  ansible -i PI2 arch -m setup -u alarm -vvvv -k
Using /etc/ansible/ansible.cfg as config file
SSH password:
Loaded callback minimal of type stdout, v2.0
<192.168.1.84> ESTABLISH CONNECTION FOR USER: alarm on PORT 22 TO 192.168.1.84
CONNECTION: pid 78534 waiting for lock on 9
CONNECTION: pid 78534 acquired lock on 9

paramiko: The authenticity of host '192.168.1.84' can't be established.
The ssh-rsa key fingerprint is 54e12e8153e0319f450934d606dca7df.
Are you sure you want to continue connecting (yes/no)?
yes
CONNECTION: pid 78534 released lock on 9
<192.168.1.84> EXEC ( umask 22 && mkdir -p "$( echo $HOME/.ansible/tmp/ansible-tmp-1454502995.07-263327298967895 )"     && echo "$( echo $HOME/.ansible/tmp/ansible-tmp-1454502995.07-263327298967895 )" )
<192.168.1.84> PUT /var/folders/39/t0dm88q50dbcshd5nc5m5c640000gn/T/tmp5DqywL TO /home/alarm/.ansible/tmp/ansible-    tmp-1454502995.07-263327298967895/setup
<192.168.1.84> EXEC LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 /usr/bin/python /home/alarm/.ansible/    tmp/ansible-tmp-1454502995.07-263327298967895/setup; rm -rf "/home/alarm/.ansible/tmp/ansible-tmp-1454502995.    07-263327298967895/" > /dev/null 2>&1
192.168.1.84 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.1.84"
        ],
于 2016-02-03T12:44:53.990 回答
0

我为自己创建了一个 Ansible 1.9.4 沙箱,复制了 ansible.cfg 和清单,然后再次运行该命令。有点像预期的那样工作:

⤷ ansible --version ansible 1.9.4 configured module search path = None (ANS19TEST)~/Documents/Code/VENVS/ANS19TEST ⤷ ansible -i PI2 arch -m setup -c paramiko -k -u alarm -vvvv SSH password: <192.168.1.18> ESTABLISH CONNECTION FOR USER: alarm on PORT 22 TO 192.168.1.18 <192.168.1.18> REMOTE_MODULE setup

从我站的地方我会说这是一个错误。也许有人可以确认?!然后这会转到错误跟踪器...

干杯

编辑

为简洁起见,我省略了库存文件的一个重要部分,它最终导致了这种行为。它看起来像这样:

[hypriot]

192.168.1.18 ansible_user=root

[拱]

192.168.1.18

来自 Ansible bugtracker 的引述:

清单中使用的名称是字典中的键。因此,您作为特定于主机的变量放入其中的所有内容都将合并到一个大字典中。这意味着在某些冲突的情况下,变量会被其他值取代。

您可以通过对同一主机使用不同的名称(例如,使用 IP 地址和主机名,或别名或 DNS 别名)来防止这种情况发生,在这种情况下,您仍然可以做您喜欢做的事情。

所以我的库存现在看起来像这样:

[hypriot]

hypriot_local ansible_host=192.168.1.18 ansible_user=root

[archlinux]

arch_local ansible_host=192.168.1.18

这工作正常。Ansible 跟踪器上的相应问题在这里:https ://github.com/ansible/ansible/issues/14268

于 2016-02-02T17:20:20.053 回答