Ansible Inventory指北进阶

Posted 运维部落

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible Inventory指北进阶相关的知识,希望对你有一定的参考价值。

Ansible Inventory指北进阶

Ansible的inventory文件定义了它要操作的一些主机,它可以通过inventory对这些主机进行操控。默认的inventory文件是/etc/ansible/hosts 。也可通过-i选项,来指定不同的inventory文件。


Ansible也支持从云中拉取inventory文件执行,拉取的文件可以试YMAL,ini,etc等格式。 这个是在ansbible 的 2.4版本新引入的功能,Ansible也有inventory的插件来让inventory变的更灵活和自定义化。


inventory的格式一般如下:


  
    
    
  
  1. mail.example.com

  2. [webservers]

  3. foo.example.com

  4. bar.example.com

  5. [dbservers]

  6. one.example.com

  7. two.example.com

  8. three.example.com



关于inventory的详细描述,参考我早期参与的翻译项目,Ansible 中文权威


动态inventory


静态 Inventory 指的是在文件中指定的主机和组,动态 Inventory 指通过外部脚本获取主机列表,并按照 ansible 所要求的格式返回给 ansilbe 命令的。这部分一般会结合 CMDB 资管系统、云计算平台等获取主机信息。

看到一段很不错的代码,参考下。

复制编辑



  
    
    
  
  1. #!/usr/bin/python

  2. #!/Users/aihe/.pyenv/shims/python

  3. #coding : utf-8

  4. import json

  5. import sys

  6. def group():

  7.    host1 = ['192.168.0.112']

  8.    host2 = ['192.168.0.112','192.168.0.109']

  9.    group1 = 'test1'

  10.    group2 = 'test2'

  11.    hostdata = {

  12.        group1:{"hosts":host1},

  13.        group2:{"hosts":host2}

  14.    }

  15.    print(json.dumps(hostdata,indent=4))

  16. def host(ip):

  17.    info_dict = {

  18.        "192.168.0.112": {

  19.            "ansible_ssh_host":"192.168.0.112",

  20.            "ansible_ssh_port":22,

  21.            "ansible_ssh_user":"root",

  22.            "ansible_ssh_pass":"123457"

  23.        },

  24.        "192.168.0.109": {

  25.            "ansible_ssh_host":"192.168.0.109",

  26.            "ansible_ssh_port":22,

  27.            "ansible_ssh_user":"root",

  28.            "ansible_ssh_pass":"xxxx"

  29.        }

  30.    }

  31.    # 判断key是否在字典中,在的话打印出来,不在的话打印空字典。

  32.    if ip in info_dict:

  33.        print(json.dumps(info_dict[ip],indent=4))

  34.    else:

  35.        print(json.dumps({},indent=4))

  36. if len(sys.argv) == 2 and (sys.argv[1] == '--list'):

  37.    group()

  38. elif len(sys.argv) == 3 and (sys.argv[1] == '--host'):

  39.    host(sys.argv[2])

  40. else:

  41.    print("Usage: %s --list or --host <hostname>" % sys.argv[0])

  42.    sys.exit(1)


  1. 单独执行的时候


    Ansible Inventory指北进阶


  2. 结合Ansible执行。虽然连接报错误了,但是这因为主机是随便定义的,如果是可以连接的主机则是正常工作的。


    Ansible Inventory指北进阶


到这里,其实我们的动态inventory大体框架已经出来了,剩下的则是将代码中的硬编码变为动态获取,数据库或其它持久存储的地方获取即可。


问题


在写这段代码的时候遇到几个问题,很有意思,解决问题的过程就是让我们成长的过程...
另外报的错误实在也是有点迷惑人啊。


inventory插件问题


  1. 错误截图,看到因为ini的插件无法解析json数据


    Ansible Inventory指北进阶


查看所有可用的插件列表

  
    
    
  
  1. ansible-doc -t inventory -l




Ansible Inventory指北进阶


  1. 更改ansible的inventory可用插件。启用Ansible插件的配置在/etc/ansible/ansible.cfg文件中,具体是那个文件在起作用,执行执行ansible --version命令就可以看到。

    Ansible Inventory指北进阶


修改插件的位置在。


Ansible Inventory指北进阶


执行格式问题


错误中还有关于执行格式错误的信息。


  1. 错误原因
    刚开始一直报执行格式错误问题,这个问题有点荒唐,因为我安装了pyenv,python执行的路径在开头写成了

  
    
    
  
  1. #!/Users/aihe/.pyenv/shims/python



而这个文件是sh文件,普通的可执行文本文件了,导致出错,晕掉...

  1. 解决方案

将开头的#!修改为python的解释器。然后就执行成功了。


  
    
    
  
  1. #!/usr/bin/python




最后


要知道inventory的格式,inventory在ansible中可以理解为主机清单。动态的inventory可以给我们提供很多便利的操作,我们可以更灵活的控制主机了。

如果你的数据格式,在已有的inventory插件中,你也可以自己尝试开发一个,


【the end】


长按关注运维部落(linux178)↓





以上是关于Ansible Inventory指北进阶的主要内容,如果未能解决你的问题,请参考以下文章

ansible配置多个inventory

ansible使用指北

Ansible_Inventory

Ansible_Inventory

Ansible与cmdb配合使用动态inventory

3,Ansible---动态Inventory