如何动态覆盖ansible.cfg中的默认变量?

如何动态覆盖ansible.cfg中的默认变量?,ansible,ansible-2.x,Ansible,Ansible 2.x,我有一个playbook,其中包含以下任务,必须将2 Gb文件从本地服务器复制到远程服务器并提取文件: - name: Copy archived file to target server and extract unarchive: src: /path_to_source_dir/file.tar.gz dest: /path_to_dest_dir 此任务失败,因为ansible将文件复制到目标服务器上的装载点/home,但那里没有足够的空间: sftp>

我有一个playbook,其中包含以下任务,必须将2 Gb文件从本地服务器复制到远程服务器并提取文件:

- name: Copy archived file to target server and extract 
  unarchive:
    src: /path_to_source_dir/file.tar.gz  
    dest: /path_to_dest_dir
此任务失败,因为ansible将文件复制到目标服务器上的装载点/home,但那里没有足够的空间:

sftp> put /path_to_source_dir/file.tar.gz /home/my_user_name/.ansible/tmp/ansible-tmp-1551129648.53-14181330218552/source  
scp: /home/my_user_name/.ansible/tmp/ansible-tmp-1551129648.53-14181330218552/source: No space left on device 
原因是,ansible.cfg有一个默认参数:

remote_tmp = ~/.ansible/tmp
如何从playbook(如果可能)覆盖此参数,并使ansible将文件复制到任务中指定的相同目标目录?所以它是这样的:

remote_tmp = /path_to_dest_dir/.ansible/tmp
对于不同的目标服务器,每次的目标路径都会不同

清洁/home不是我的选择。
不幸的是,我并不十分清楚答案

有几种不同的方法可以实现你想要做的事情。哪一个取决于您的偏好和用例

您找到了第一种方法,即在运行playbook之前设置环境变量。非常适合快速的即时工作。每次运行某个剧本时都要记住这一点,这确实令人讨厌。其中的一个细微变化是使用
环境
关键字为播放设置该变量。您还可以在角色、块或单个任务中设置环境变量。下面是一个正在使用的示例:

在play et al中使用environment关键字对于自动化的特定应用程序非常有效,但是如果您希望Ansible始终为特定服务器使用不同的远程tmp路径,该怎么办?与所有变量一样,
remote_tmp
可以来自库存主机和组变量,而不仅仅是配置文件或环境变量。如果变量的优先级设置在不同的位置,则需要注意它的优先级。使用此选项,您可以在该主机或一组主机的资源清册中设置
remote\u tmp
。Ansible将始终为该组中的一个或多个主机使用该路径,而无需在每个剧本或角色中定义该路径。如果需要更改该路径,则可以在资源清册中更改该路径,并在不进行任何其他编辑的情况下更改所有playbook运行的行为。以下是在静态资源清册中用作主机变量的示例:

因此,虽然在主机上“动态”设置远程tmp目录的具体问题本身并不是最佳实践主题,但它确实成为在Ansible中充分利用变量的最佳实践的一个例子

作为参考,远程临时目录由shell插件处理。虽然许多参数是共享的,但还有一些参数是特定于shell Ansible使用的。Ansible默认使用
sh


希望有帮助。愉快的自动化。

您可以在清单文件或组变量目录中使用
ansible\u remote\u tmp
为特定主机或主机组指定
remote\u tmp