如何设置Ansible配置变量的运行时间

时间:2019-07-11 15:36:16

标签: ansible

在剧本中执行期间,我需要设置一些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

2 个答案:

答案 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开始,这只是已知的解决方案。请注意,串联文件中的变量越晚,它将覆盖先前出现的相同变量。