【问题标题】:How to pass variable from shell to Ansible playbooks如何将变量从 shell 传递到 Ansible 剧本
【发布时间】:2015-06-26 10:56:51
【问题描述】:

我有一个 deploy.sh 脚本,我调用它来触发使用 ansible 的部署任务。简而言之,这是由deploy.sh触发的部署命令

DEPLOY_CMD="ansible-playbook -i hosts/$1 deploy.yml --extra-vars="site=$2 theme=$3""

这是一个任务的片段:

project_pre_build_commands_local:
   - path: "{{ project.local_path }}/web/app/themes/{{ theme }}"
     cmd: npm install
   - path: "{{ project.local_path }}/web/app/themes/{{ theme }}"
     cmd: bower install
   - path: "{{ project.local_path }}/web/app/themes/{{ theme }}"
     cmd: gulp --production

不幸的是,shell 错误:

msg: 无法切换到目录 '/home/ltarasiewicz/dev/bedrock-stack/bedrock-ansible/{# project.local_path #}/web/app/themes/{# theme #}': 路径确实 不存在

我传递给deploy.shtheme 变量是'cpkg'。指定的目录存在。更重要的是,如果我定义如下路径: - path: "{{ project.local_path }}/web/app/themes/cpkg"(去掉{{ theme }}变量),一切顺利——过程完成,没有错误。

我真的很困惑。非常感谢您的建议。

【问题讨论】:

    标签: shell ansible ansible-playbook


    【解决方案1】:

    您的DEPLOY_CMD 中的引号有问题。

    当您在 deploy.sh 脚本中 echo $DEPLOY_CMD 时,您应该会看到如下内容:

    ansible-playbook -i hosts/ deploy.yml --extra-vars=site=
    

    该变量不包含您的参数。

    为了解决这个问题,你可以使用单引号来代替:

    DEPLOY_CMD="ansible-playbook -i hosts/$1 deploy.yml --extra-vars='site=$2 theme=$3'"
    

    【讨论】:

    • 感谢您注意到它与 DEPLOY_CMD 相关。但是,当我在我的deploy.sh 中回显它时,当我将变量传递给它时,只有site 变量存在,而不是主题。不幸的是,Ansible 不能很好地解析单引号。它会出现“异常:拆分参数时出错,不平衡的 jinja2 块或引号”。必须有另一种方法将几个额外的变量传递给 Asnible
    • 我无法确认。刚刚测试了这个:ansible-playbook -i inventory/test test.yml --extra-vars='site=B theme=A'。我的测试手册中提供了 sitetheme 这两个变量。
    • 现在我可能知道问题出在哪里了。我一直在运行deploy.yml thourgh deploy.sh,但我在另一个文件中寻找theme。显然extra vars 不会变成全局的,所有文件都可以访问。
    猜你喜欢
    • 2018-09-21
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    相关资源
    最近更新 更多