我是否需要显式切换 Paramiko 或 Ansible 以使用 UTF-8 处理 su 密码中的非 ASCII 字符?
Do I need to explicitly switch Paramiko or Ansible to use UTF-8 to handle non-ASCII characters in su passwords?
我正在使用此 Playbook 命令从远程计算机获取数据库:
ansible-playbook -K -vvv ansible/fetch-database.yml
剧本的第一部分如下所示:
---
- name: Set this playbook to run on the live server
hosts: webservers
remote_user: jon
become_method: su
become_user: root
roles:
- fetch-database
角色的第一个任务由此开始(还有其他任务,但 Ansible 在到达它们之前就崩溃了,所以我认为它们不相关):
---
- name: Install the MySQL packages to support MySQL exporting on the remote in Python
apt: name={{ item }} state=installed update_cache=yes
become: true
with_items:
- python-mysqldb
这样做的目的是在 Ubuntu 远程服务器上安装一个数据库库,这样我就可以执行 MySQL 转储,然后将 SQL 文件取回我的本地主机。
我正在使用 Paramiko 作为 SSH 驱动程序,因此在我的本地配置中配置 ansible.cfg
:
[defaults]
transport=paramiko
不幸的是我得到这个错误:
An exception occurred during task execution. The full traceback is:
Traceback (most recent call last):
File "/home/jon/Development/Personal/server-build/ansible/lib/ansible/executor/task_executor.py", line 96, in run
item_results = self._run_loop(items)
File "/home/jon/Development/Personal/server-build/ansible/lib/ansible/executor/task_executor.py", line 252, in _run_loop
res = self._execute(variables=task_vars)
File "/home/jon/Development/Personal/server-build/ansible/lib/ansible/executor/task_executor.py", line 447, in _execute
result = self._handler.run(task_vars=variables)
File "/home/jon/Development/Personal/server-build/ansible/lib/ansible/plugins/action/normal.py", line 33, in run
results = merge_hash(results, self._execute_module(tmp=tmp, task_vars=task_vars))
File "/home/jon/Development/Personal/server-build/ansible/lib/ansible/plugins/action/__init__.py", line 647, in _execute_module
res = self._low_level_execute_command(cmd, sudoable=sudoable, in_data=in_data)
File "/home/jon/Development/Personal/server-build/ansible/lib/ansible/plugins/action/__init__.py", line 721, in _low_level_execute_command
rc, stdout, stderr = self._connection.exec_command(cmd, in_data=in_data, sudoable=sudoable)
File "/home/jon/Development/Personal/server-build/ansible/lib/ansible/plugins/connection/paramiko_ssh.py", line 311, in exec_command
chan.sendall(self._play_context.become_pass + '\n')
File "/usr/lib/python2.7/dist-packages/paramiko/channel.py", line 797, in sendall
sent = self.send(s)
File "/usr/lib/python2.7/dist-packages/paramiko/channel.py", line 729, in send
m.add_string(s[:size])
File "/usr/lib/python2.7/dist-packages/paramiko/message.py", line 259, in add_string
self.packet.write(s)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 1: ordinal not in range(128)
fatal: [server.example.com]: FAILED! => {"failed": true, "msg": "Unexpected failure during module execution.", "stdout": ""}
我的 root 密码似乎是以 ASCII 码传递的,而且似乎在井号 (£) 上挣扎。我认为这是主要错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 1: ordinal not in range(128)
我猜这是一个错误(因为它没有得到很好的处理)但我无法想象以前没有人发现过这个。因此,我假设有一些选项可以通过 UTF-8 传递此密码 - 如果是这样,我该怎么做?
我正在使用来自 GitHub、hash 46a97e1f551
的 Ansible 当前 devel
分支。我猜想这个问题会受到正在使用的子模块的影响,所以为了完整起见,它们如下:
1d0d5db97a26fefc5ce462ef5fac84086122bbe3 lib/ansible/modules/core (heads/devel-165-g1d0d5db)
00b8b96906a741afa8eaa1245d0e229f099318a5 lib/ansible/modules/extras (heads/devel-116-g00b8b96)
我认为这不是什么大问题,因为感觉像是 Python 问题或配置问题,但本地和远程机器都是 Ubuntu 14.04.
我目前的解决方案是禁用Paramiko 并使用默认的SSH 传输机制。这以前不起作用,并且挂在需要 su
的命令上,这就是我首先换成 Paramiko 的原因。不过这个问题最近好像已经解决了。
关于 Paramiko 问题的错误报告 is here。
我正在使用此 Playbook 命令从远程计算机获取数据库:
ansible-playbook -K -vvv ansible/fetch-database.yml
剧本的第一部分如下所示:
---
- name: Set this playbook to run on the live server
hosts: webservers
remote_user: jon
become_method: su
become_user: root
roles:
- fetch-database
角色的第一个任务由此开始(还有其他任务,但 Ansible 在到达它们之前就崩溃了,所以我认为它们不相关):
---
- name: Install the MySQL packages to support MySQL exporting on the remote in Python
apt: name={{ item }} state=installed update_cache=yes
become: true
with_items:
- python-mysqldb
这样做的目的是在 Ubuntu 远程服务器上安装一个数据库库,这样我就可以执行 MySQL 转储,然后将 SQL 文件取回我的本地主机。
我正在使用 Paramiko 作为 SSH 驱动程序,因此在我的本地配置中配置 ansible.cfg
:
[defaults]
transport=paramiko
不幸的是我得到这个错误:
An exception occurred during task execution. The full traceback is:
Traceback (most recent call last):
File "/home/jon/Development/Personal/server-build/ansible/lib/ansible/executor/task_executor.py", line 96, in run
item_results = self._run_loop(items)
File "/home/jon/Development/Personal/server-build/ansible/lib/ansible/executor/task_executor.py", line 252, in _run_loop
res = self._execute(variables=task_vars)
File "/home/jon/Development/Personal/server-build/ansible/lib/ansible/executor/task_executor.py", line 447, in _execute
result = self._handler.run(task_vars=variables)
File "/home/jon/Development/Personal/server-build/ansible/lib/ansible/plugins/action/normal.py", line 33, in run
results = merge_hash(results, self._execute_module(tmp=tmp, task_vars=task_vars))
File "/home/jon/Development/Personal/server-build/ansible/lib/ansible/plugins/action/__init__.py", line 647, in _execute_module
res = self._low_level_execute_command(cmd, sudoable=sudoable, in_data=in_data)
File "/home/jon/Development/Personal/server-build/ansible/lib/ansible/plugins/action/__init__.py", line 721, in _low_level_execute_command
rc, stdout, stderr = self._connection.exec_command(cmd, in_data=in_data, sudoable=sudoable)
File "/home/jon/Development/Personal/server-build/ansible/lib/ansible/plugins/connection/paramiko_ssh.py", line 311, in exec_command
chan.sendall(self._play_context.become_pass + '\n')
File "/usr/lib/python2.7/dist-packages/paramiko/channel.py", line 797, in sendall
sent = self.send(s)
File "/usr/lib/python2.7/dist-packages/paramiko/channel.py", line 729, in send
m.add_string(s[:size])
File "/usr/lib/python2.7/dist-packages/paramiko/message.py", line 259, in add_string
self.packet.write(s)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 1: ordinal not in range(128)
fatal: [server.example.com]: FAILED! => {"failed": true, "msg": "Unexpected failure during module execution.", "stdout": ""}
我的 root 密码似乎是以 ASCII 码传递的,而且似乎在井号 (£) 上挣扎。我认为这是主要错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 1: ordinal not in range(128)
我猜这是一个错误(因为它没有得到很好的处理)但我无法想象以前没有人发现过这个。因此,我假设有一些选项可以通过 UTF-8 传递此密码 - 如果是这样,我该怎么做?
我正在使用来自 GitHub、hash 46a97e1f551
的 Ansible 当前 devel
分支。我猜想这个问题会受到正在使用的子模块的影响,所以为了完整起见,它们如下:
1d0d5db97a26fefc5ce462ef5fac84086122bbe3 lib/ansible/modules/core (heads/devel-165-g1d0d5db)
00b8b96906a741afa8eaa1245d0e229f099318a5 lib/ansible/modules/extras (heads/devel-116-g00b8b96)
我认为这不是什么大问题,因为感觉像是 Python 问题或配置问题,但本地和远程机器都是 Ubuntu 14.04.
我目前的解决方案是禁用Paramiko 并使用默认的SSH 传输机制。这以前不起作用,并且挂在需要 su
的命令上,这就是我首先换成 Paramiko 的原因。不过这个问题最近好像已经解决了。
关于 Paramiko 问题的错误报告 is here。