在 Ansible 中使用 vars 作为参数

Using vars as an argument in Ansible

我正在尝试在我的 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 中还是个蹒跚学步的孩子。

主要问题:

您不应在字符串中间包含引号 (./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 的目录。我不确定这是否是您想要的,但我将其留给您进行定制。您可以按照上面的示例添加任务。