Ansible:通过 yml 剧本更改脚本值(.sh 文件)

Ansible: Change script value (.sh file) via yml playbook

例如,我的剧本的相关部分如下所示:

tasks:
  - name: test
    script: ../test.sh
    ...

对于我的 test.sh 有这样一行代码将执行 python 脚本:

python run.py --inputvar hello

有没有办法将 .sh 文件中的 inputvar 值从“hello”更改为剧本中的其他内容?

编辑: 感谢@seshadri_c 对此的帮助。猜猜这个问题应该被标记在 shell 脚本下。

在 shell 脚本中解析参数的最简单方法是使用位置参数 - </code>、<code>

给定一个 test.sh 脚本:

#!/bin/bash

python run.py --inputvar 

并且运行将其设置为:

/bin/bash test.sh arg1

会将 </code> 的值作为 <code>--inputvar arg1 传递给 run.py

来自 Ansible 任务的 运行 同样的事情:

tasks:
  - name: test
    script: ../test.sh arg1

还有更多选择。

  1. 第一个可能是 lineinfile,例如下面的任务是幂等的
    - lineinfile:
        path: test.sh
        regex: '^python run.py --inputvar (.*)$'
        line: 'python run.py --inputvar {{ my_var|default("hello") }}'

给予

TASK [lineinfile] *******************************************************
ok: [localhost]

如果定义变量my_var(参见Variable precedence: Where should I put a variable?

my_var: hello world

任务将更改文件中的行。 (运行 带有选项的剧本 --check --diff

TASK [lineinfile] ********************************************************
--- before: test.sh (content)
+++ after: test.sh (content)
@@ -1,3 +1,3 @@
 #!/usr/bin/sh
 
-python run.py --inputvar hello
+python run.py --inputvar hello world

changed: [localhost]

下一个选项可能是 template,例如模板 test.sh.j2 和下面的任务给出相同的结果

shell> cat test.sh.j2
#!/usr/bin/sh

python run.py --inputvar {{ my_var|default("hello") }}
    - template:
        src: test.sh.j2
        dest: test.sh