2016-12-29 87 views
0

我從Travis-CI運行Ansible 2.2.0.0,以便安裝我們在項目中使用的Terraform的共享版本。參數必須是str字節

我可以毫不問題在本地運行,但是當我在特拉維斯運行它,它似乎無法從一個變量源字符串的一些編碼:

[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版本:

[email protected]:/vagrant/ansible$ python3 --version 
Python 3.4.3 
[email protected]:/vagrant/ansible$ ansible --version 
ansible 2.2.0.0 
    config file = /vagrant/ansible/ansible.cfg 
    configured module search path = Default w/o overrides 

特拉維斯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

這裏是我的劇本:

--- 
    - 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,即使我沒有做任何事情nge和什麼在本地運行就好了不是在Travis上運行。

而且,它似乎有在這些文件中沒有非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 

任何想法?

+0

錯誤消息是您聲明的* *相反,該字符串必須是Unicode字符串,而不是UTF-8編碼的字節。 –

+0

@MarkRansom我已經更新了票證,任何文件中都沒有非ASCII字符。 –

+0

非ASCII應該不重要。某處某處缺少解碼或放入額外的編碼。 –

回答

0

使用引號圍繞這一任務的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 
+0

我已經這樣做了,但仍然失敗。 –

+0

我正在使用python2.7,你能否檢查我至少需要Python 3.4的 –

+0

。我已經嘗試過Python 3.4和3.5,並且都看不到。 –

0

既是一個虎頭蛇尾的,因爲這是我更新爲使用Travis的trusty( Ubuntu 14.04)映像測試版,問題消失了。

需要注意的是,precise是Ubuntu 12.04,它是四個,五歲即將到來。

0

這是一個已知的Ansible錯誤(#5791),並已在develop中修復,儘管它尚未發佈(commit ansible/[email protected])。

也許你可以在目標主機上安裝一個單獨的2.7 Python來使用Ansible? (你可以配置解釋器與ansible_python_interpreterinventory中一起使用。)我發現嘗試在Ansible中使用Python3是一個永不結束的重擊遊戲,儘管平心而論Ansible正在積極地解決這個問題。

相關問題