在剧本中执行期间,我需要设置一些ansible配置变量。我尝试了以下操作,但不起作用:
--> cat site.yml
- hosts: localhost
tasks:
- set_fact:
log_path: "/home/monk/test/ansible_set_run_time"
- hosts: localhost
environment:
log_path: "{{ log_path }}"
tasks:
- shell: "echo $log_path"
register: res
- debug:
msg: "log_path = {{ res.stdout }}"
当前目录中的 ansible.cfg
内容:
-->cat /home/monk/test/ansible.cfg
[defaults]
log_path = /home/monk/test/ansiblelog_from_cfg
这总是生成/home/monk/test/ansible.cfg
设置的日志文件,而不是剧本中设置的log_path
设置的日志文件。
为什么我不想使用/etc/ansible/ansible.cfg
,$PWD/ansible.cfg
或$HOME/.ansible.cfg
?
原因:我将在远程节点上运行此命令,该节点上已经存在一个/etc/ansible/ansible.cfg
文件,其中包含我无法更改的全局设置,同时我无法使用$PWD/ansible.cfg
,因为,我还需要/etc/ansible/ansible.cfg
的内容。
所以TLDR,我需要阅读/etc/ansible/ansible.cfg
和本地ansible.cfg
的内容,并同时使用它们。我可以全部合并,但无法控制/etc/ansible/ansible.cfg
的更改,因此合并的更改可能已过时。这就是为什么我要定义存储在剧本中的配置变量,而我将继续阅读/etc/ansible/ansible.cfg
。
ansible --version
ansible 2.5.2
config file = /home/monk/.ansible.cfg
configured module search path = [u'/home/monk/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python2.7/dist-packages/ansible
executable location = /usr/local/bin/ansible
python version = 2.7.15rc1 (default, Nov 12 2018, 14:31:15) [GCC 7.3.0]
我可以看到set_fact
正在显示所需的值,但是log_path
并未对剧本生效:
ansible-playbook -i data.ini playbook.yml
PLAY [localhost] **********************************************************************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************************************************************
ok: [127.0.0.1]
TASK [set_fact] ***********************************************************************************************************************************************************************************************
ok: [127.0.0.1]
PLAY [localhost] **********************************************************************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************************************************************
ok: [127.0.0.1]
TASK [command] ************************************************************************************************************************************************************************************************
changed: [127.0.0.1]
TASK [debug] **************************************************************************************************************************************************************************************************
ok: [127.0.0.1] => {
"msg": "log_path = /home/monk/test/ansible_set_run_time"
}
PLAY RECAP ****************************************************************************************************************************************************************************************************
127.0.0.1 : ok=5 changed=1 unreachable=0 failed=0
答案 0 :(得分:2)
请尝试以下。您可以使用shell环境变量进行设置。
export ANSIBLE_LOG_PATH="/home/monk/test/ansible_set_run_time"
ansible-playbook playbook.yml
答案 1 :(得分:0)
这不是配置变量的运行时修改,但这可以帮助满足您的要求。您可以阅读所有配置文件并将它们串联到$PWD/ansible.cfg
中。
这是ansible读取的ansible.cfg文件的优先顺序:
ANSIBLE_CONFIG (environment variable if set)
ansible.cfg (in the current directory)
~/.ansible.cfg (in the home directory)
/etc/ansible/ansible.cfg
因此您需要按以下顺序开始阅读,以便保留优先顺序:
/etc/ansible/ansible.cfg
~/.ansible.cfg (in the home directory)
ansible.cfg (in the current directory)
ANSIBLE_CONFIG (environment variable if set)
这将做什么:
这将同时保留您的配置,并保留其他ansible.cfg文件的配置。当然,这将覆盖文件之间的重叠变量,并保留最后一个文件的优先级。
从ansible 2.6开始,这只是已知的解决方案。请注意,串联文件中的变量越晚,它将覆盖先前出现的相同变量。