将参数从.sh文件传递到.yml文件?

时间:2018-04-17 11:36:13

标签: shell ansible

我是Ansible以及Ubuntu系统的新手。我想将.sh文件中的多个变量传递给.yml。我计划将所有输入变量存储在一个数组中,然后在调用文件distributed-setup.yml时使用for循环逐个传递变量。

目前,我正在尝试传递变量。为此,我遵循以下步骤。

  1. 执行First.sh文件时,我传递的变量如First.sh Input.yaml

  2. First.sh文件就像这样

    echo $1
    ansible-playbook distributed-setup.yml --extra-vars="v:$1" -${1:-v} | tee output.txt
    
  3. 分布式setup.yml

    ---
    - name: Executing slaves
      hosts: slave
      gather_facts: no
      vars:
          v: "{{lookup('env','v') }}"
          contents: "{{ lookup('file','/home/ubuntu/Ansible-setup/Distributed-Ubuntu-Setup/Input/Input.yaml') | from_yaml }}"
          log: "{{ contents['log'][0] }}"
          timeout: "{{ contents['ansible-timeout'][0] }}"
    
  4. 在该行中,内容:我需要使用变量'v'而不是Input.yaml。

    怎么做?

2 个答案:

答案 0 :(得分:0)

最简单的方法之一是通过环境

someVar=value ansible-playbook ...

然后,在Ansible代码中,您可以参考ansible_env.someVar。您也可以export变量,而不需要在同一行上定义它。

为了使您的用例更加具体:

input_yaml=/home/ubuntu/Ansible-setup/Distributed-Ubuntu-Setup/Input/Input.yaml
export input_yaml
ansible-playbook distributed-setup.yml

...并在您的Ansible文件中:

contents: "{{ lookup('file', ansible_env.input_yaml) | from_yaml }}"

答案 1 :(得分:0)

这是您可以在其他变量中使用变量v的方法:

---
- hosts: localhost
  connection: local
  gather_facts: no
  vars:
    v: "{{ lookup('env','v') }}"
    b: "{{ lookup('file','/tmp/{{ v }}') | from_yaml }}"

  tasks:
  - name: set contents
    set_fact:
      contents: "{{ lookup('file','/tmp/{{ v }}') | from_yaml }}"

  - name: debug
    debug:
      msg: "{{ b }} == {{ contents }}"
    when: b == contents

v将获取现有环境var v的值,然后在任务中的var b上使用它,以防万一创建另一个名为contents的变量在这种情况下使用set_fact

的值为b

进行测试:

$ export v=foo
$ date > /tmp/foo
$ ansible-playbook test.yml

它会将v设置为foo,然后在/tmp/foo中创建一个文件,其中包含当前日期(date命令的输出)