【问题标题】:Ansible not loading the "all" group variablesAnsible 未加载“所有”组变量
【发布时间】:2016-04-14 21:17:46
【问题描述】:

我有一个非常简单的 Ansible 设置。

group_vars/all/main.yml

symfony:
    env: prod
    owner: capistrano
    cache_owner: files
    cache_group: files
    deploy_base: /opt/symfony
    keep_count: 2

deploy.yml

# ...
  - name: roll forward latest release
    symfony_preload: version="{{ symfony.deploy_version }}" deploy_base="{{ symfony.deploy_base }}"

事实上,这个模块确实有效,只是 Ansible 似乎没有正确加载变量。我这样称呼 Ansible:

/usr/bin/ansible-playbook deploy.yml -i inventory/hosts \
    -e deploy_hosts=stg-web \
    -e symfony.deploy_version="$UPSTREAM_BUILD_NUMBER" \
    -e symfony.env="stg"

这失败了:

TASK [roll forward latest release] *********************************************
fatal: [webserver1]: FAILED! => {"failed": true, "msg": "'symfony' is undefined"}

这里出了什么问题? Ansible 是否会在命令行中使用自己的变量清除我的变量?

【问题讨论】:

    标签: ansible ansible-2.x


    【解决方案1】:

    需要两件事:

    1. 在 ansible.cfg 中指定 hash_behaviour = merge
    2. 以 JSON 格式传递哈希 --extra-var:

      → ansible-playbook playbooks/variables-demo.yml -e '{"symfony": {"deploy_version": "y", "deploy_base": "/some/other" } }'

    【讨论】:

    • ?谢谢!在使用哈希变量时,Ansible 中默认情况下不会合并,有点愚蠢。
    【解决方案2】:

    hash_behaviour = merge 不是推荐和更喜欢的做事方式。我可以向您展示更优雅的方法:

    group_vars/all/main.yml:

    symfony:
        env: "{{ ENV }}"
        owner: capistrano
        cache_owner: files
        cache_group: files
        deploy_base: /opt/symfony
        keep_count: 2
        deploy_version: "{{ DEPLOY_VERSION }}"
        deploy_hosts: "{{ DEPLOY_HOSTS }}"
    

    然后像这样调用你的 Ansible:

    /usr/bin/ansible-playbook deploy.yml -i inventory/hosts \
        -e "DEPLOY_HOSTS=stg-web" \
        -e "DEPLOY_VERSION$UPSTREAM_BUILD_NUMBER" \
        -e "ENV=stg"
    

    希望对你有帮助!

    【讨论】:

    • 为什么它不是推荐/首选的做事方式?这很有意义,应该是 IMO 的默认行为。
    猜你喜欢
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多