Day1-上午-Part2: 动态inventory

  • 2020-03-18
  • 231
  • 0

动态inventory


一.动态主机管理模块

1. add_host

  • 在playbook执行的过程中,动态的添加主机到指定的主机组中
  • 注意!因为是动态添加,所以最终不会在静态inventory文件(比如/etc/ansible/hosts)中修改什么,而是只在这一次ansible-playbook中生效
  • 常用参数:
    • groups:添加主机至指定的组
    • name:要添加的主机名或IP地址

2. group_by

  • 在playbook执行的过程中,动态的创建主机组
  • group_by要和facts配合使用,是通过facts的变量来实现的针对key的生成,然后根据key来筛选
  • group_by有两个选项:
    • key: The variables whose values will be used as groups
    • parents: 2.4版本添加,默认值是all,The list of the parent groups

二.动态inventory管理

1. 为什么要进行动态inventory的管理

  • 在前面我们所有的选取主机组的操作都是通过维护inventory文件来完成的。而事实上,当在大规模应用当中,如果主机达成千上万台,这个时候还手动维护inventory文件将会给运维工作带来巨大的挑战。
  • 又或者说,如果你的主机运行在AmazonEC2上,EC2维护你的主机信息,并且你可以通过EC2的Web接口、查询API或者awscli一类的命令行工具来随时获取这些信息。其他云计算服务商也有类似的接口。又或者你是自己管理服务器,但是在使用类似Cobbler或者UbuntuMAAS这样的自动化安装系统,并且自动化安装系统已经记录了你的服务器的信息。再或者,也许你有一个酷炫的配置管理数据库(CMDB),而它管理着所有的信息。
  • 在这种大规模的应用场景中,通常的做法是,将所有的主机都存储在cmdb当中。当需要对某一组主机或者某一类型的主机执行相应操作时,通过cmdb将相应主机取出来,动态的生成inventory,然后交由ansible处理即可。
  • 所以其实Ansible Inventory包含静态inventory和动态inventory两部分。而我们前面通过手动在inventory文件中维护主机列表的方式即称之为静态inventory。而动态inventory则是指通过外部脚本获取主机列表,并按照ansible所要求的格式返回给ansible指令的操作方式。
  • 动态inventory一般都会结合cmdb或者云计算平台等获取主机信息,由于主机资源一般会动态的进行增减,而这些系统一般会智能更新。我们需要通过这些工具提供的api或者接入库查询等方式返回主机列表。

2. 动态inventory脚本规约

  • 动态inventory脚本最终返回的满足ansible输出格式的json数据。ansible对于使用什么语言来实现动态inventory没有要求。但脚本必须支持两个参数:
    • –list:用于返回所有的主机组信息,每个组所包含的主机列表hosts、子组列表children、主机变量列表vars都应该是字典形式的,而_meta则用于存放主机变量
    • –host :返回指定主机的变量列表,也可返回一个空字典

3. 动态inventory脚本示例

脚本要设置-x权限

chmod +x ./dynamic_inventory.py

  • 执行脚本,返回如下:

  • 通过ansible操作示例如下:

[官方提供的如何自己写动态inventory的脚本的教程:You can also write your own inventory script]

三.ansible官方支持的动态inventory示例

1. Inventory script example: Cobbler

  • Cobbler是一个python写的运维自动化工具,继承pxe,dhcp,可以批量安装系统并进行系统自定义,ansible和cobbler无缝集成
  • ansible官方提供了脚本可以直接从cobbler的接口获取cobbler所管辖的主机的信息.
  • To tie your Ansible inventory to Cobbler, copy this script to /etc/ansible and chmod +x the file. Run cobblerd any time you use Ansible and use the -i command line option (e.g. -i /etc/ansible/cobbler.py) to communicate with Cobbler using Cobbler’s XMLRPC API.[这个脚本和cobbler通信后返回的ansible可以识别的动态inventory的格式]

2. Inventory script example: AWS EC2

  • 如果你的系统是运行在AWS的ec2上的,ansible也提供了脚本生成AWS的动态inventory: EC2 external inventory

3. Inventory script example: OpenStack

  • ansible提供了脚本从OpenStack生成动态inventory的脚本

4. 其他ansible当前提供的可以为各种场合生成动态inventory的脚本的存放在如下地方:

三.inventory目录及多源inventory

1. 多源inventory

  • You can target multiple inventory sources (directories, dynamic inventory scripts or files supported by inventory plugins) at the same time by giving multiple inventory parameters from the command line or by configuring ANSIBLE_INVENTORY. This can be useful when you want to target normally separate environments, like staging and production, at the same time for a specific action.

Target two sources from the command line like this:

[如果你有个多个inventory目录要在一次ansible的执行中全部调用,也是可以的,你可以选择用-i指定多个inventory目录,或者在ansible.cfg或环境变量ANSIBLE_INVENTORY中配置以逗号分隔配置多个inventory目录,ansible都可以识别]

  • Keep in mind that if there are variable conflicts in the inventories, they are resolved according to the rules described in How variables are merged and Variable precedence: Where should I put a variable?. The merging order is controlled by the order of the inventory source parameters. If [all:vars] in staging inventory defines myvar = 1, but production inventory defines myvar = 2, the playbook will be run with myvar = 2. The result would be reversed if the playbook was run with -i production -i staging.

[多inventory的变量合并顺序受inventory source parameters的控制,比如staging中的[all:vars]的变量会被production中的同名变量覆盖,但是如果以-i production -i staging的方式运行,则staging的变量优先级高于production变量]

2. inventory目录

  • If the location given to -i in Ansible is a directory (or as so configured in ansible.cfg), Ansible can use multiple inventory sources at the same time. When doing so, it is possible to mix both dynamic and statically managed inventory sources in the same ansible run. Instant hybrid cloud!

[如果在运行ansible的时候通过-i参数给出的inventory是一个目录,或者在ansible.cfg里配置的inventory的参数指向的一个目录,那么这时候ansible就尝试将这个目录下所有静态和动态的可解析的inventory的源合并后一起处理.]

  • In an inventory directory, executable files will be treated as dynamic inventory sources and most other files as static sources. Files which end with any of the following will be ignored:

~, .orig, .bak, .ini, .cfg, .retry, .pyc, .pyo

[inventory目录中的以上文件不会被处理,这些是默认参数,是可以修改的]

  • You can replace this list with your own selection by configuring an inventory_ignore_extensions list in ansible.cfg, or setting the ANSIBLE_INVENTORY_IGNORE environment variable. The value in either case should be a comma-separated list of patterns, as shown above.

[你可以通过修改ansible.cfg中的inventory_ignore_extensions的值和配置ANSIBLE_INVENTORY_IGNORE环境变量来确定在inventory目录中哪些文件ansible不需要去尝试解析]

  • The following inventory combines an inventory plugin source, a dynamic inventory script, and a file with static hosts:

[一个inventory目录样例,但是这个样例有问题,就是不好控制目录中各类inventory文件之间的组合顺序,组合顺序决定了变量的生效顺序]

  • It can be useful to control the merging order of the inventory sources if there’s variable conflicts or group of groups dependencies to the other inventory sources. The inventories are merged in alphabetical order according to the filenames so the result can be controlled by adding prefixes to the files: If 01-openstack.yml defines myvar = 1 for the group all, 02-dynamic-inventory.py defines myvar = 2, and 03-static-inventory defines myvar = 3, the playbook will be run with myvar = 3.

[给inventory目录中的文件头部加上数字-可以指定inventory目录的文件组合顺序,从而控制变量的生效及覆盖顺序,在下例中,如果01-openstack.yml为所有的group定义了myvar = 1, 02-dynamic-inventory.py再次定义了myvar = 2,同时03-static-inventory定义了myvar = 3,则playbook最终运行的时候会定义myvar = 3]

评论

还没有任何评论,你来说两句吧

津公网安备 12010302001147号 津ICP备18003766号