问题 Ansible:通过HTTP安装tarball


我想扩展我的ansible playbook来安装/验证phantomjs和wkhtmltopdf安装到我的Debian 7机器上。这两个程序都可以通过HTTP作为打包的tarball使用。我知道get_url模块,但它没有解压缩东西,如果我添加一些shell命令来解压缩和移动二进制文件,我怀疑每次运行ansible时,tarball都会被下载,解压缩并再次移动,导致不必要的网络流量

我怎么解决这个问题?我应该使用apt命令创建一个.deb文件并运行它,还是应该创建一个新的ansible模块来安装tarball,或者我有什么东西可以忽略?


11996
2017-11-12 10:14


起源



答案:


如果您下载特定版本(例如 foo_1.2.3.tar.gz 并不是 foo_latest.tar.gz),你可以通过保持下载的tarball来做到这一点:

- name: Gets tarball
  sudo: yes
  sudo_user: "{{ deploy_user }}"
  get_url:
    url="http://some.host/some_tarball-{{ tarball_version }}.tar.gz"
    dest="/home/{{ deploy_user }}/"
  register: new_archive

- name: Unarchive source
  sudo: yes
  sudo_user: "{{ deploy_user }}"
  unarchive:
    src="/home/{{ deploy_user }}/some_tarball-{{ tarball_version }}.tar.gz"
    dest="/home/{{ deploy_user }}/app/"
    copy=no
  when: new_archive|changed

根据您的环境更改变量。


10
2017-11-12 12:46



很好,我没有仔细查看get_url文档,他们非常明确地说明只有在dest不存在时才下载文件。有关于的文件 changed 过滤器,我只能找到一个使用它的例子,但没有解释? - Simon
事实上, changed 如果变量在返回“已更改”的任务中注册,则为true。这意味着在任务运行时某些东西已“改变”。在我们的例子中,这意味着该文件不存在和下载。它不是特定的get_url,它是一个可以应用于变量的过滤器(参见 docs.ansible.com/playbooks_variables.html#id21)。 - leucos
请注意,文件传输已经过了,你是安全的,因为 get_url 只有在传输成功后才会将文件复制到指定的目标。注意:我修复了unarchive src文件名,这是错误的 - leucos
很好,谢谢你:-) - Simon


答案:


如果您下载特定版本(例如 foo_1.2.3.tar.gz 并不是 foo_latest.tar.gz),你可以通过保持下载的tarball来做到这一点:

- name: Gets tarball
  sudo: yes
  sudo_user: "{{ deploy_user }}"
  get_url:
    url="http://some.host/some_tarball-{{ tarball_version }}.tar.gz"
    dest="/home/{{ deploy_user }}/"
  register: new_archive

- name: Unarchive source
  sudo: yes
  sudo_user: "{{ deploy_user }}"
  unarchive:
    src="/home/{{ deploy_user }}/some_tarball-{{ tarball_version }}.tar.gz"
    dest="/home/{{ deploy_user }}/app/"
    copy=no
  when: new_archive|changed

根据您的环境更改变量。


10
2017-11-12 12:46



很好,我没有仔细查看get_url文档,他们非常明确地说明只有在dest不存在时才下载文件。有关于的文件 changed 过滤器,我只能找到一个使用它的例子,但没有解释? - Simon
事实上, changed 如果变量在返回“已更改”的任务中注册,则为true。这意味着在任务运行时某些东西已“改变”。在我们的例子中,这意味着该文件不存在和下载。它不是特定的get_url,它是一个可以应用于变量的过滤器(参见 docs.ansible.com/playbooks_variables.html#id21)。 - leucos
请注意,文件传输已经过了,你是安全的,因为 get_url 只有在传输成功后才会将文件复制到指定的目标。注意:我修复了unarchive src文件名,这是错误的 - leucos
很好,谢谢你:-) - Simon


您还可以使用unarchive模块直接从HTTP源解压缩tar文件。

- name: Download and unpack directly from HTTP source unarchive: src: "http://your_tarball_to_download.tar.gz" dest: "/home/dest_directory" copy: no

有关unarchive模块的更多信息可以在文档中找到 http://docs.ansible.com/ansible/unarchive_module.html


2
2017-08-29 10:51



请用你的答案更新 version_added 2.0 并记住这一点 copy= 已弃用。 - Konstantin Suvorov
谢谢Konstantin Suvorov。我知道 copy= 不赞成使用 remote_src。但是,使用 remote_src=yes 剥离第二个 / 在 http:// 对我来说,这个问题也被其他人报道过 https://github.com/ansible/ansible-modules-core/issues/4498 - Kosy Anyanwu