在Ansible中设置和使用环境变量

时间:2019-12-13 14:49:42

标签: ansible ansible-2.x ansible-inventory

我想在Ansible中将一个值设置为环境变量,然后在另一本剧本中使用它。 以下是我的剧本:

get_cmd.yaml

[root@a6296ab33a34 test_code]# vi get-cwd.yaml 

- hosts: localhost
  connection: local
  gather_facts: False

  tasks:

  #- name: Get directory
  #  shell: export ACWD="{{ playbook_dir }}"
  #  when: platform == 'jenkins'

  - name: Get CWD
    shell: "export ACWD=/test_code_demo"
    when: platform != 'jenkins'

  - name: DEMO
    shell: echo $ACWD

输出

[root@a6296ab33a34 test_code]# vi get-cwd.yaml 
[root@a6296ab33a34 test_code]# ansible-playbook get-cwd.yaml --extra-vars="@deploy-vars.yaml" -vv
 [WARNING] Ansible is being run in a world writable directory (/test_code), ignoring it as an ansible.cfg source. For more information see https://docs.ansible.com/ansible/devel/reference_appendices/config.html#cfg-in-world-writable-dir
ansible-playbook 2.8.4
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible-playbook
  python version = 2.7.5 (default, Jun 20 2019, 20:27:34) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
Using /etc/ansible/ansible.cfg as config file
 [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'


PLAYBOOK: get-cwd.yaml *********************************************************************************************************************************************************************************************************************
1 plays in get-cwd.yaml

PLAY [localhost] ***************************************************************************************************************************************************************************************************************************
META: ran handlers

TASK [Get CWD] *****************************************************************************************************************************************************************************************************************************
task path: /test_code/get-cwd.yaml:11
changed: [localhost] => {"changed": true, "cmd": "export ACWD=/test_code_demo", "delta": "0:00:00.713703", "end": "2019-12-13 14:43:37.054390", "rc": 0, "start": "2019-12-13 14:43:36.340687", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}

TASK [DEMO] ********************************************************************************************************************************************************************************************************************************
task path: /test_code/get-cwd.yaml:15
changed: [localhost] => {"changed": true, "cmd": "echo $ACWD", "delta": "0:00:00.705605", "end": "2019-12-13 14:43:37.919962", "rc": 0, "start": "2019-12-13 14:43:37.214357", "stderr": "", "stderr_lines": [], "stdout": "/test_code_dinesh", "stdout_lines": ["/test_code_dinesh"]}
META: ran handlers
META: ran handlers

PLAY RECAP *********************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@a6296ab33a34 test_code]#

您可以看到,尽管我尝试将值设置为 test_code_demo ,但仍旧的值 test_code_dinesh 仍在反映。

请让我知道解决上述问题的方法。

1 个答案:

答案 0 :(得分:1)

请记住,当您设置环境变量(在任何地方,不仅在Ansible中)时,它只会影响当前进程及其子进程。

当您运行类似这样的内容时:

  - name: Get CWD
    shell: "export ACWD=/test_code_demo"
    when: platform != 'jenkins'

您是:

  1. 产生外壳
  2. 在该shell中设置环境变量ACWD
  3. 退出外壳

这时,环境被破坏了。无法在一个任务中设置环境变量并使它影响另一任务。您可以使用任务上的environment键,按每个任务设置环境变量,如下所示:

  - name: DEMO
    shell: echo $ACWD
    environment:
      ACWD: '/test_code_demo'

如果您需要将环境设置应用于多个任务,则可以在播放时进行设置:

- hosts: localhost
  environment:
    ACWD: '/test_code_demo'
  tasks:
    - command: 'echo $ACWD'
      register: output1

    - command: 'echo $ACWD'
      register: output2

    - debug:
        msg:
          - "{{ output1.stdout }}"
          - "{{ output2.stdout }}"