首页 文章

在剧本中使用目标的ansible主机中的变量

提问于
浏览
4

我正在尝试编写一个非常灵活的Playbook,它基于它们所处的环境来定位主机 . 我正在使用尽可能多的变量,因此可以将其重复用于其他项目/环境 .

我有一个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

这是playbook目录结构:

├── 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

以下是uat库存文件的内容:

[uat_super_app]
10.10.10.4
[uat_super_db]
10.10.10.5

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

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

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

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

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

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

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 ********************************************************************

2 回答

  • 2
    hosts: "{{'env'}}_super_app"
    

    看起来你正在使用字符串 env ,而不是变量,它的计算结果为 env_super_app . 我想你的意思是:

    hosts: "{{ env }}_super_app"
    
  • 1

    谢谢udondan,但那没用 .

    解决方案是以类似于剧本期望看到它们的方式传递变量 .

    如果我在剧本中指定env,我会:

    ---
    - name: Prepare app-server for "The app"
      hosts: uat_super_app
      vars:
        - env: uat
    

    所以传递变量的正确方法是:

    ansible-playbook -K -i uat application.yml -e='vars: env=uat'
    

    为了测试这个,我使用了--list-hosts选项:

    ansible-playbook -K -i uat application.yml -e='vars: env=uat' --list-hosts
    
    playbook: application.yml
    
      play #1 (Prepare app-server for "The super app"): host count=1
        10.10.10.4
    
      play #2 (Install and configure mysql for "The super app"): host count=1
        10.10.10.5
    

相关问题