Ansible Facts Variables

1、什么是facts

Ansible facts 用来自动采集,”被控端主机“ 自身的状态信息。
比如: 主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等

2、facts使用场景

1.通过facts变量检查被控端硬件CPU信息,从而生成不同的Nginx配置文件。
2.通过facts变量检查被控端内存状态信息,从而生成不同的memcached的配置文件。
3.通过facts变量检查被控端主机IP地址信息,从而生成不同的redis配置文件。
4.通过facts变量........

3、facts语法示例

3.1、通过 facts 获取被控端的主机名与IP地址,然后通过 debug 输出

cat <<'CAT_END' > get_ip_info.yaml
- hosts: httpd
  tasks:
    - name: output variable ansible facts
      debug:
        msg: "hostname->{{ansible_fqdn}},ip->{{ansible_default_ipv4.address}}"
CAT_END

3.2、facts开启后会影响Ansible主机的性能,如果没有采集被控端主机需求可选择关闭

]# cat get_ip_info.yaml 
- hosts: httpd
  gather_facts: no
  tasks:

3.3、如何获取facts的变量,需要使用filter进行过滤

]# ansible localhost -m setup -a "filter="ansible_default_ipv4""
localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "192.168.10.10", 
            "alias": "ens33", 
            "broadcast": "192.168.10.255", 
            "gateway": "192.168.10.2", 
            "interface": "ens33", 
            "macaddress": "00:0c:29:38:60:9b", 
            "mtu": 1500, 
            "netmask": "255.255.255.0", 
            "network": "192.168.10.0", 
            "type": "ether"
        }
    }, 
    "changed": false
}

4、facts实践案例

4.2、示例1-根据主机IP地址生成Redis配置

4.2.1、编写redis playbook

cat <<'CAT_END'>redis.yaml
- hosts: redis
  tasks:
    - name: Install redis server
      yum:
        name: redis
        state: present
    - name: configure redis server
      template:
        src: ./redis.conf.j2
        dest: /etc/redis.conf
      notify: restart redis server
    - name: start redis server
      systemd:
        name: redis
        state: started
        enabled: yes
  handlers:
    - name: restart redis server
      systemd:
        name: redis
        state: restarted
CAT_END

4.2.2、模板配置文件

scp root@192.168.10.16:/etc/redis.conf redis.conf.j2

]# redis.conf.j2
bind 127.0.0.1 {{ ansible_ens33.ipv4.address }}

4.2.3、运行结果

]# vi /etc/redis.conf
bind 127.0.0.1 192.168.10.15

4.3、示例2-根据主机CPU生成Nginx配置

4.3.1、编写nginx playbook

cat <<'CAT_END'>nginx.yaml
- hosts: httpd
  tasks:
    - name: Install nginx server
      yum:
        name: nginx
        state: present
    - name: configure nginx server
      template:
        src: ./nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: restart nginx server
    - name: start nginx server
      systemd:
        name: nginx
        state: started
        enabled: yes
  handlers:
    - name: restart nginx server
      systemd:
        name: nginx
        state: restarted
CAT_END

4.3.2、模板配置文件

scp root@192.168.10.16:/etc/nginx/nginx.conf nginx.conf.j2

]# vi nginx.conf.j2 
...
worker_processes {{ ansible_processor_vcpus*2 }};
...

4.3.3、参数解析

ansible_processor_cores: 4 # 核心数 ( 每颗物理CPU的核心数)
ansible_processor_count: 2 # 颗数 (有几个CPU )
ansible_processor_vcpus: 8 # 总核心数

4.4、示例3-根据主机内存生成Memcached配置

4.4.1、编写memcached服务playbook

cat <<'CAT_END'>memcached.yaml
- hosts: redis
  tasks:
    - name: Install memcached server
      yum:
        name: memcached
        state: present
    - name: configure memcached server
      template:
        src: ./memcached.j2
        dest: /etc/sysconfig/memcached
    - name: start nginx server
      systemd:
        name: memcached
        state: started
        enabled: yes
CAT_END

4.4.2、模板配置文件

cat << 'CAT_END' > memcached.j2
PORT="11211"
USER="memcached"
MAXCONN="1024"
#根据内存状态生成不同的配置(支持+-*/运算)
CACHESIZE="{{ ansible_memtotal_mb //2 }}"
OPTIONS=""
CAT_END

5、facts变量优化方案

5.1、方式1-关闭facts采集加速执行

]# cat ansible_facts.yml
- hosts: all
  gather_facts: no
  tasks:
...

5.2、方式2-Redis缓存facts加速执行 

5.2.1、需知

当我们使用 gather_facts: no 关闭 facts ,确实能加速 Ansible 执行,但是有时候又需要使用 facts 中的内容,还希望执行的速度快一点,这时候可以设置facts 的缓存

 5.2.2、安装redis模块

# 方法1
yum install python3-redis

# 方法2
pip install --upgrade pip
pip install redis

5.2.3、ansible 配置 连接redis的参数

~]# cat /etc/ansible/ansible.cfg
# smart 表示默认收集 facts,但 facts 已有的情况下不会收集,即使用缓存 facts
# implicit 表示默认收集 facts,要禁止收集,必须使用 gather_facts:False;
# explicit 则表示默认不收集,要显式收集,必须使用 gather_facts: Ture。
gathering = smart #在使用 facts 缓存时设置为smart
fact_caching_timeout = 86400
fact_caching = redis
fact_caching_connection = 192.168.10.15:6379

# 若 redis 设置了密码
# fact_caching_connection = localhost:6379:0:admin

5.2.4、编写 Playbook 测试

]# cat test.yaml 
- hosts: all
  gather_facts: no
  tasks:
    - name: sleep 10
      command: sleep 10

 

 

posted @ 2023-05-13 12:01  小粉优化大师  阅读(37)  评论(0编辑  收藏  举报