Python ansible容器不可JSON序列化

Python ansible容器不可JSON序列化,python,python-2.7,ansible,ansible-container,Python,Python 2.7,Ansible,Ansible Container,我们刚刚开始从ansible container 0.9.2获取container.yml“不是JSON可序列化的”——这是我们已经运行了几个月的版本,没有出现任何错误。你知道为什么这会刚刚开始吗 我们的堆栈跟踪是 Traceback (most recent call last): File "/home/jenkins/workspace/tylt/ansible-container/container/cli.py", line 299, in __call__ getattr

我们刚刚开始从ansible container 0.9.2获取container.yml“不是JSON可序列化的”——这是我们已经运行了几个月的版本,没有出现任何错误。你知道为什么这会刚刚开始吗

我们的堆栈跟踪是

Traceback (most recent call last):
  File "/home/jenkins/workspace/tylt/ansible-container/container/cli.py", line 299, in __call__
    getattr(core, u'hostcmd_{}'.format(args.subcommand))(**vars(args))
  File "/home/jenkins/workspace/tylt/ansible-container/container/__init__.py", line 28, in __wrapped__
    return fn(*args, **kwargs)
  File "/home/jenkins/workspace/tylt/ansible-container/container/core.py", line 153, in hostcmd_build
    config = get_config(base_path, vars_files=vars_files, engine_name=engine_name, project_name=project_name)
  File "/home/jenkins/workspace/tylt/ansible-container/container/utils/__init__.py", line 49, in get_config
    project_name=project_name, vault_files=vault_files)
  File "/home/jenkins/workspace/tylt/ansible-container/container/__init__.py", line 28, in __wrapped__
    return fn(*args, **kwargs)
  File "/home/jenkins/workspace/tylt/ansible-container/container/config.py", line 62, in __init__
    self.set_env('prod')
  File "/home/jenkins/workspace/tylt/ansible-container/container/docker/config.py", line 45, in set_env
    super(AnsibleContainerConfig, self).set_env(env, config=config)
  File "/home/jenkins/workspace/tylt/ansible-container/container/config.py", line 146, in set_env
    self._resolve_defaults(config)
  File "/home/jenkins/workspace/tylt/ansible-container/container/config.py", line 194, in _resolve_defaults
    logger.debug(u'Resolved template variables', template_vars=defaults)
  File "/home/jenkins/.local/lib/python2.7/site-packages/structlog/stdlib.py", line 61, in debug
    return self._proxy_to_logger("debug", event, *args, **kw)
  File "/home/jenkins/.local/lib/python2.7/site-packages/structlog/stdlib.py", line 119, in _proxy_to_logger
    **event_kw)
  File "/home/jenkins/.local/lib/python2.7/site-packages/structlog/_base.py", line 176, in _proxy_to_logger
    args, kw = self._process_event(method_name, event, event_kw)
  File "/home/jenkins/.local/lib/python2.7/site-packages/structlog/_base.py", line 136, in _process_event
    event_dict = proc(self._logger, method_name, event_dict)
  File "/home/jenkins/workspace/tylt/ansible-container/container/utils/visibility.py", line 42, in unorder_dict
    event_dict[key] = json.dumps(value)
  File "/usr/lib/python2.7/json/__init__.py", line 244, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python2.7/json/encoder.py", line 184, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: ordereddict([('cron', ordereddict([('version', '3.0pl1-128ubuntu2')])), ('graphicsmagick', ordereddict([('version', '1.3.23-1build1')])), ('ruby2.4', ordereddict([('version', '2.4.4-1bbox1~xenial1')])), ('ruby2.4-dev', ordereddict([('version', '2.4.4-1bbox1~xenial1')]))]) is not JSON serializable
这就是我们的python环境的样子:

ansible-container (0.9.2)
awscli (1.14.70)
backports.ssl-match-hostname (3.5.0.1)
botocore (1.9.23)
certifi (2018.4.16)
chardet (3.0.4)
colorama (0.3.7)
docker (3.4.1)
docker-pycreds (0.3.0)
docutils (0.14)
futures (3.2.0)
idna (2.7)
ipaddress (1.0.22)
Jinja2 (2.10)
jmespath (0.9.3)
MarkupSafe (1.0)
pip (9.0.3)
pyasn1 (0.4.2)
python-dateutil (2.6.1)
PyYAML (3.12)
requests (2.19.1)
rsa (3.4.2)
ruamel.ordereddict (0.4.13)
ruamel.yaml (0.15.52)
s3transfer (0.1.13)
selenium (3.11.0)
setuptools (39.0.1)
six (1.11.0)
structlog (18.1.0)
urllib3 (1.23)
websocket-client (0.48.0)
这是我们container.yml的一个示例

version: "2"
defaults:
  additional_packages:
    ruby2.4:
       version: '2.4.4-1bbox1~xenial1'
    ruby2.4-dev:
       version: '2.4.4-1bbox1~xenial1'
    graphicsmagick:
       version: '1.3.23-1build1'
    cron:
       version: '3.0pl1-128ubuntu2'
services:
  ruby:
    from: tylt
    working_dir: "/var/www"
    command:
    - /bin/bash
    - -exc
    - |
      RAILS_ENV=kube bundle exec unicorn -c config/unicorn.rb -E kube &
      RAILS_ENV=kube bundle exec sidekiq -C config/sidekiq.yml -c 10 -e kube &
      wait %1
    volumes:
    - ${PWD}:/tmp
    roles:
    - tylt.rails
    labels:
      com.ansible.container.commit: "{{ git_commit }}"
      com.ansible.container.pull-request: "{{ pull_request }}"
registries: {}

从评论中转载:


因此,在查找ruamel.yaml(0.15.52)时,您的版本似乎是今天发布的。您最近升级了环境吗?

在新版本的ansible容器发布之前,我们通过在ansible-requirements.txt中添加相同的行来修复此问题


ruamel.yaml>=0.15.34,有趣的是,错误消息中的OrderedDict完全是json编码的:
json.dumps(OrderedDict([('cron',OrderedDict([('version','3.0pl1-128ubuntu2')),('graphicsmagick',OrderedDict([('version','1.3.23-1build1')))),('ruby2.4',OrderedDict([('version','2.4.4.4-1bbox1~xenial1'))))),('ruby2.4-dev',OrderedDict([('version','2.4.4-1bbox1~xenial1')))))
ah,ansible容器使用完全不同的OrderedDict:所以在查找
ruamel.yaml(0.15.52)时
was,看起来你的版本是今天发布的。你最近升级了你的env吗?Danielle genius!我必须添加到我们的requirements.txt来锁定它。我查看了
ruamel.yaml
发布历史,版本0.15.x至少每周发布一次,甚至每天都会发布。正如pypi生产系统网站上所述,你应该d销与
ruamel.yaml一起使用的版本