在Ansible中使用vars作为参数

时间:2016-12-09 12:21:12

标签: ansible ansible-playbook

我正在尝试在我的ansible剧本中使用变量。 ENV将作为命令行的输入传递。

---
- hosts: development
  sudo: yes
  sudo_user: root
  vars:
        env: "{{ ENV|default('DEV') }}"
  roles:
        # Copy conf files
        - { role: copy, src: ./conf/ems/7000/"{{ env }}"/*.conf , dest: /apps/tibco/config/ems/7000/data/ }
        - { role: copy, src: ./conf/ems/7000/"{{ env }}"/*.conf , dest: /apps/tibco/config/ems/7200/data/ }
        - { role: copy, src: ./conf/ems/7000/"{{ env }}"/*.conf , dest: /apps/tibco/config/ems/7004/data/ }

我通过命令

运行这个剧本
ansible-playbook -e 'ENV=DEV' --ask-sudo-pass install-ems-plybook.yml

我得到了

        # Copy conf files
        - { role: copy, src: ./conf/ems/7000/" {{env}} "/*.conf , dest: /apps/tibco/config/ems/7000/data/ }
                                               ^
We could be wrong, but this one looks like it might be an issue with
missing quotes.  Always quote template expression brackets when they
start a value. For instance:

    with_items:
      - {{ foo }}

Should be written as:

    with_items:
      - "{{ foo }}"

因为我还是Ansible的小孩,所以请明确回答。

1 个答案:

答案 0 :(得分:0)

主要问题

你不应该在字符串中间加上引号(./conf/ems/7000/"{{ env }}"/*.conf) - 这是你得到的错误信息 - 它应该是"./conf/ems/7000/{{ env }}/*.conf"

其他问题

你似乎真的想要定义任务而不是角色;我假设这是从参数的命名。

你没有指定(用文字表示)你想要实现的目标,我假设你想将文件从本地目录复制到目标节点上的目录。

一个主要问题是您无法在copy模块中使用通配符;复制您应使用with_fileglob的多个文件,请参阅Looping over Fileglobs

另一个小问题是sudosudo_user已被弃用并替换为becomebecome_user,它们仍然是产生警告消息的别名,但无法保证消失有一天。

一个工作示例剧本可能如下所示:

---
- hosts: development
  become: yes
  become_user: root
  vars:
    env: "{{ ENV|default('DEV') }}"
  tasks:
    - copy:
        src: "{{ item }}"
        dest: /apps/tibco/config/ems/7000/data/
      with_fileglob:
        - "./conf/ems/7000/{{ env }}/*.conf"

最后,在您的示例中,您将同一组文件从包含7000的目录复制到包含700072007004的目录。我不确定这是不是你想要的,但我把它留给你的定制。您可以按照上面的示例添加任务。