- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想下载一些二进制文件,例如 Helm并使用 $PATH
使它们在全局范围内可用。为了避免使用 root 权限下载或者必须执行步骤(使用标准用户下载并移动到 $PATH
中的某个 bin 文件夹,例如 /usr/local/bin
),我的想法是创建 $HOME/bin
并将其添加到 $PATH
。
This blog article用于将自定义路径添加到 /etc/environment
。然后我将其重新加载为 described here .这是我的 POC 剧本,我尝试在其中添加 exa :
- name: Test
hosts: all
vars:
- bin: /home/vagrant/bin
tasks:
- name: Test task
file:
path: "{{bin}}"
state: directory
- name: Add {{bin}} to path
become: yes
lineinfile: >
dest=/etc/environment
state=present
backrefs=yes
regexp='PATH=(["]*)((?!.*?{{bin}}).*?)(["]*)$'
line="PATH=\1\2:{{bin}}\3"
- name: Check path1
shell: echo $PATH
- name: Download exa
unarchive:
src: https://github.com/ogham/exa/releases/download/v0.8.0/exa-linux-x86_64-0.8.0.zip
dest: "{{bin}}"
remote_src: yes
- name: reload env file
shell: for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done
- name: Check path after reload env file
shell: echo $PATH
- name: Test exa from PATH
shell: exa-linux-x86_64 --version
在最后一个 tash Test exa from PATH
中抛出错误:
"stderr": "/bin/sh: 1: exa-linux-x86_64: not found"
echo $PATH
命令都保留在
"stdout": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
但修改后的 /etc/environment
有效。当我在没有 ansible 的机器上使用 ssh 时,$PATH
很好,而且 exa-linux-x86_64 --version
也可以工作:
~$ echo $PATH
/home/vagrant/bin:/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/vagrant/bin:/snap/bin
Ubuntu 18.04 主机系统运行带有 Ubuntu 16.04 盒子的 Vagrant。 Ansible 由 Vagrant 在 Ubuntu 16.04 上执行。
像这样设置环境变量时
- name: Test exa from PATH
shell: exa-linux-x86_64 --version
environment:
PATH: "{{ ansible_env.PATH }}:{{bin}}"
它有效。但我必须至少在游戏层面应用这些台词。我想像 /etc/environment
在常规 shell 中那样全局设置它。 This questions似乎有相同的目标,但在 Solaris 上。 answear 似乎只从主机设置$PATH
,这对我没有用,因为自定义 bin 目录不存在。
- name: Test exa from PATH
shell: "{{bin}}/exa-linux-x86_64 --version"
这会减少开销,但您必须记住始终在命令前加上路径变量。似乎也容易出错
我想要一个真正的解决方案并了解导致问题的原因。我不清楚为什么 $PATH
修改在 Ansible 上如此困难,而在底层 linux 系统中它可以很容易地完成。 This question假设我们在 ansible 中没有交互式 session 。似乎没有可用的 $PATH
。根据the documentation ,我们可以通过将 -l
传递给 bash 来存档它。所以我发现以下工作:
- name: Test exa from PATH
shell: bash -l -c "exa-linux-x86_64 --version"
但是下面会导致错误:
- name: Test exa from PATH
shell: exa-linux-x86_64 --version
args:
executable: /bin/bash -l
Ansible 在这里用错误的 args 引号中断了命令:
"'/bin/bash -l' -c 'exa-linux-x86_64 --version'"
This ticket建议 Ansible 团队解决此问题,以便我们获得带有 $PATH
的登录 shell。自 2014 年以来,根本没有提供真正的解决方案。
$PATH
的不同 shell 类型的目的是什么? 最佳答案
回答你的问题
1) What is the purpose of different shell types that get access to the modified $PATH or not?
在 Ansible 支持的所有操作系统中统一它是不值得的。这也解释了“我不清楚为什么 $PATH 修改在 Ansible 上如此困难,而在底层 linux 系统中它可以很容易地完成。”
2) Why Ansible complicates things? Wouldn't it be easier to provide a login shell that solve this issue? Are there reasons why they did what they did?
相反,不关心它更容易。保持简单愚蠢是原因。
3) How can we deal with the resulting problems? What is best practice?
几十年来的最佳实践是 Tools, no policy
关于linux - Ansible 中全局修改的 $PATH 无法按常规 Linux shell 的预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55199479/
我的应用程序中有一个 settings.php 页面,它使用 $GLOBALS 来存储网络应用程序中使用的配置。 例如,他是我使用的一个示例设置变量: $GLOBALS["new_login_page
我正在尝试编译我们在 OS 类上获得的简单操作系统代码。它在 Ubuntu 下运行良好,但我想在 OS X 上编译它。我得到的错误是: [compiling] arch/i386/arch/start
我知道distcp无法使用通配符。 但是,我将需要在更改的目录上安排distcp。 (即,仅在星期一等“星期五”目录中复制数据),还从指定目录下的所有项目中复制数据。 是否有某种设计模式可用于编写此类
是否可以在config.groovy中全局定义资源格式(json,xml)的优先级,而不是在每个Resource上指定?例如,不要在@Resource Annotation的参数中指定它,例如: @R
是否有一些简单的方法来获取大对象图的所有关联,而不必“左连接获取”所有关联?我不能只告诉 Hibernate 默认获取 eager 关联吗? 最佳答案 即使有可能有一个全局 lazy=false(谷歌
我正在尝试实现一个全局加载对话框...我想调用一些静态函数来显示对话框和一些静态函数来关闭它。与此同时,我正在主线程或子线程中做一些工作...... 我尝试了以下操作,但对话框没有更新...最后一次,
当我偶然发现 this question 时,我正在阅读更改占位符文本。 无论如何,我回去学习了占位符。一个 SO 的回答大致如下: Be careful when designing your pl
例如,如果我有这样的文字: "hello800 more text 1234 and 567" 它应该匹配 1234 和 567,而不是 800(因为它遵循 hello 的 o,这不是一个数字)。 这
我一直在尝试寻找一种无需使用 SMS 验证系统即可验证电话号码(Android 和 iPhone)的方法。原因纯粹是围绕成本。我想要一个免费的解决方案。 我可以安全地假设 Android 操作系统会向
解决此类问题的规范 C++ 设计模式是什么? 我有一些共享多个类的多线程服务器。我需要为大多数类提供各种运行时参数(例如服务器名称、日志记录级别)。 在下面的伪 C++ 代码中,我使用了一个日志记录类
这个问题在这里已经有了答案: Using global variables in a function (25 个答案) 关闭 9 年前。 我是 python 的新手,所以可能有一个简单的答案,但我
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Does C++ call destructors for global and class static
我正在尝试使用 Objective-C 中的 ArrayList 的等价物。我知道我必须使用 NSMutableArray。我想要一个字符串列表 (NSString)。关键是我的列表应该可以从我类(c
今天刚开始学习 Android 开发,我找不到任何关于如何定义 Helper 类或将全局加载的函数集合的信息,我会能够在我创建的任何 Activity 中使用它们。 我的计划是创建(至少目前)2 个几
为什么这段代码有效: var = 0 def func(num): print num var = 1 if num != 0: func(num-1) fun
$GLOBALS["items"] = array('one', 'two', 'three', 'four', 'five' ,'six', 'seven'); $alter = &$GLOBALS
我想知道如何实现一个可以在任何地方使用您自己的设置的全局记录器: 我目前有一个自定义记录器类: class customLogger(logging.Logger): ... 该类位于一个单独的
我需要使用 React 测试库和 Jest 在我的测试中模拟不同的窗口大小。 目前我必须在每个测试文件中包含这个beforeAll: import matchMediaPolyfill from 'm
每次我遇到单例模式或任何静态类(即(几乎)只有静态成员的类)的实现时,我想知道这是否实际上不是一种黑客行为,因此只是为了设计而严重滥用类和实例的原则单个对象,而不是设计类和创建单个实例。对我来说,看起
这个问题在这里已经有了答案: Help understanding global flag in perl (2 个回答) 7年前关闭。 my $test = "There was once an\n
我是一名优秀的程序员,十分优秀!