• ansible核心模块playbook介绍


    ansible的playbook采用yaml语法,它简单地实现了json格式的事件描述。yaml之于json就像markdown之于html一样,极度简化了json的书写。在学习ansible playbook之前,很有必要把yaml的语法格式、引用方式做个梳理。

    1.1 初步说明

    以一个简单的playbook为例,说明yaml的基本语法。

    ---
        - hosts: 192.168.100.59,192.168.100.65
          remote_user: root
          pre_tasks:
            - name: set epel repo for Centos 7
              yum_repository:
                name: epel7
                description: epel7 on CentOS 7
                baseurl: http://mirrors.aliyun.com/epel/7/$basearch/
                gpgcheck: no
                enabled: True
          tasks:
    # install nginx and run it
            - name: install nginx
              yum: name=nginx state=installed update_cache=yes
            - name: start nginx
              service: name=nginx state=started
          post_tasks:
            - shell: echo "deploy nginx over"
              register: ok_var
            - debug: msg="{{ ok_var.stdout }}"

    1、yaml文件以---开头,以表明这是一个yaml文件,就像xml文件在开头使用<?xml version="1.0" encoding="utf-8"?>宣称它是xml文件一样。但即使没有使用---开头,也不会有什么影响。

    2、yaml中使用"#"作为注释符,可以注释整行,也可以注释行内从"#"开始的内容。

    3、yaml中的字符串通常不用加任何引号,即使它包含了某些特殊字符。但有些情况下,必须加引号,最常见的是在引用变量的时候。具体见后文。

    4、关于布尔值的书写格式,即true/false的表达方式。其实playbook中的布尔值类型非常灵活,可分为两种情况:

    5、模块的参数: 这时布尔值作为字符串被ansible解析。接受yes/on/1/true/no/off/0/false,这时被ansible解析。例如上面示例中的update_cache=yes。

    6、非模块的参数: 这时布尔值被yaml解释器解析,完全遵循yaml语法。接受不区分大小写的true/yes/on/y/false/no/off/n。例如上面的gpgcheck=no和enabled=True。

    建议遵循ansible的官方规范,模块的布尔参数采用yes/no,非模块的布尔参数采用True/False。

    1.2 列表

    使用"- "(减号加一个或多个空格)作为列表项,也就是json中的数组。yaml的列表在playbook中极重要,必须得搞清楚它的写法。

    例如:

     - zhangsan

     - lisi

     - wangwu

    还支持内联写法:使用中括号。

    [zhangsan,lisi,wangwu]

    它们等价于json格式的:

    [

        "zhangsan",

        "lisi",

        "wangwu"

    ]

    再例如:

    - 班名: 初中1班

      人数: 35

      班主任: 隔壁老张

      今天的任务: 扫操场

    - 班名: 初中2班

      人数: 38

      班主任: 隔壁老王

      今天的任务: 搬桌子

    具体在ansible playbook中,列表所描述的是局部环境,它不一定要有名称,不一定要从同一个属性开始,只要使用"- ",它就表示圈定一个范围,范围内的项都属于该列表。例如:

    ---
        - name: list1              # 列表1,同时给了个名称
          hosts: localhost         # 指出了hosts是列表1的一个对象
          remote_user: root        # 列表1的属性
          tasks:                   # 还是列表1的属性
        - hosts: 192.168.100.65    # 列表2,但是没有为列表命名,而是直入主题
          remote_user: root
          sudo: yes
          tasks:

    唯一要注意的是,每一个playbook中必须包含"hosts"和"tasks"项。更严格地说,是每个play的顶级列表必须包含这两项。就像上面的例子中,就表示该playbook中包含了两个play,每个play的顶级列表都包含了hosts和tasks。其实绝大多数情况下,一个playbook中都只定义一个play,所以只有一个顶级列表项。顶级列表的各项,其实可以将其看作是ansible-playbook运行时的选项。

    另外,playbook中某项是一个动作、一个对象或一个实体时,一般都定义成列表的形式。见下文。

    1.3 字典

    官方手册上这么称呼,其实就是key=value的另一种写法。使用"冒号+空格"分隔,即key: value。它一般当作列表项的属性。

    例如:

    - 班名: 初中1班

      人数:

        总数: 35

        男: 19

        女: 16

      班主任:

        大名: 隔壁老张

        这厮多大: 39

        这厮任教多少年: 15

      今天的任务: 扫操场

     

    - 班名: 初中2班

      人数:

        总数: 38

        男: 19

        女: 19

      班主任:

        大名: 隔壁老王

        这厮多大: 30

        喜调戏女老师: True

      今天的任务: 搬桌子

         未完成任务怎么办:

            - 继续搬,直到完成

            - 写检讨

    具体到playbook中,一般"虚拟性"的内容都可以通过字典的方式书写,而实体化的、动作性的、对象性的内容则应该定义为列表形式。

    ---
        - hosts: localhost              # 列表1
          remote_user: root
          tasks:
            - name: test1               # 子列表,下面是shell模块,是一个动作,所以定义为列表,只不过加了个name
              shell: echo /tmp/a.txt
              register: hi_var
            - debug: var=hi_var.stdout  # 调用模块,这是动作,所以也是列表
            - include: /tmp/nginx.yml   # 同样是动作,包含文件
            - include: /tmp/mysql.yml
            - copy:                     # 调用模块,定义为列表。但模块参数是虚拟性内容,应定义为字典而非列表
                src: /etc/resolv.conf   # 模块参数1
                dest: /tmp              # 模块参数2 
    
        - hosts: 192.168.100.65           # 列表2
          remote_user: root
          vars:
            nginx_port: 80                # 定义变量,是虚拟性的内容,应定义为字典而非列表
            mysql_port: 3306
          vars_files:
            - nginx_port.yml              # 无法写成key/value格式,且是实体文件,因此定义为列表
          tasks:
            - name: test2
              shell: echo /tmp/a.txt
              register: hi_var            # register是和最近一个动作绑定的
            - debug: var=hi_var.stdout

    从上面示例的copy模块可以得出,模块的参数是虚拟性内容,也能使用字典的方式定义。

    字典格式的key/value,也支持内联格式写法:使用大括号。

    {大名: 隔壁老王,这厮多大: 30,喜调戏女老师: True}

    {nginx_port: 80,mysql_port: 3306}

    这等价于json格式的:

    {

        "大名": "隔壁老王",

        "这厮多大": 30,

        "喜调戏女老师": "True"

    }

    {

        "nginx_port": 80,

        "mysql_port": 3306

    }

    再结合其父项,于是转换成json格式的内容:

    "班主任": {

        "大名": "隔壁老王",

        "这厮多大": 30,

        "喜调戏女老师": "True"

    }

     

    "vars": {

        "nginx_port": 80,

        "mysql_port": 3306

    }

    再加上列表项(使用中括号),于是:

    [

      {

        "hosts": "192.168.100.65",

        "remote_user": "root",

        "vars": {

          "nginx_port": 80,

          "mysql_port": 3306

        },

        "vars_files": [

          "nginx_port.yml"

        ],

        "tasks": [

          {

            "name": "test2",

            "shell": "echo /tmp/a.txt",

            "register": "hi_var"

          },

          {

            "debug": "var=hi_var.stdout"

          }

        ]

      }

    ]

    1.4 分行写

    playbook中有3种方式进行续行。

    • 在"key: "的后面使用大于号。
    • 在"key: "的后面使用竖线。这种方式可以像脚本一样写很多行语句。
    • 多层缩进。

    例如,下面的3中方法。

    ---
        - hosts: localhost
          tasks:
            - shell: echo 2 >>/tmp/test.txt
                creates=/tmp/haha.txt          # 比模块shell缩进更多
            - shell: >                         # 在"key: "后使用大于号
                echo 2 >>/tmp/test.txt
                creates=/tmp/haha.txt
            - shell: |                         # 指定多行命令
                echo 2 >>/tmp/test.txt
                echo 3 >>/tmp/test.txt
              args:
                creates: /tmp/haha.txt

    1.5 向模块传递参数

    模块的参数一般来说是key=value格式的,有3种传递的方式:

    • 直接写在模块后,此时要求使用"key=value"格式。这是让ansible内部去解析字符串。因为可分行写,所以有多种写法。
    • 写成字典型,即"key: value"。此时要求多层缩进。这是让yaml去解析字典。
    • 使用内置属性args,然后多层缩进定义参数列表。这是让ansible明确指定用yaml来解析。

    例如:

    ---
        - hosts: localhost
          tasks:
            - yum: name=unix2dos state=installed    # key=value直接传递
            - yum:
                name: unxi2dos
                state: installed            # "key: value"字典格式传递
            - yum:
              args:                               # 使用args传递
                name: unix2dos
                state:installed

    但要注意,当模块的参数是free_form时,即格式不定,例如shell和command模块指定要执行的命令,它无法写成key/value格式,此时不能使用上面的第二种方式。也就是说,下面第一个模块是正确的,第二个模块是错误的,因为shell模块的命令"echo haha"是自由格式的,无法写成key/value格式。

    ---
        - hosts: localhost
          tasks:
            - yum:
                name: unxi2dos
                state: installed
            - shell:
                echo haha
                creates: /tmp/haha.txt

    所以,调用一个模块的方式就有了多种形式。例如:

    ---
        - hosts: localhost
          tasks:
            - shell: echo 1 >/tmp/test.txt creates=/tmp/haha.txt
            - shell: echo 2 >>/tmp/test.txt
                creates=/tmp/haha.txt
            - shell: echo 3 >>/tmp/test.txt
              args:
                 creates: /tmp/haha.txt
            - shell: >
                echo 4 >>/tmp/test.txt
                creates=/tmp/haha.txt
            - shell: |
                echo 5.1 >>/tmp/test.txt
                echo 5.2 >>/tmp/test.txt
              args:
                creates: /tmp/haha.txt
            - yum: 
                name: dos2unix
                state: installed

    1.6 playbookplay的关系

    一个playbook中可以包含多个play。每个play都至少包含有tasks和hosts这两项,还可以包含其他非必须项,如vars,vars_files,remote_user等。tasks中可以通过模块调用定义一系列的action。只不过,绝大多数时候,一个playbook都只定义一个play。

    所以,大致关系为:

    • playbook: [play1,play2,play3]
    • play: [hosts,tasks,vars,remote_user...]
    • tasks: [module1,module2,...]

    也就是说,每个顶级列表都是一个play。例如,下面的playbook中包含了两个play。

    ---
        - name: list1
          hosts: localhost
          remote_user: root
          tasks:
    
        - hosts: 192.168.100.65
          remote_user: root
          sudo: yes
          tasks:

    需要注意,有些时候play中使用了role,可能看上去没有tasks,这是因为role本身就是整合playbook的,所以没有也没关系。但没有使用role的时候,必须得包含hosts和tasks。例如:

    ---
      - hosts: centos
        remote_user: root
        pre_tasks:
            - name: config the yum repo for centos 7
              yum_repository:
                  name: epel
                  description: epel
                  baseurl: http://mirrors.aliyun.com/epel/7/$basearch/
                  gpgcheck: no
              when: ansible_distribution_major_version == "7"
    
            - name: config the yum repo for centos 6
              yum_repository:
                  name: epel
                  description: epel
                  baseurl: http://mirrors.aliyun.com/epel/6/$basearch/
                  gpgcheck: no
              when: ansible_distribution_major_version == "6"
    
        roles:
            - nginx
        post_tasks:
          - shell: echo 'deploy nginx/mysql over'
            register: ok_var
          - debug: msg='{{ ok_var.stdout }}'

    1.7 playbook中什么时候使用引号

    playbook中定义的都是些列表和字典。绝大多数时候,都不需要使用引号,但有两个特殊情况需要考虑使用引号。

    • 出现大括号"{}"。
    • 出现冒号加空格时": "。

    大括号要使用引号包围,是因为不使用引号时会被yaml解析成内联字典。例如要使用大括号引用变量的时候,以及想输出大括号符号的时候。

    ---
        - hosts: localhost
          tasks:
            - shell: echo "{{inventory_hostname}}:haha"

    冒号尾随空格时要使用引号包围,是因为它会被解析为"key: value"的形式。而且包围冒号的引号还更严格。例如下面的debug模块中即使使用了引号也是错误的。

    ---
        - hosts: localhost
          tasks:
            - shell: echo "{{inventory_hostname}}:haha"
              register: hello
            - debug: msg="{{hello.stdout}}: heihei"

    因为它把{{...}}当成key,heihei当成value了。因此,必须将整个debug模块的参数都包围起来,显式指定这一段是模块的参数。但这样会和原来的双引号冲突,因此使用单引号。

    ---
        - hosts: localhost
          tasks:
            - shell: echo "{{inventory_hostname}}:haha"
              register: hello
            - debug: 'msg="{{hello.stdout}}: heihei"'

    但是,如果将shell模块中的冒号后也尾随上空格,即写成echo "{{inventory_hostname}}: haha",那么shell模块也会报错。因此也要使用多个引号,正确的如下:

    ---
        - hosts: localhost
          tasks:
            - shell: 'echo "{{inventory_hostname}}: haha"'
              register: hello
            - debug: 'msg="{{hello.stdout}}: heihei"'

    1.8 Ansible Playbook应用

    如上使用Ad-hoc方式点对点命令执行,可以管理远程主机,如果服务器数量很多,配置信息比较多,还可以利用Ansible Playbook编写剧本、从而以非常简便的方式实现任务处理的自动化与流程化。

    Playbook由一个或多个"play"组成的列表,play的主要功能Ansible中的Task定义好的角色,指定剧本对应的服务器组。

    从根本上说,Task是一个任务,Task调用Ansible各种模块module,将多个paly组织在一个playbook剧本中,然后组成一个非常完整的流程控制集合。

    基于Ansible Playbook还可以收集命令、可以创建任务集,这样能够大大降低管理工作的复杂程度,Playbook采用YAML语法结构,易于阅读、方便配置。

    YAML(Yet Another Markup Language),是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。它参考了其它多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822,是类似于标准通用标记语言的子集XML的数据描述语言,语法比XML简单很多。

    YAML使用空白字符和分行来分隔资料,适合用 grep、Python、Perl、Ruby 操作。

    (1)     YAML语言特性如下:

    • 可读性强;
    • 和脚本语言的交互性好;
    • 使用实现语言的数据类型;
    • 一致的信息模型;
    • 易于实现;
    • 可以基于流来处理;
    • 可扩展性强。

    (2)     Playbooks组件包括如下:

    Target                     定义playbook的远程主机组;

    Variable                       定义playbook使用的变量;

    Task                       定义远程主机上执行的任务列表;

    Handler                        定义task执行完成以后需要调用的任务,例如配置文件被改动,则启动handler任务重启相关联的服务。

    (3)     Target常用参数如下:

    hosts                          定义远程主机组;

    user                       执行该任务的用户;

    sudo                          设置为yes的时候,执行任务的时候使用root权限;

    sudo_user                  指定sudo普通用户;

    connection                 默认基于SSH连接客户端;

    gather_facks                   获取远程主机facts基础信息。

    (4)     Variable常用参数如下:

    vars                       定义格式,变量名:变量值;

    vars_files                     指定变量文件;

    vars_prompt                用户交互模式自定义变量;

    setup                      模块去远程主机的值;

    (5)     Task常用参数如下:

    name                       任务显示名称也即屏幕显示信息;

    action                     定义执行的动作;

    copy                       复制本地文件到远程主机;

    template                       复制本地文件到远程主机,可以引用本地变量;

    service                        定义服务的状态。

    Ansible playbook案例演示如下:

    (1)     远程主机安装Nginx WEB服务,playbook代码如下,执行结果如图21-33所示:

    - hosts: all

      remote_user: root

      tasks:

      - name: Jfedu Pcre-devel and Zlib LIB Install.

        yum:  name=pcre-devel,pcre,zlib-devel state=installed

      - name: Jfedu  Nginx WEB  Server Install Process.

        shell: cd /tmp;rm -rf nginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0.tar.gz;cd nginx-1.12.0;./configure --prefix=/usr/local/nginx;make;make install

    图21-33 Ansible Playbook远程Nginx安装

    (2)     检测远程主机Nginx目录是否存在,不存在则安装Nginx WEB服务,安装完并启动Nginx,playbook代码如下,执行结果如图21-34所示:

    - hosts: all

      remote_user: root

      tasks:

          - name: Nginx server Install 2017

            file: path=/usr/local/nginx/ state=directory

            notify:

                - nginx install

                - nginx start

      handlers:

          - name: nginx install

            shell: cd /tmp;rm -rf nginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0

    .tar.gz;cd nginx-1.12.0;./configure --prefix=/usr/local/nginx;make;make install

          - name: nginx start

            shell: /usr/local/nginx/sbin/nginx

    图21-34 Ansible Playbook Nginx触发安装

    (3)     检测远程主机内核参数配置文件是否更新,如果更新则执行命令sysctl –p使内核参数生效,playbook代码如下,执行结果如图21-35所示:

    - hosts: all

      remote_user: root

      tasks:

          - name: Linux kernel config 2017

            copy: src=/data/sh/sysctl.conf dest=/etc/

            notify:

                - source sysctl

      handlers:

          - name: source sysctl

            shell: sysctl -p

    图21-35 Ansible Playbook 内核参数优化

    (4)     基于列表items多个值创建用户,通过{{}}定义列表变量,with_items选项传入变量的值,执行结果如图21-36(a)、21-36(b)所示:

    - hosts: all

      remote_user: root

      tasks:

      - name: Linux system Add User list.

        user: name={{ item }} state=present

        with_items:

           - jfedu1

           - jfedu2

           - jfedu3

           - jfedu4

    图21-36(a) Ansible Playbook item变量创建用户

    图21-36(b) Ansible Playbook item变量创建用户

    (5)     Ansible Playbook可以自定义template模板文件,模板文件主要用于服务器需求不一致的情况,需要独立定义的,例如两台服务器安装了Nginx,安装完毕之后将服务器A的HTTP端口改成80,服务器B的HTTP端口改成81,基于tempalte模块轻松实现,方法步骤如下:

    1. Ansible hosts文件指定不同服务器不同httpd_port端口,代码如下:

    [web]

    192.168.149.128 httpd_port=80

    192.168.149.129 httpd_port=81

    1. Ansible 创建nginx.conf jinja2模板文件,cp nginx.conf nginx.conf.j2,并修改listen 80为listen {{httpd_port}},Nginx其他配置项不变,代码如下:

    cp nginx.conf nginx.conf.j2

    listen  {{httpd_port}};

    1. Ansible playbook剧本yaml文件创建,代码如下:

    - hosts: all

      remote_user: root

      tasks:

          - name: Nginx server Install 2017

            file: path=/usr/local/nginx/ state=directory

            notify:

                - nginx install

                - nginx config

      handlers:

          - name: nginx install

            shell: cd /tmp;rm -rf nginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0

    .tar.gz;cd nginx-1.12.0;./configure --prefix=/usr/local/nginx;make;make install

          - name: nginx config

            template: src=/data/sh/nginx.conf.j2 dest=/usr/local/nginx/conf/nginx.conf

    1. Ansible playbook执行剧本文件,如图21-37(a)、21-37(b)、21-37(c)所示:

    图21-37(a) Ansible Playbook 执行模板yaml

    图21-37(b) 149.128服务器Nginx HTTP Port 80

     

    图21-37(c) 149.129服务器Nginx HTTP Port 81

    1.9 Ansible配置文件详解

    Ansible默认配置文件为/etc/ansible/ansible.cfg,配置文件中可以对ansible进行各项参数的调整,包括并发线程、用户、模块路径、配置优化等,如下为Ansible.cfg常用参数详解:

    [defaults]                                 通用默认配置段;

    inventory      = /etc/ansible/hosts            被控端IP或者DNS列表;

    library        = /usr/share/my_modules/        Ansible默认搜寻模块的位置;

    remote_tmp     = $HOME/.ansible/tmp       Ansible远程执行临时文件;

    pattern        = *                     对所有主机通信;

    forks          = 5                     并行进程数;

    poll_interval  = 15                        回频率或轮训间隔时间;

    sudo_user      = root                      sudo远程执行用户名;

    ask_sudo_pass = True                   使用sudo,是否需要输入密码;

    ask_pass      = True                       是否需要输入密码;

    transport      = smart                     通信机制;

    remote_port    = 22                    远程SSH端口;

    module_lang    = C                     模块和系统之间通信的语言;

    gathering = implicit                       控制默认facts收集(远程系统变量);

    roles_path= /etc/ansible/roles             用于playbook搜索Ansible roles;

    host_key_checking = False                  检查远程主机密钥;

    #sudo_exe = sudo                           sudo远程执行命令;

    #sudo_flags = -H                           传递sudo之外的参数;

    timeout = 10                               SSH超时时间;

    remote_user = root                         远程登陆用户名;

    log_path = /var/log/ansible.log                日志文件存放路径;

    module_name = command                  Ansible命令执行默认的模块;

    #executable = /bin/sh                      执行的Shell环境,用户Shell模块;

    #hash_behaviour = replace                  特定的优先级覆盖变量;

    #jinja2_extensions                        允许开启Jinja2拓展模块;

    #private_key_file = /path/to/file              私钥文件存储位置;

    #display_skipped_hosts = True              显示任何跳过任务的状态;

    #system_warnings = True                禁用系统运行ansible潜在问题警告;

    #deprecation_warnings = True               Playbook输出禁用“不建议使用”警告;

    #command_warnings = False                  command模块Ansible默认发出警告;

    #nocolor = 1                           输出带上颜色区别,开启/关闭:0/1;

    pipelining = False                         开启pipe SSH通道优化;

    [accelerate]                               accelerate缓存加速。

    accelerate_port = 5099

    accelerate_timeout = 30

    accelerate_connect_timeout = 5.0

    accelerate_daemon_timeout = 30

    accelerate_multi_key = yes

    1.10 Ansible性能调优

    Ansible企业实战环境中,如果管理的服务器越来越多,Ansibe执行效率会变得比较慢,可以通过优化Ansible提供工作效率,由于Ansible基于SSH协议通信,SSH连接慢会导致整个基于Ansible执行变得缓慢,也需要对Openssh进行优化,具体优化的方法如下:

    (1)     Ansible SSH 关闭秘钥检测

    默认以SSH登录远程客户端服务器,会检查远程主机的公钥(public key),并将该主机的公钥记录在~/.ssh/known_hosts文件中。下次访问相同主机时,OpenSSH会核对公钥,如果公钥不同,OpenSSH会发出警告,如果公钥相同,则提示输入密码。

    SSH对主机的public_key的检查等级是根据StrictHostKeyChecking变量来设定的,StrictHostKeyChecking检查级别包括:no(不检查)、ask(询问)、yes(每次都检查)、False(关闭检查)。

    Ansible配置文件中加入如下代码,即可关闭StrictHostKeyChecking检查:

    host_key_checking = False

    (2)     OpenSSH连接优化

    使用OpenSSH服务时,默认服务器端配置文件UseDNS=YES状态,该选项会导致服务器根据客户端的IP地址进行DNS PTR反向解析,得到客户端的主机名,然后根据获取到的主机名进行DNS正向A记录查询,并验证该IP是否与原始IP一致。关闭DNS解析代码如下:

    sed  -i  '/^GSSAPI/s/yes/no/g;/UseDNS/d;/Protocol/aUseDNS no' /etc/ssh/sshd_config

    /etc/init.d/sshd restart

    (3)     SSH pipelining加速Ansible

    SSH pipelining是一个加速 Ansible 执行速度的简单方法,SSH pipelining 默认是关闭的,关闭是为了兼容不同的 sudo 配置,主要是requiretty 选项。

    如果不使用Sudo建议开启该选项,打开此选项可以减少Ansible 执行没有文件传输时,SSH在被控机器上执行任务的连接数。使用Sudo操作的时候, 必须在所有被管理的主机上将配置文件/etc/sudoers中requiretty选项禁用。

    sed    -i    '/^pipelining/s/False/True/g'    /etc/ansible/ansible.cfg

    (4)     Ansible Facts缓存优化

    Ansible-playbook 在执行过程中,默认会执行Gather facts,如果不需要获取客户端的fact数据的话,可以关闭获取fact数据功能,关闭之后可以加快ansible-playbook的执行效率。如需关闭fact功能,在playbook yaml文件中加入如下代码即可:

    gather_facts: nogather_facts: no

    Ansible facts组件主要用于收集客户端设备的基础静态信息,这些信息可以在做配置管理的时候方便引用。Facts信息直接当做Ansible Playbook变量信息进行引用,通过定制facts以便收集我们想要的信息,同时可以通过Facter和Ohai来拓展facts信息,也可以将facts信息存入Redis缓存中,如下为Facts使用Redis缓存的步骤。

    1. 部署Redis服务

    wget    http://download.redis.io/releases/redis-2.8.13.tar.gz

    tar         zxf            redis-2.8.13.tar.gz

    cd      redis-2.8.13

    make    PREFIX=/usr/local/redis  install

    cp     redis.conf     /usr/local/redis/

    将/usr/local/redis/bin/目录加入至环境变量配置文件/etc/profile末尾,然后Shell终端执行source /etc/profile让环境变量生效。

    export PATH=/usr/local/redis/bin:$PATH

    启动及停止Redis服务命令:

    nohup /usr/local/redis/bin/redis-server  /usr/local/redis/redis.conf  &

    1. 安装Python Redis模块

    easy_install pip

    pip install redis

    1. Ansible整合Redis配置

    在配置文件/etc/ansible/ansible.cfg中defaluts段中加入代码,如果redis密码为admin,则开启admin密码行:

    gathering = smart

    fact_caching = redis

    fact_caching_timeout = 86400

    fact_caching_connection = localhost:6379

    #fact_caching_connection = localhost:6379:0:admin

    1. 测试Redis缓存

    Ansible-playbook执行nginx_wget.yaml剧本文件,如图21-38所示:

    ansible-playbook    nginx_wget.yaml

    图21-38 ansible playbook执行yaml

    检查Redis服务器,facts key已存入Redis中,如图21-39所示:

    图21-39 Redis缓存服务器缓存facts主机信息

    (5)     ControlPersist SSH优化

    ControlPersist 特性需要高版本的SSH支持,CentOS6默认是不支持的,如果需要使用,需要自行升级Openssh。

    ControlPersist 即持久化的Socket,一次验证多次通信。并且只需要修改SSH客户端配置,也即Ansible被管理主机。

    可使用YUM或者源码编译升级OpenSSH服务,升级完毕ControlPersist的设置办法如下,在其用户的家目录创建config文件,如果ansible以root用户登录客户端,至需要在客户端的/root/.ssh/config目录中添加如下代码即可:

    Host *

      Compression yes

      ServerAliveInterval 60

      ServerAliveCountMax 5

      ControlMaster auto

      ControlPath ~/.ssh/sockets/%r@%h-%p

      ControlPersist 4h

    开启ControlPersist 特性后,SSH 在建立sockets后,节省了每次验证和创建的时间,对Ansible执行速度提升是非常明显的。

    1.11核心组件

    • tasks:任务
    • variables:变量
    • templates:模板
    • handlers:处理器
    • roles:角色 

    1.12 playbook实例

  • 相关阅读:
    DHCP服务器与DHCP中继服务器实验
    DAY1-作业
    logging模块的基本使用
    01_docker镜像命令
    00_docker的基本组成
    21_django配置使用mysql数据库的两种方式
    08_使用python操作mysql
    07_mysql的基本操作
    06_python操作mongodb
    05_MongoDB基本操作
  • 原文地址:https://www.cnblogs.com/deny/p/11504170.html
Copyright © 2020-2023  润新知