• Asible——inventory与大项目管理


    inventory

    Ansible使用清单的一个列表或者一组列表,同时针对多个被控机进行工作。定义了清单后,可以争对具体生产情况来对受管主机来进行分组。
    清单的默认文件的名为/etc/ansible/hosts。但我们平时习惯于在项目目录中单独建立一个inventory文件,把受管主机信息写入。执行playbook时用-i指定清单即可。

    inventory 别名

    平时我们为了更方便的辨认主机的用途,我们会为各个主机或者组来起别名,这样比直接使用IP地址更方便

    方式一:直接在inventory中对别名进行说明(INI格式)

    [root@localhost project2]# vim inventory 
    mysql_host ansible_password=123456  ansible_host=192.168.190.134   用ansible_host注明对应ip地址
    
    [root@localhost project2]# ansible mysql_host -m ping -i inventory   ping主机的时候用别名代替ip地址即可。playbook同理。
    mysql_host | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": false,
        "ping": "pong"
    }
    

    方式二:为了更方便的管理主机或组,可以在host_vars或group_vars中建立别名的文件,然后在里面表明ip地址(YAML格式)

    [root@localhost project2]# vim host_vars/mysql_host    在host_vars/mysql_host下说明密码和对应的ip地址
    ansible_host: 192.168.190.134 
    ansible_password: 123456
    
    [root@localhost project2]# ansible mysql_host -m ping -i inventory      同样ping通
    mysql_host | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": false,
        "ping": "pong"
    }
    

    通配符使用

    除了用别名外,我们可以用通配符来匹配主机

    注意:

    1. 通配符只是对字符串进行匹配,所以不会区分别名,域名,IP,组名。只要存在对应字符串的内容全都匹配。
    2. 来使用通配符来匹配主机时,必须使用'',否则ansible会报错。
    [root@localhost project2]# ansible 'mysql*' -m ping -i inventory    匹配mysql_host主机
    mysql_host | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": false,
        "ping": "pong"
    }
    

    列表

    可以在hosts中使用,来分隔多个主机的条目,使playbook对多个主机或组生效。

    各个条目并没有限制。可以是主机名,可以是ip,也可以是组名。主要存在于inventory中即可。

    vim test.yml 
    ---
    - name: test
      hosts: mysql_host,test,192.168.190.133   这里分别选用了 mysql_host主机,test组,以及ip:192.168.190.133
      tasks:
        - name:
          command: echo 'hello'
    
    TASK [command] ************************************************************************************   
    changed: [192.168.190.134]
    changed: [mysql_host]
    changed: [192.168.190.133]
    
    PLAY RECAP ****************************************************************************************
    192.168.190.133            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    192.168.190.134            : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    mysql_host                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
    

    多个清单

    inventory可以作为一个目录存在,在此目录中新建多个清单文件,在用-i参数选择清单的时候可以指定清单

    [root@localhost project]# ls inventory/  inventory目录下有两个清单文件
    db  web
    
    [root@localhost project]# ansible all -m ping -i inventory/web  只选取web下的清单
    192.168.190.134 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": false,
        "ping": "pong"
    }
    
    

    配置并行

    forks选项是Ansible原生支持的一种支持并发执行的方式,ansible默认只会创建5个进程,所以一次任务只能同时控制5台机器执行.那如果你有大量的机器需要控制,或者你希望减少进程数forks值默认是5,可以通过配置文件修改默认值。

    并行执行方式

    ansible默认是并行方式执行playbook,且forks值为5。所以ansible在执行playbook时,同时只会筛取被控对象中的前5台执行第一个task,执行完成之后再交由第二个5台被控对象进行执行第一个task,直到所有被控机第一个task执行完成之后再从头开始执行第二个task。

    修改forks的方式

    1. 配置文件直接修改(永久生效)
    [root@localhost project]# vim /etc/ansible/ansible.cfg   
    ......
    #forks          = 5             直接修改即可
    
    1. 命令行修改(临时)
    ansible/ansible-playbook  -f  7 直接指定forks值即可   只针对这一次动作
    
    

    管理滚动更新(serial)

    ansible由于是分批并行运行任务,所以有可能导致一部分主机长时间处于等待状态,影响业务进行。

    滚动更新方式

    滚动更新可以使指定的主机中的playbook全部执行完之后继续执行。

    关键字serial的运用

    serial关键字用来指定完全执行playbook的主机数目,依次以指定数目来处理hosts中整个对象

    [root@localhost project]# vim test1.yml
    ---
    - name: test
      hosts: all
      serial: 2                   设置serial值,优先把前2台主机的所有任务以及handlers执行完后再执行第三台主机
      tasks:
        - name: echo
          command: echo 'hello'
    
    
    TASK [Gathering Facts] ***********************************************************************
    ok: [192.168.190.134]
    ok: [192.168.190.133]
    
    TASK [echo] **********************************************************************************
    changed: [192.168.190.134]
    changed: [192.168.190.133]
    
    PLAY [test] **********************************************************************************
    
    TASK [Gathering Facts] ***********************************************************************
    ok: [192.168.190.135]
    
    TASK [echo] **********************************************************************************
    changed: [192.168.190.135]
    
    
    
    

    导入与包含

    如果playbook很长或很复杂,我们可以将其分成较小的文件,然后通过导入或者包含的方式来组合成完整的playbook。达到方便管理的作用。

    import与include的区别

    • include是一个动态操作。在playbook运行期间,Ansible会在内容到达时处理所包含的内容
    • import是一个静态操作。在运行开始之前,Ansible在最初解析playbook时预处理导入的内容

    导入子playbook

    关键字:import_playbook,
    例:

    第一个yml

    ---
    - hosts: 192.168.190.134
      tasks:
        - name: test
          command: echo 'hello world'
    

    第二个yml

    [root@localhost playbook]# vim date.yml 
    ---
    - hosts: 192.168.190.134
      tasks:
        - name: date
          template:
            src: ../template/date.j2
            dest: /opt/date.txt
    
    

    编写main.yml,连接以上2个playbook,完成后直接执行main.yml

    [root@localhost playbook]# vim main.yml 
    ---
    - name: import echo_hello.yml
      import_playbook: echo_hello.yml    
    - name: import date.yml
      import_playbook: date.yml
      
    root@localhost playbook]# ansible-playbook main.yml -i ../inventory/ 直接执行main.yml
    
    ......
    TASK [test] **********************************************************************************
    changed: [192.168.190.134]
    
    ......
    TASK [date] **********************************************************************************
    changed: [192.168.190.134]
      
    
    [root@localhost ~]# vi /opt/date.txt 被控机上文件已经成功生成
    show me 2020-09-12
    
    

    导入任务文件

    我们除了通过import_playbook的方式导入playbook外,我们还可以通过创建任务文件,并通过import_tasks来导入任务文件。

    注意:任务文件没有的格式与playbook类似,但是不具备执行条件,因为并没有hosts值以及tasks块。

    例:

    [root@localhost project2]# vim tasks/test1.yml       任务文件 
    - name: test
      template:
        src: ../template/date2.j2
        dest: /opt/date2.txt
    
    [root@localhost project2]# vim test.yml        playbook文件
    ---
    - hosts: 192.168.190.134
      tasks:
        - name: print date
          import_tasks: tasks/test1.yml
    
    
    

    注意:import_tasks和import_playbook处于不同的级别;import_playbook是与tasks平级;import_tasks则是tasks的子任务,所以书写时注意格式

    包含任务文件

    关键字:include_tasks

    例:

    [root@localhost project2]# vim test.yml 
    ---
    - hosts: 192.168.190.134
      tasks:
        - name: print date
          include_tasks: tasks/test1.yml         
    

    play中变量的运用

    [root@localhost project2]# vim tasks/test2.yml    任务文件中定义变量
    - name: test
      command: echo {{ echo_name }}
      register: result
    - debug:
        var: result
    
    [root@localhost project2]# vim test.yml 
    ---
    - hosts: 192.168.190.134
      tasks:
        - name: echo 
          import_tasks: tasks/test2.yml
          vars:                                         直接在导入任务下定义变量值,注意vars的级别时与import_tasks一个级别。也为tasks下一级别。
            echo_name: " hello world "
    
    [root@localhost project2]# ansible-playbook test.yml -i inventory 
            "start": "2020-09-14 20:47:27.109908",
            "stderr": "",
            "stderr_lines": [],
            "stdout": "hello world",
            "stdout_lines": [
                "hello world"
            ]
        }
    ......
  • 相关阅读:
    ASP.NET版本的Kindeditor插件的使用
    股票交易时间
    vs2010 安装mvc3
    JDK,JRE,JVM区别与联系
    使用 AngularJS 从零构建大型应用
    JavaScript奇技淫巧45招
    知道这20个正则表达式,能让你少写1,000行代码
    $timeout, $interval
    js页面loading加载
    jq倒计时
  • 原文地址:https://www.cnblogs.com/sawyer95/p/13650096.html
Copyright © 2020-2023  润新知