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

问题描述 投票:0回答:1

我有一个具有以下任务的剧本,必须将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

对于不同的目标服务器,目标路径每次都会不同!

清洁/家庭不是我的选择。答案here不幸对我来说不是很清楚。

ansible ansible-2.x
1个回答
1
投票

有几种不同的方法可以实现您的目标。哪一个是偏好问题和您的用例。

您找到了第一种方法,在运行playbook之前设置环境变量。非常适合快速的即时工作。记住每次运行某个剧本时都这样做确实很烦人。稍有不同的是使用environment关键字为游戏设置该变量。您还可以在角色,块或单个任务中设置环境变量。 https://docs.ansible.com/ansible/devel/reference_appendices/playbooks_keywords.html?highlight=environment%20directive。以下是使用它的一个例子:https://docs.ansible.com/ansible/devel/reference_appendices/faq.html?highlight=environment

在play等中使用environment关键字可以很好地用于自动化的特定应用程序,但如果您希望Ansible始终为特定服务器使用不同的远程tmp路径,该怎么办?与所有变量一样,remote_tmp可以来自库存主机和组变量,而不仅仅是配置文件或环境变量。如果在不同的地方设置变量优先级,则需要注意它。有了这个,您可以在您的库存中为该主机或一组主机设置remote_tmp。 Ansible将始终为该组中的主机或主机使用该路径,而无需在每个游戏或角色中定义它。如果您需要更改该路径,则可以在库存中更改它,并更改所有playbook运行的行为,而无需任何其他编辑。以下是在静态库存中用作主变量的示例:https://docs.ansible.com/ansible/devel/reference_appendices/faq.html?highlight=remote_tmp#running-on-solaris

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

作为参考,远程临时目录由shell插件处理。虽然许多参数是共享的,但还有其他特定于shell Ansible使用的参数。 Ansible默认使用shhttps://docs.ansible.com/ansible/latest/plugins/shell/sh.html

希望有所帮助。快乐的自动化。

© www.soinside.com 2019 - 2024. All rights reserved.