在Ansible中设置环境似乎不起作用

时间:2016-03-16 17:56:42

标签: ansible

Consul查找插件具有以下代码。我想通过设置ANSIBLE_CONSUL_URL的环境变量来覆盖。我似乎无法使用环境变量来完成任务。如果我在运行任务之前手动设置环境变量,则任务运行正常。

self.agent_url = 'http://localhost:8500'
if os.getenv('ANSIBLE_CONSUL_URL') is not None:
    self.agent_url = os.environ['ANSIBLE_CONSUL_URL']

我的任务:

- name: Build list of modules and its associated tag
  environment:
     ANSIBLE_CONSUL_URL: "http://indeploy001.local.domain:8500"
  set_fact: deploy_list="{{ item | replace("deploys/" + environment_id  + "/",'') }}-{{ lookup('consul_kv','deploys/' + environment_id + '/' + item) }}"
  with_items: "{{ modules }}"
  register: deploy_list_result

错误

TASK: [Build list of modules and its associated tag]     **************************
fatal: [127.0.0.1] => Failed to template deploy_list="{{ item |    replace("deploys/" + environment_id  + "/",'') }}-{{ lookup('consul_kv','deploys/' + environment_id + '/' + item) }}": Error locating 'deploys/sf/ariaserver' in kv store. Error was HTTPConnectionPool(host='localhost', port=8500): Max retries exceeded with url: /v1/kv/deploys/sf/ariaserver (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x1eac410>: Failed to establish a new connection: [Errno 111] Connection refused',))

FATAL: all hosts have already failed -- aborting

1 个答案:

答案 0 :(得分:0)

查找是一个模板功能。在执行任务之前,将呈现任务的键以解析任何Jinja表达式。这意味着您的查找在任务执行之前执行。环境键只是一个任务属性,它在执行任务时起作用。但是你没有那么远。

另外,我不能100%确定在function PopulateTable(table){ var $this = $(table); var $url = $this.data('url'); $.ajax({ url: $url, type: 'POST', success: function(result) { console.log(result); result.each(function(k, v){ console.log(k + " " + v); }); } }); } 任务中使用的特殊情况下您的环境会发生什么。 set_fact是一个在控制计算机上运行的动作插件。查找也是如此。但是任务本身并未委托给localhost。因此,可以为控制机器或远程机器设置env var。我的猜测是,它根本没有设置,无论是在localhost还是远程。我猜测的原因是,许多动作插件在此过程中稍后会调用具有相同名称的模块,然后在目标主机上执行。逻辑行为以及用户期望的是,模块将在远程主机上设置env var。鉴于第一段,只是猜测和忽略。

结论: 如果查找插件依赖于环境变量,则无法在同一任务中设置它们。它们需要先设置 - 你已经找到了工作。