在 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
另一个小问题是 sudo
和 sudo_user
被弃用并替换为 become
和 become_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
的目录复制到包含 7000
、7200
和 7004
的目录。我不确定这是否是您想要的,但我将其留给您进行定制。您可以按照上面的示例添加任务。
我正在尝试在我的 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
另一个小问题是 sudo
和 sudo_user
被弃用并替换为 become
和 become_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
的目录复制到包含 7000
、7200
和 7004
的目录。我不确定这是否是您想要的,但我将其留给您进行定制。您可以按照上面的示例添加任务。