暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Ansible Facts 变量详解

OpenInfo 2020-04-13
118

主机规划


添加用户账号

说明:


1、 运维人员使用的登录账号;


2、 所有的业务都放在 app/ 下「yun用户的家目录」,避免业务数据乱放;


3、 该用户也被 ansible 使用,因为几乎所有的生产环境都是禁止 root 远程登录的(因此该 yun 用户也进行了 sudo 提权)。

    # 使用一个专门的用户,避免直接使用root用户
    # 添加用户、指定家目录并指定用户密码
    # sudo提权
    # 让其它普通用户可以进入该目录查看信息
    useradd -u 1050 -d app yun && echo '123456' | usr/bin/passwd --stdin yun
    echo "yun ALL=(ALL) NOPASSWD: ALL" >> etc/sudoers
    chmod 755 app/


    Ansible 配置清单Inventory

    之后文章都是如下主机配置清单

      [yun@ansi-manager ansible_info]$ pwd
      /app/ansible_info
      [yun@ansi-manager ansible_info]$ cat hosts_key
      # 方式1、主机 + 端口 + 密钥
      [manageservers]
      172.16.1.180:22


      [proxyservers]
      172.16.1.18[1:2]:22


      # 方式2:别名 + 主机 + 端口 + 密码
      [webservers]
      web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22
      web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22
      web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22


      Facts 概述

      Ansible Facts 是 Ansible 在被托管主机上自动收集的变量。它是通过在执行 Ad-Hoc 以及 Playbook 时使用 setup 模块进行收集的,并且这个操作是默认的。


      因为这个收集托管主机上的 Facts 比较耗费时间,所以可以在不需要的时候关闭 setup 模块。收集的 Facts 中包含了托管主机特有的信息,这些信息可以像变量一样在 Playbook 中使用。


      收集的 Facts 中包含了以下常用的信息:


      主机名、内核版本、网卡接口、IP 地址、操作系统版本、环境变量、CPU 核数、可用内存、可用磁盘 等等……。


      使用场景:


      1. 通过 facts 检查 CPU,生成对应的 Nginx 配置文件

      2. 通过 facts 检查内存情况,定义不同的 MySQL 配置文件或 Redis 配置文件

      3. 通过 facts 检查主机 hostname,生成不同的 zabbix 配置文件


      获取指定受控端的 facts 信息

        [yun@ansi-manager ansible_info]$ pwd
        /app/ansible_info
        [yun@ansi-manager ansible_info]$ ansible 172.16.1.181 -m setup -i ./hosts_key
        172.16.1.181 | SUCCESS => {
        "ansible_facts": {
        "ansible_all_ipv4_addresses": [
        "10.0.0.181",
        "172.16.1.181"
        ],
        ………………


        如何在 playbook 中关闭 facts

          [yun@ansi-manager object03]$ pwd
          /app/ansible_info/object03
          [yun@ansi-manager object03]$ cat test_facts.yml
          ---
          # facts 使用
          - hosts: proxyservers
          # 关闭 facts 变量
          gather_facts: no


          # 这时就不能取到 ansible_hostname、ansible_eth0.ipv4.address、ansible_eth1 ['ipv4']['address'] 变量信息
          tasks:
          - name: "get ansible facts var"
          debug:
          msg: "This host name is {{ ansible_hostname }} ,eth0: {{ ansible_eth0.ipv4.address }}, eth1: {{ ansible_eth1['ipv4']['address'] }}"


          Facts 案例-获取主机名和网卡信息

          获取受控端的主机名,内网地址和外网地址

            [yun@ansi-manager object03]$ pwd
            /app/ansible_info/object03
            [yun@ansi-manager object03]$ ll
            total 4
            -rw-rw-r-- 1 yun yun 241 Aug 22 10:41 test_facts.yml
            [yun@ansi-manager object03]$ cat test_facts.yml
            ---
            # facts 使用
            - hosts: proxyservers


            tasks:
            - name: "get ansible facts var"
            debug:
            msg: "This host name is {{ ansible_hostname }} ,eth0: {{ ansible_eth0.ipv4.address }}, eth1: {{ ansible_eth1['ipv4']['address'] }}"
            #### 上面写了两种方式引用变量,推荐使用后一种引用方式


            [yun@ansi-manager object03]$ ansible-playbook -b -i ../hosts_key test_facts.yml


            PLAY [proxyservers] ***********************************************************************************************


            TASK [Gathering Facts] ********************************************************************************************
            ok: [172.16.1.181]
            ok: [172.16.1.182]


            TASK [get ansible facts var] **************************************************************************************
            ok: [172.16.1.181] => {
            "msg": "This host name is ansi-haproxy01 ,eth0: 172.16.1.181, eth1: 10.0.0.181"
            }
            ok: [172.16.1.182] => {
            "msg": "This host name is ansi-haproxy02 ,eth0: 172.16.1.182, eth1: 10.0.0.182"
            }


            PLAY RECAP ********************************************************************************************************
            172.16.1.181 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
            172.16.1.182 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0


            Facts 案例-模拟zabbix客户端配置

            根据受控端主机名的不同,在受控端生成不同的配置文件

              [yun@ansi-manager object03]$ pwd
              /app/ansible_info/object03
              [yun@ansi-manager object03]$ ll
              total 32
              drwxrwxr-x 2 yun yun 58 Aug 22 12:31 file
              -rw-rw-r-- 1 yun yun 224 Aug 22 12:33 test_zabbix_agentd.yml
              [yun@ansi-manager object03]$ cat file/vars_file.yml # playbook 变量
              zabbix_server: 172.16.1.180


              [yun@ansi-manager object03]$ cat file/zabbix_agentd_temp.conf.j2 # 模拟 zabbix_agentd 配置文件
              # 模拟 zabbix_agentd 配置文件


              # zabbix 服务端配置
              Server={{ zabbix_server }}
              ServerActive={{ zabbix_server }}


              # zabbix 客户端配置
              Hostname={{ ansible_hostname }}


              [yun@ansi-manager object03]$ cat test_zabbix_agentd.yml # 具体的 yml 文件
              ---
              # zabbix 配置
              - hosts: proxyservers
              vars_files: ./file/vars_file.yml


              tasks:
              - name: config zabbix_agentd
              template:
              src: ./file/zabbix_agentd_temp.conf.j2
              dest: tmp/zabbix_agentd_temp.conf


              [yun@ansi-manager object03]$ ansible-playbook -b -i ../hosts_key --syntax-check test_zabbix_agentd.yml # 语法检测
              [yun@ansi-manager object03]$ ansible-playbook -b -i ../hosts_key -C test_zabbix_agentd.yml # 预执行,测试执行
              [yun@ansi-manager object03]$ ansible-playbook -b -i ../hosts_key test_zabbix_agentd.yml # 执行


              受控端 1 配置文件查看

                [yun@ansi-haproxy01 ~]$ cat tmp/zabbix_agentd_temp.conf 
                # 模拟 zabbix_agentd 配置文件


                # zabbix 服务端配置
                Server=172.16.1.180
                ServerActive=172.16.1.180


                # zabbix 客户端配置
                Hostname=ansi-haproxy01


                受控端 2 配置文件查看

                  [yun@ansi-haproxy02 ~]$ cat /tmp/zabbix_agentd_temp.conf 
                  # 模拟 zabbix_agentd 配置文件


                  # zabbix 服务端配置
                  Server=172.16.1.180
                  ServerActive=172.16.1.180


                  # zabbix 客户端配置
                  Hostname=ansi-haproxy02




                  ———END———

                  如果觉得不错就关注下呗 (-^O^-) !


                  文章转载自OpenInfo,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论