zoukankan      html  css  js  c++  java
  • Inventory 详解

    Inventory 详解

    Ansible 可以根据Inventory文件实现同时配置多个系统。这个文件位于/etc/ansible/hosts。实际使用的时候可以编写多个Inventory文件,使用的时候用-i参数临时指定就行。

    这个文件不仅可以自己编写、编写多个。配置的时候不光可以使用本地的资源,也可以使用云端的资源。

    这个文件可以编写成多种格式,常用的有:INIYAML

    Inventory基础:多台主机分组

    表示同一个意思的inventory文件可以用INI写也可以用YAML写,不过需要安装对应的插件。

    INI格式的是这样:

    mail.example.com
    
    [webservers]
    foo.example.com
    bar.example.com
    
    [dbservers]
    one.example.com
    two.example.com
    three.example.com
    

    方括号里面的是组名,未达到见名知义的效果,最好让这个名字体现出:这是个什么操作系统,它被用来干什么事,一般什么时间运行。

    这个文件用YAML格式写是这样:

    all:
      hosts:
        mail.example.com:
      children:
        webservers:
          hosts:
            foo.example.com:
            bar.example.com:
        dbservers:
          hosts:
            one.example.com:
            two.example.com:
            three.example.com:
    

    将多台主机配置到多个组

    可以给多个组同时装系统,于是可以做到这种效果:一台主机既是一个web服务器,又是一个数据库服务器

    创建组的时候可以用这样一种思路:

    • 用来干啥

      应用,栈,微服务。比如: database serversweb servers

    • 在哪里

      在哪个数据中心或哪个区域的本地的DNS服务器,storage存储服务器。比如:eastwest

    • 什么阶段

      开发阶段,需要避免测试线上代码。比如:prodtest

    包含以上的三种思想的YAML格式的Inventory文件可以写成这样:

    all:
      hosts:
        mail.example.com:
      children:
        webservers:
          hosts:
            foo.example.com:
            bar.example.com:
        dbservers:
          hosts:
            one.example.com:
            two.example.com:
            three.example.com:
        east:
          hosts:
            foo.example.com:
            one.example.com:
            two.example.com:
        west:
          hosts:
            bar.example.com:
            three.example.com:
        prod:
          hosts:
            foo.example.com:
            one.example.com:
            two.example.com:
        test:
          hosts:
            bar.example.com:
            three.example.com:
    

    可以看到one.example.comdbservers组中,也在east组中,也在prod组中。

    也可以使用嵌套的方式简化这个文件:

    all:
      hosts:
        mail.example.com:
      children:
        webservers:
          hosts:
            foo.example.com:
            bar.example.com:
        dbservers:
          hosts:
            one.example.com:
            two.example.com:
            three.example.com:
        east:
          hosts:
            foo.example.com:
            one.example.com:
            two.example.com:
        west:
          hosts:
            bar.example.com:
            three.example.com:
    # 以上相同        
        prod:
          children:
            east:
        test:
          children:
            west:
    

    如果用了这种简写的方法,要注意变量代表它包含的所有主机。

    多台主机使用不同端口

    如果有的主机没有用默认ssh端口,那么在主机名后加上端口就行。

    如果要配置的主机的端口号确实不是默认端口22,那最好还是配一下端口。

    就像这样:

    badwolf.example.com:5309
    

    如果主机的IP是静态的,不会变更,而且连接的时候需要通过隧道连接,那可以在hosts文件中配置一下别名。

    INI文件这样配:

    jumper ansible_port=5555 ansible_host=192.0.2.50
    别名    端口号             主机名
    

    YAML文件这样配:

    ...
      hosts:
        jumper:
          ansible_port: 5555
          ansible_host: 192.0.2.50
    

    如果写入的主机名称有统一的模式,可以这样简写:

    INI格式:

    [webservers]
    www[01:50].example.com
    

    YAML格式:

    ...
      webservers:
        hosts:
          www[01:50].example.com:
    

    对于数字的模式匹配,前导0可以根据需要加上或者去掉,前后的范围是闭区间的,两个边界值都可以取到。

    也可以定义字母范围:

    [databases]
    db-[a:f].example.com
    

    也可以选择连接类型每个主机的用户:

    [targets]
    
    localhost              ansible_connection=local
    other1.example.com     ansible_connection=ssh        ansible_user=mpdehaan
    other2.example.com     ansible_connection=ssh        ansible_user=mdehaan
    主机                    连接类型                       连接用户
    

    如上所述,在inventory文件中设置这些只是一种简化方法,稍后我们将讨论如何将它们存储在host_vars目录中的各个文件中。

    用变量指代一台主机:主机变量

    主机也可以用变量指代,而且现在指定的变量在后面的playbook中会用到。

    INI格式:

    [atlanta]
    host1 http_port=80 maxRequestsPerChild=808
    host2 http_port=303 maxRequestsPerChild=909
    

    YAML格式:

    atlanta:
      host1:
        http_port: 80
        maxRequestsPerChild: 808
      host2:
        http_port: 303
        maxRequestsPerChild: 909
    

    用变量指代多台主机:组变量

    变量也可以一次应用到整个组。

    INI格式:

    [atlanta]
    host1
    host2
    
    [atlanta:vars]
    ntp_server=ntp.atlanta.example.com
    proxy=proxy.atlanta.example.com
    

    YAML格式:

    atlanta:
      hosts:
        host1:
        host2:
      vars:
        ntp_server: ntp.atlanta.example.com
        proxy: proxy.atlanta.example.com
    

    组变量继承:子组变量

    也可以配置子组,以及使用子组变量

    INI格式 YAML格式
    子组 :children children:
    子组变量 :vars vars:

    INI格式:

    [atlanta]
    host1
    host2
    
    [raleigh]
    host2
    host3
    
    [southeast:children]
    atlanta
    raleigh
    
    [southeast:vars]
    some_server=foo.southeast.example.com
    halon_system_timeout=30
    self_destruct_countdown=60
    escape_pods=2
    
    [usa:children]
    southeast
    northeast
    southwest
    northwest
    

    YAML格式:

    all:
      children:
        usa:
          children:
            southeast:
              children:
                atlanta:
                  hosts:
                    host1:
                    host2:
                raleigh:
                  hosts:
                    host2:
                    host3:
              vars:
                some_server: foo.southeast.example.com
                halon_system_timeout: 30
                self_destruct_countdown: 60
                escape_pods: 2
            northeast:
            northwest:
            southwest:
    

    几个默认组

    有两个默认组:allungrouped

    all包含所有主机

    ungrouped包含只属于all组的主机

    每个主机至少属于两个组

    尽管allungrouped始终存在,但它们可以是隐式的,不会出现在group_names之类的组清单中。

  • 相关阅读:
    stat 命令家族(2)- 详解 pidstat
    stat 命令家族(1)- 详解 vmstat
    Linux常用命令
    Linux常用命令
    Linux常用命令
    Linux常用命令
    Linux常用命令
    Linux常用命令
    打通MySQL架构和业务的任督二脉
    PostgreSQL JOIN LATERAL
  • 原文地址:https://www.cnblogs.com/junsircoding/p/15665098.html
Copyright © 2011-2022 走看看