首页 > 解决方案 > 使 Ansible 使用非空 shell 环境

问题描述

在执行临时命令或剧本时,我遇到了一种情况,即/home/user-that-sudoed/.bashrc需要读取 ENV Vars,以便临时命令或剧本在目标清单主机上工作。在该.bashrc文件中,我们进行了设置LD_LIBRARY_PATH(对于我们正在使用的一些 Python 函数是必需的)。

是否有一个参数/home/local-user/.ansible.cfg可以有效地将“ /bin/sh -c”变成“ /bin/sh”而没有“ -c”?“ -c”(命令运行如下)。

ssh -q -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/tmp/.ansible/sockets/5c2164546a zlpv1229 '/bin/sh -c '"'"'sudo -H -S -n -u atg /bin/sh -c '"'"'"'"'"'"'"'"'echo BECOME-SUCCESS-cyhlvtntyqmbkkmcpkhhkspusdirgwlk; /sites/utils/bin/python'"'"'"'"'"'"'"'"' && sleep 0'"'"'' 

连接是“user@controller到” user@inventory_host,然后user@inventory_host变成“ user-that-sudoed

标签: pythonpython-2.7ansibleansible-2.x

解决方案


Ansible 允许使用environment关键字为单个任务设置环境变量

例子

- hosts: all

  tasks:
    - shell: /opt/local/my-binary
      environment:
        LD_LIBRARY_PATH: /opt/my/dir/

或者这也可以environment为剧本设置

- hosts: all

  environment:
    LD_LIBRARY_PATH: /opt/my/dir/

  tasks:
    …

因此,这比尝试按照您建议的方式进行要好。

希望能帮助到你

官方文档:https ://docs.ansible.com/ansible/2.6/user_guide/playbooks_environment.html


推荐阅读