Аргумент должен быть str not bytes

Я запускаю Ansible 2.2.0.0 от Travis-CI для установки общей общей версии Terraform, которую мы используем в нашем проекте.

Я могу запустить его локально без проблем, но когда я запускаю его в Travis, он, кажется, терпит неудачу на некотором кодировании строки, полученной из переменной:

[WARNING]: Host file not found: /etc/ansible/hosts

[WARNING]: provided hosts list is empty, only localhost is available

PLAY [localhost] ***************************************************************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [terraform : create terraform directory] **********************************
changed: [localhost]

TASK [terraform : install terraform] *******************************************
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "Failure downloading https://releases.hashicorp.com/terraform/0.7.13/terraform_0.7.13_linux_amd64.zip, write() argument must be str, not bytes"}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=1

Хост-версии Ansible и Python:

vagrant@ubuntu-14:/vagrant/ansible$ python3 --version
Python 3.4.3
vagrant@ubuntu-14:/vagrant/ansible$ ansible --version
ansible 2.2.0.0
  config file = /vagrant/ansible/ansible.cfg
  configured module search path = Default w/o overrides

Версии Travis Ansible и Python:

$ python --version
Python 3.4.2
$ ansible --version
ansible 2.2.0.0
  config file = 
  configured module search path = Default w/o overrides

Я подтвердил, что LANGэто en_US.UTF-8в обоих местах.

Вот мой playbook:

---
  - hosts: localhost
    roles:
      - role: terraform
        terraform_install_root: "{{ ansible_env.HOME }}/terraform/"
        bin_dir: "{{ ansible_env.HOME }}/.local/bin"

Вот roles/terraform/tasks/main.yml:

---
 - name: create terraform directory
   file: path={{ terraform_install_root }}/{{ terraform_version }} state=directory

 - name: install terraform
   unarchive:
     copy: no
     src: "https://releases.hashicorp.com/terraform/{{ terraform_version }}/terraform_{{ terraform_version }}_linux_amd64.zip"
     dest: "{{ terraform_install_root }}/{{ terraform_version }}"
     creates: "{{ terraform_install_root }}/{{ terraform_version }}/terraform"

 - name: ensure bin directory exists
   file: path={{ bin_dir }} state=directory

 - name: create terraform symlink
   file: src={{ terraform_install_root }}/{{ terraform_version }}/terraform dest={{ bin_dir }}/terraform state=link

Вот roles/terraform/vars/main.yml:

---
terraform_version: "0.7.13"
terraform_install_root: /opt/terraform/
bin_dir: /usr/local/bin

Похоже, что по какой-то причине Ansible не может преобразовать что-то в UTF-8, хотя я не делаю ничего странного, и то, что работает локально, не работает на Трэвисе.

Кроме того, кажется, что в любом из этих файлов нет символов, отличных от ASCII:

$ file -i ansible/roles/terraform/tasks/main.yml
ansible/roles/terraform/tasks/main.yml: text/plain; charset=us-ascii
$ file -i ansible/roles/terraform/vars/main.yml
ansible/roles/terraform/vars/main.yml: text/plain; charset=us-ascii
$ file -i ansible/travis-playbook.yml
ansible/travis-playbook.yml: text/plain; charset=us-ascii

Есть идеи?

3 ответа

  1. Используйте кавычки вокруг srcэтой задачи:

     - name: install terraform
       unarchive:
         copy: no
         src: "https://releases.hashicorp.com/terraform/{{ terraform_version }}/terraform_{{ terraform_version }}_linux_amd64.zip"
         dest: "{{ terraform_install_root }}/{{ terraform_version }}"
         creates: "{{ terraform_install_root }}/{{ terraform_version }}/terraform"
    

    Затем запустите его:

    ansible-playbook -i 192.168.33.33, terraform.yml                                                               2 ↵
    
    PLAY [all] *********************************************************************
    
    TASK [setup] *******************************************************************
    ok: [192.168.33.33]
    
    TASK [terraform-stackoverflow : create terraform directory] ********************
    ok: [192.168.33.33]
    
    TASK [terraform-stackoverflow : install terraform] *****************************
    changed: [192.168.33.33]
    
    TASK [terraform-stackoverflow : ensure bin directory exists] *******************
    changed: [192.168.33.33]
    
    TASK [terraform-stackoverflow : create terraform symlink] **********************
    changed: [192.168.33.33]
    
    PLAY RECAP *********************************************************************
    192.168.33.33              : ok=5    changed=3    unreachable=0    failed=0
    
  2. Как много из cop-out, как это, я обновлен, чтобы использовать изображение Трэвиса trusty(Ubuntu 14.04) бета и проблема ушла.

    Следует отметить, что preciseэто Ubuntu 12.04, который является четыре, ближайшие на пять лет.

  3. Это известная ошибка Ansible (#5791) и была исправлена develop, хотя она еще не в выпуске ( commit ansible/ansible@1963e50).

    Возможно, вы можете установить отдельный 2.7 Python на целевой хост только для использования Ansible? (Можно настроить интерпретатор для использования ansible_python_interpreterв инвентаре .) Я обнаружил, что попытка использовать Python3 с Ansible-это бесконечная игра whack-a-bug, хотя по справедливости Ansible активно работает над исправлением этого.