设计Ansible结构和变量

时间:2017-04-29 22:55:50

标签: ansible

过去几周我一直在玩Ansible,试图开始使用我们目前用于冷启动/配置的一组bash脚本。我已经查看了Galaxy中的存储库,但是有很多角色似乎不适合我的例子,所以他们更难学习。无论如何,我们的库存工作方式是我们有一堆主机,大约75%的角色相同。但是,根据有关特定主机的变量,有很多决定要做。一个简单的例子是,只有当主机/库存具有某个硬件时,我们才会想要编写一个角色来安装某些软件。除了硬件之外,我们必须根据主机名运行特定的角色/剧本,或者更优选地,某种类型的组织具有某些变量,例如"这个主机是否需要X功能",其中X只是一些任意的前确定的事情。所以我认为我们可以有很多组,其中库存组就像:" has_x_hardware"或" needs_x_software",然后列出具有该硬件的所有主机。但是我可以看到,随着主持人一遍又一遍地重复进入大量的群体,我不会想到这个工具应该如何使用。

一个简单的示例来展示我正在使用的内容,我尝试转换的很多bash脚本都是这样的:

if [ "${hostname}" = "hostname1" ] || [ "${hostname}" = "hostname2" ] || ... [ "$(hostname)" = "hostnamex" ; then install_software_feature_X fi

现在我如何转换它而不说:

when: some_hostname == hostname1 or some_hostname == hostname2

但这似乎会失去控制。

所以我知道这是一个普通的电子邮件,其中只有很少的特定的问题,但我不确定是否有基于主机名/库存的变量,其中每个主机名都有一大组变量,或尝试创建基于组的变量,但问题是我们没有像#34;数据库"或者#34;负载均衡器"等几个组。数据库主机或所有负载平衡器获得相同的软件。我们的主机有很多变量/决策(它有X,Y和/或Z硬件,是否需要软件X,Y和Z?)组织如何处理所有这些比复杂更复杂的变量一些小组并将所有这些小组设置为相同。我大多问的问题是:我是否认为这个问题都错了,我错过了什么大事?我应该遵循哪些最佳实践,这使我的任务更容易。

非常感谢您阅读本文!

1 个答案:

答案 0 :(得分:1)

Ansible非常容易理解,请阅读Ansible推荐的布局ansible recommended layout

变量可以在库存,剧本,角色等中定义。 variables-defined-in-inventory

只是一个例子:

playbook-foobar/
├── ansible.cfg
├── requirements.yml
├── roles/nginx
├── inventories
│   ├── development
│   |   ├── group_vars
│   |   │   └── all
│   |   └── hosts
│   └── production
│       ├── group_vars
│       │   └── all
│       └── hosts    
├── site.yml
└── playbooks
    ├── web.yml

示例:

ansible-playbook -i environments/development/hosts playbooks/web.yml --extra-vars "target=web" --flush-cache

主持文件:

[web]
web1 ansible_ssh_host=52.0.0.1
web2 ansible_ssh_host=52.0.0.2

[database]
db1 ansible_ssh_host=52.0.0.3

web.yml

---
- hosts: '{{ target }}'
  gather_facts: True
  remote_user: ubuntu
  become: yes
  become_user: root
  become_method: sudo

  roles:
      - { role: 'nginx', tags: 'nginx', gather_facts: True, become: yes, become_user: root, become_method: sudo }