在以 playbook 为目标的 ansible 主机中使用变量

Egi*_*jus 5 scope development-environment ansible

我正在尝试编写一个非常灵活的剧本,它根据主机所在的环境针对主机。我使用了尽可能多的变量,因此剧本可以以最小的更改重用于其他项目/环境。

我有一个 application.yml

---
- name: Prepare app-server for "The app"
  hosts: "{{'env'}}_super_app"
  vars:
  vars_files:
  - "environments/{{env}}.yml"
  sudo: yes
  tasks:
    - command: echo {{env}}
  roles:
    - common
    - nginx
    - php5-fpm
    - nodejs
    - newrelic
    - users
    - composer

- name: Install and configure mysql for "The super app"
  hosts:
  - "{{env}}_super_db"
  vars:
  vars_files:
  - "environments/{{env}}.yml"
  sudo: yes
  roles:
    - common
    - mysql
    - newrelic
Run Code Online (Sandbox Code Playgroud)

这是剧本目录结构:

??? environments
?   ??? prod.yml       << environment specific vars
?   ??? stag.yml       << environment specific vars
?   ??? uat.yml        << environment specific vars
??? roles
?   ??? common
?   ??? composer
?   ??? mysql
?   ??? newrelic
?   ??? nginx
?   ??? nodejs
?   ??? php5-fpm
?   ??? users
??? users
?   ??? testo.yml
??? prod              << inventory file for production
??? README.md
??? application.yml   << application playbook
??? stag              << inventory file for staging
??? uat               << inventory file for uat
Run Code Online (Sandbox Code Playgroud)

以下是uat清单文件的内容:

[uat_super_app]
10.10.10.4
[uat_super_db]
10.10.10.5
Run Code Online (Sandbox Code Playgroud)

当我运行我的剧本时,我将环境作为一个额外的变量传递:

ansible-playbook -K -i uat application.yml -e="env=uat" --check
Run Code Online (Sandbox Code Playgroud)

想法是:如果 {{env}} 设置为 uat,则将使用环境/uat.yml 变量,并且将基于 {{env}}_super_app 定位主机 [uat_super_app]。

如果我或任何人犯了错误并尝试针对生产库存运行 uat 变量,则主机将不匹配,并且 ansible 将不会运行剧本。

ansible-playbook -K -i prod application.yml -e="env=uat" --check
Run Code Online (Sandbox Code Playgroud)

当我在主机定位中不使用变量时,此剧本有效。问题是没有主机匹配任何一种方式:

ansible-playbook -K -i uat application.yml -e="env=uat" --check -vvvv

SUDO password: 
PLAY [Prepare app-server for "The app"] ******************************* 
skipping: no hosts matched

PLAY [Install and configure mysql for "The app"] ********************** 
skipping: no hosts matched

PLAY RECAP ******************************************************************** 
Run Code Online (Sandbox Code Playgroud)

udo*_*dan 2

hosts: "{{'env'}}_super_app"
Run Code Online (Sandbox Code Playgroud)

看起来您正在使用 string env,而不是变量,其计算结果为env_super_app。我想你的意思是:

hosts: "{{ env }}_super_app"
Run Code Online (Sandbox Code Playgroud)