当我只有只读访问权限时如何使用 Ansible?

How can I use Ansible when I only have read-only access?

我正在使用 Ansible 来自动执行一些网络故障排除任务,但是当我尝试 ping 我的所有设备作为健全性检查时,我收到以下错误:

"msg": "Authentication or permission failure. In some cases, you may have been able to authenticate and did not have permissions on the remote directory. Consider changing the remote temp path in ansible.cfg to a path rooted in \"/tmp\".

当我在 Ansible 详细模式下 运行 命令时,就在这个错误之前,我得到以下输出:

<10.25.100.1> EXEC /bin/sh -c '( umask 77 && mkdir -p "echo Cmd exec error./.ansible/tmp/ansible-tmp-1500330345.12-194265391907358" && echo ansible-tmp-1500330345.12-194265391907358="echo Cmd exec error./.ansible/tmp/ansible-tmp-1500330345.12-194265391907358" ) && sleep 0'

我是一名实习生,因此对所有设备只有只读权限;因此,我认为错误是由于 mkdir 命令而发生的。因此,我的两个问题是:

1) 是否可以配置 Ansible 不在设备上创建任何临时文件?

2) 是否有一些其他因素可能导致我可能错过了这个错误?

我曾尝试在 Ansible 文档中搜索任何相关配置,但我没有太多使用 Ansible 的经验,所以我一直找不到任何东西。

这个问题在更广泛的背景下没有意义。 Ansible 是用于服务器配置自动化的工具。没有写入权限,您无法在目标机器上配置任何内容,因此 Ansible 没有用例。

在更窄的上下文中,虽然您没有 post 任何代码,但您似乎在尝试 ping 目标服务器。 Ansible ping module is not an ICMP ping。相反,它是一个连接到目标服务器的组件,传输 Python 脚本并 运行s 它们。脚本产生一个响应,这意味着目标系统满足 运行 Ansible 模块的最低要求。

但是您似乎想要 运行 在您的控制机器上使用 Ansible command module 执行常规 ping 命令并检查状态:

- hosts: localhost
  vars:
    target_host: 192.168.1.1
  tasks:
    - command: ping {{ target_host }}

您可能想要使用 failed_whenignore_errorschanged_when 参数。参见 Error handling in playbook

请注意,我建议 运行在 localhost 上进行整个播放,因为在您的配置中,配置您对其具有有限访问权限的目标机器没有意义库存。


另外:

Is there anyway to configure Ansible to not create any temp files on the devices?

是的。 运行 通过 raw module 命令不会创建临时文件。

由于您似乎有 SSH 访问权限,您可以使用它来 运行 命令并检查其结果:

- hosts: 192.168.1.1
  tasks:
    - raw: echo Hello World
      register: echo
    - debug:
        var: echo.stdout

如果有人有多个节点和 sudo 权限,而你想绕过只读限制,尝试使用 raw 模块,重新挂载磁盘,在带有 raed/write 选项的远程节点上,它是对我很有帮助。

剧本示例:

---
- hosts: bs
  gather_facts: no
  pre_tasks:
    - name: read/write
      raw: ansible bs -m raw -a "mount -o remount,rw /" -b --vault-password-file=vault.txt
      delegate_to: localhost
  tasks:
    - name: dns
      raw: systemctl restart dnsmasq
    - name: read only
      raw: mount -o remount,ro /