【问题标题】:How can I pass variable to ansible playbook in the command line?如何在命令行中将变量传递给 ansible playbook?
【发布时间】:2015-08-20 03:22:40
【问题描述】:

我是 ansible 的新手,不知道该怎么做,因为以下方法不起作用

ansible-playbook -i '10.0.0.1,' yada-yada.yml --tags 'loaddata' django_fixtures="tile_colors"

django_fixtures 是我的变量。

【问题讨论】:

    标签: variables command-line command-line-arguments ansible ansible-playbook


    【解决方案1】:

    阅读文档我找到了Passing Variables On The Command Line 部分,它给出了这个例子:

    ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"
    

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

    【讨论】:

    • 另请注意,使用--extra-vars 定义的变量将覆盖剧本中定义的变量。
    • 另请注意(来自文档):使用 key=value 语法传入的值解释为字符串。如果您需要传入不应该是字符串的任何内容(布尔值、整数、浮点数、列表等),请使用 JSON 格式。例如:--extra-vars '{"i_wasted_30_mins_debugging_a_boolean_string":true}'
    • 由于键值被解释为字符串,在我的脚本中,我使用以下技术转换为整数:{{ myVar |整数}}
    【解决方案2】:

    如果您想使用 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') }}"

    【讨论】:

      【解决方案3】:
       s3_sync:
            bucket: ansible-harshika
            file_root: "{{ pathoftsfiles  }}"
            validate_certs: false 
            mode: push
            key_prefix: "{{ folder }}"
      

      这里的变量被命名为'pathoftsfiles'和'folder'。现在这个变量的值可以通过下面的命令给出

      sudo ansible-playbook multiadd.yml --extra-vars "pathoftsfiles=/opt/lampp/htdocs/video/uploads/tsfiles/$2 folder=nitesh"
      

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

      【讨论】:

        【解决方案4】:
        ansible-playbook release.yml --extra-vars "username=hello password=bye"
        
        #you can now use the above command anywhere in the playbook as an example below:
        tasks:
        - name: Create a new user in Linux
        shell: useradd -m -p {{username}} {{password}}"
        

        【讨论】:

          【解决方案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`
          

          【讨论】:

            【解决方案6】:
            ansible-playbook test.yml --extra-vars "arg1=${var1} arg2=${var2}"
            

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

            ---
            arg1: "{{ var1 }}"
            arg2: "{{ var2 }}"
            

            另外,--extra-vars-e 是相同的,你可以使用其中之一。

            【讨论】:

              【解决方案7】:

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

              --extra-vars "version=1.23.45 other_variable=foo"
              

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

              vars:
                  my_version: "{{ version }}"
                  my_other_variable: {{ other_variable }}
              

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

              vars:
                  my_version: "{{ lookup('env', 'version') }}"
                  my_other_variable: {{ lookup('env', 'other_variable') }}
              

              【讨论】:

              • 不确定你在说什么??我的答案扩展 以前接受的答案通过参考命令行标志 --extra-vars AND 如何在您的 yaml 配置中引用它们。然后我也提供了另一种方法。
              • 这里的问题是专门通过命令行传递变量。这就是为什么它会更好,因为它有自己的问题/答案和相关链接。您可以将相关链接作为对问题的评论。
              • 扩展的答案帮助了我。肯定知道如何引用传递的变量部分知道如何传递参数。否则,您不会传递它们,而只是声明您要传递变量。传递一个对象需要一个给予者和接受者。传递变量需要参数声明和参数的用法。
              • lookup('env', SOMETHING) 匹配 12 因子。
              • 记得改变量名:version: {{ version }}是错误的,比如自己定义version
              【解决方案8】:

              由于某种原因,上述答案均不适合我。由于我需要在 Ansbile 2.2.0 中将几个额外的变量传递给我的剧本,这就是我让它工作的方式(注意每个变量之前的 -e 选项):

              ansible-playbook site.yaml -i hostinv -e firstvar=false -e second_var=value2
              

              【讨论】:

              • -e--extra-vars的简写形式
              • @LXCdev KohaLappi +1 证明您可以在自己的 -e 标志中指定其他变量
              • 您还可以使用单个标志定义多个变量:-e "firstvar=false second_var=value2"
              • 同样的问题。具有单个标志的多个变量将不起作用。我想知道为什么?
              【解决方案9】:
              ansible-playbook release.yml -e "version=1.23.45 other_variable=foo"
              

              【讨论】:

              • -e 标志是--extra-vars 的缩写形式
              • 我可以传递变量文件吗?
              • @AniruddhaJawanjal 是的,比如--extra-vars "@some_file.json"
              • @OpsEco @AlanSE 请注意,如果您从文件中传递变量,则需要第二个 --extra-vars 标志来传递不在文件中的变量。例如--extra-vars "@some_file.json" --extra-vars "other_variable=foo"
              • 谢谢@bonh,这正是我想要的
              【解决方案10】:

              您可以使用--extra-vars 选项。 See the docs

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-04-22
                • 2020-06-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多