如何在命令行中将变量传递给ansible playbook?

Édo*_*pez 189 variables command-line command-line-arguments ansible ansible-playbook

我是ansible的新手并且想知道如何这样做,因为以下不起作用

ansible-playbook -i '10.0.0.1,' yada-yada.yml --tags 'loaddata' django_fixtures="tile_colors"
Run Code Online (Sandbox Code Playgroud)

django_fixtures我的变量在哪里?

Édo*_*pez 278

阅读文档我发现在命令行上传递变量部分给出了这个示例:

ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"
Run Code Online (Sandbox Code Playgroud)

其他示例演示了如何从JSON字符串(≥ 1.2)或文件(≥ 1.3)加载

  • 另请注意,使用`--extra-vars`定义的变量将覆盖playbook中定义的变量. (29认同)
  • 另请注意(来自文档):使用“key=value”语法传入的值**解释为字符串**。如果您需要传递任何不应该是字符串的内容(布尔值、整数、浮点数、列表等),请使用 JSON 格式。例如: `--extra-vars '{"i_wasted_30_mins_debugging_a_boolean_string":true}'` (16认同)
  • 由于键值被解释为字符串,因此在我的脚本中我使用以下技术转换为整数:整数 }} (2认同)
  • 通过 cli 传递变量的另一种便捷方法是使用输入文件,例如 `ansible-playbook release.yml --extra-vars "@my-file.yml"` (2认同)

Gre*_*Rox 139

其他答案说明如何传入命令行变量而不是如何访问它们,所以如果你这样做:

--extra-vars "version=1.23.45 other_variable=foo"
Run Code Online (Sandbox Code Playgroud)

在您的yml文件中,您可以通过执行以下操作将这些内容分配给作用域的ansible变量:

vars:
    my_version: "{{ version }}"
    my_other_variable: {{ other_variable }}
Run Code Online (Sandbox Code Playgroud)

使用命令行参数的另一种方法是利用已在会话中定义的环境变量,您可以在ansible yml文件中引用这些变量,如下所示:

vars:
    my_version: "{{ lookup('env', 'version') }}"
    my_other_variable: {{ lookup('env', 'other_variable') }}
Run Code Online (Sandbox Code Playgroud)

  • 扩大的答案帮助了我.当然知道如何引用在知道如何传递参数的部分传递的变量.否则你不会传递它们而只是声明你想要传递变量.传递一个物体需要一个给予者和接收者.要传递变量,需要参数声明和参数的用法. (33认同)
  • 不确定你在说什么?我的回答*通过引用命令行标志--extra-vars*AND*如何在yaml配置中引用它们来扩展先前已接受的答案.然后我也提供另一种方法. (19认同)

lan*_*321 38

ansible-playbook release.yml -e "version=1.23.45 other_variable=foo"
Run Code Online (Sandbox Code Playgroud)

  • `-e`标志是`--extra-vars`的缩写形式 (23认同)
  • @AniruddhaJawanjal是的,像`--extra-vars"@ some_file.json"` (10认同)
  • 我可以传递变量文件吗? (3认同)
  • @OpsEco @AlanSE 请注意,如果您从文件中传递变量,则需要第二个 `--extra-vars` 标志来传递不在文件中的变量。例如`--extra-vars "@some_file.json" --extra-vars "other_variable=foo"` (3认同)

jar*_*arv 31

您可以使用该--extra-vars选项. 查看文档


小智 28

由于某种原因,上述答案都没有为我工作.因为我需要在Ansbile 2.2.0中将几个额外的变量传递给我的playbook,这就是我使用它的方法(注意每个var之前的-e选项):

ansible-playbook site.yaml -i hostinv -e firstvar=false -e second_var=value2
Run Code Online (Sandbox Code Playgroud)

  • `-e`是`--extra-vars`的缩写形式 (4认同)

Ali*_*kan 11

ansible-playbook test.yml --extra-vars "arg1=${var1} arg2=${var2}"
Run Code Online (Sandbox Code Playgroud)

在yml文件中,您可以像这样使用它们

---
arg1: "{{ var1 }}"
arg2: "{{ var2 }}"
Run Code Online (Sandbox Code Playgroud)

此外,--extra-vars并且-e是相同的,您可以使用其中之一.


小智 7

如果你想使用 shell 环境变量,这也对我有用:

ansible-playbook -i "localhost," ldap.yaml --extra-vars="LDAP_HOST={{ lookup('env', 'LDAP_HOST') }} clustername=mycluster env=dev LDAP_USERNAME={{ lookup('env', 'LDAP_USERNAME') }} LDAP_PASSWORD={{ lookup('env', 'LDAP_PASSWORD') }}"


sam*_*oon 6

--extra-vars在 Ansible 中,我们可以在运行 playbook 时通过使用(或) 参数在命令行传递变量来定义变量-e

以下是在命令行中将变量传递到 Ansible playbook 的一些方法:

方法一:key=value格式

ansible-playbook site.yml --extra-vars "arg1=demo1 arg2=demo2"
Run Code Online (Sandbox Code Playgroud)

方法二:JSON字符串格式

ansible-playbook site.yml --extra-vars '{"arg1":"demo1","arg2":"demo2"}'
Run Code Online (Sandbox Code Playgroud)

剧本site.yml将是:

---

- name: ansible playbook to print external variables
  hosts: localhost
  connection: local

  tasks:
  - name: print values
    ansible.builtin.debug:
      msg: "variable1 = {{ arg1 }}, variable2 = {{ arg2 }}"
    when: arg1 is defined and arg2 is defined
      
Run Code Online (Sandbox Code Playgroud)

方法3:从外部JSON文件读取

如果有很多特殊字符,请使用包含变量定义的 JSON 或 YAML 文件。

ansible-playbook site.yml --extra-vars "@vars.json"
Run Code Online (Sandbox Code Playgroud)

文件vars.json

{
   arg1: "demo1",
   arg2: "demo2"
}
Run Code Online (Sandbox Code Playgroud)


小智 5

ansible-playbok -i <inventory> <playbook-name> -e "proc_name=sshd"

您可以在以下剧本中使用上述命令。

---
- name: Service Status
gather_facts: False
tasks:
- name: Check Service Status (Linux)
shell: pgrep "{{ proc_name }}"
register: service_status
ignore_errors: yes
debug: var=service_status.rc`
Run Code Online (Sandbox Code Playgroud)


小智 5

 s3_sync:
      bucket: ansible-harshika
      file_root: "{{ pathoftsfiles  }}"
      validate_certs: false 
      mode: push
      key_prefix: "{{ folder }}"
Run Code Online (Sandbox Code Playgroud)

这里使用的变量命名为“pathoftsfiles”和“folder”。现在这个变量的值可以由下面的命令给出

sudo ansible-playbook multiadd.yml --extra-vars "pathoftsfiles=/opt/lampp/htdocs/video/uploads/tsfiles/$2 folder=nitesh"
Run Code Online (Sandbox Code Playgroud)

注意:在 shell 命令中将值传递给变量时不要使用引号