[Ansible系列]ansible JinJia2过滤器
目录
一. JinJia2简介
二. JinJia2模板使用
2.1 在play中使用jinjia2
2.2 template模块使用
2.3 jinjia2条件语句
2.4 jinjia2循环语句
2.5 jinjia2过滤器
2.5.1 default过滤器
2.5.2 字符串操作相关过滤器
2.5.3 数字操作相关过滤器
2.5.4 列表操作相关过滤器
2.5.5 应用于文件的过滤器
2.5.6 应用于注册变量的过滤器
一. JinJia2简介
Jinja2是基于python的模板引擎。那么什么是模板?
假设说现在我们需要一次性在10台主机上安装redis,这个通过playbook现在已经很容易实现。默认 情况下,所有的redis安装完成之后,我们可以统一为其分发配置文件。这个时候就面临一个问题,这 些redis需要监听的地址各不相同,我们也不可能为每一个redis单独写一个配置文件。因为这些配置 文件中,绝大部分的配置其实都是相同的。这个时候最好的方式其实就是用一个通用的配置文件来解 决所有的问题。将所有需要修改的地方使用变量替换。这个通用的配置文件就是模板。
二. JinJia2模板使用
2.1 在play中使用jinjia2
以上面的redis为例,我们创建一个redis的模板,模板如下:
[root@clinet ~]# cat /etc/redis.conf |grep -v ^# |grep -v ^$
bind {{ ansible_eth0.ipv4.address }} 127.0.0.1
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
现在我们有了一个模板文件,那么在playbook中如何来使用呢? playbook使用template模块来实现模板文件的分发,其用法与copy模块基本相同,唯一的区别是, copy模块会将原文件原封不动的复制到被控端,而template会将原文件复制到被控端,并且使用变 量的值将文件中的变量替换以生成完整的配置文件。
playbook示例:
[root@clinet yum_file]# cat jinjia2/install_redis.yml
- hosts: testtasks:- name: configure redis max memoryset_fact:redis_mem: "{{ (ansible_memtotal_mb /2) | int }}M"- name: debug memeory debug:msg: - '{{ redis_mem }}'- name: install redis package:name: redisstate: present- name: configure redis.conftemplate:src: /root/ansible_test/ansible_2/template/redis.conf.j2dest: /etc/redis.confnotify:- restart redis- name: start redisservice:name: redisstate: startedenabled: yeshandlers:- name: restart redisservice:name: redisstate: restarted
[root@clinet yum_file]#
2.2 template模块使用
template模块会将原文件复制到被控端,并且使用变 量的值将文件中的变量替换以生成完整的配置文件。
关于template模块的更多参数说明:
· backup:如果原目标文件存在,则先备份目标文件
· dest:目标文件路径
· force:是否强制覆盖,默认为yes
· group:目标文件属组
· mode:目标文件的权限
· owner:目标文件属主
· src:源模板文件路径
· validate:在复制之前通过命令验证目标文件,如果验证通过则复制
2.3 jinjia2条件语句
在上面的示例中,我们直接取了被控节点的ens33网卡的ip作为其监听地址。那么假如有些机器的网卡绑定的,那么网络连接时是bond0,这种做法就会报错。这个时候我们就需要在模板文件中定义条件语句如下:
{% if ansbile_bond is defined %}
bind {{ ansible_bond.ipv4.address }} 127.0.0.1
{% elif ansible_bond is defined % }
bind {{ ansible_ens33.ipv4.address }} 127.0.0.1
{% else %}
bind 0.0.0.0
{% endif %}maxmemory {{ redis_mem }}
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
利用条件语句进一步配置redis主从模式:
{% if ansbile_bond is defined %}
bind {{ ansible_bond.ipv4.address }} 127.0.0.1
{% elif ansible_ens33 is defined %}
bind {{ ansible_ens33.ipv4.address }} 127.0.0.1
{% else %}
bind 0.0.0.0
{% endif %}{% if master_ip is defined %}
slaveof {{ master_ip }} {{ masterport | default(6379) }}
{% endif %}{% if masterpass is defined %}
masterauth {{ masterpass }}
{% endif %}{% if requirepass is defined %}
requirepass {{ requirepass }}
{% endif %}maxmemory {{ redis_mem }}
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
注意:
1. redis主从配置只需要在slave上配置slaveof ip port(master节点不需要任何配置)
2. 注意防火墙
2.4 jinjia2循环语句
以nginx做负载均能,代理到后端httpd的基础实验为例,展示基础的for循环使用。
inventory配置如下:
[proxy]
192.168.194.132[webserver]
192.168.194.130
192.168.194.131
[root@clinet ansible_2]#
playbook如下:
- hosts: proxy:webservergather_facts: yespre_tasks:- name: fireword.serverservice:name: firewalldstate: stoppedenabled: nopost_tasks:- name: message infodebug:msg: 'this playbook finished'tasks:- name: install & configure ngxin blockblock:- name: install nginxpackage:name: nginxstate: present- name: configure nginx.conftemplate:src: /root/ansible_test/ansible_2/template/nginx.conf.j2dest: /etc/nginx/nginx.confbackup: yesnotify: restart nginx- name: start ngixnservice:name: nginxstate: startedenabled: yeswhen: ansible_ens33.ipv4.address in groups['proxy']- name: install & configure httpd blockblock:- name: install httpdpackage:name: httpdstate: present- name: confgure http.conftemplate:src: /root/ansible_test/ansible_2/template/index.html.j2dest: /var/www/html/index.htmlbackup: yesnotify: restart httpd- name: start httpdservice:name: httpdstate: startedenabled: yeswhen: ansible_ens33.ipv4.address in groups['webserver']handlers:- name: restart nginxservice:name: nginxstate: restarted- name: restart httpdservice:name: httpdstate: restarted
总结一:
上述示例中回顾了以下知识点:1. pre_tasks 是在tasks之前执行;而 post_tasks 则在tasks和handlers之后执行;
2. when关键字,playbook中的条件语句
3. hosts: proxy:webserver,ansible的主机匹配规则
4. block和when的配合使用,对整块block语句做判断。等等
总结二:
jinjia2模板中的语法总结:
1. 变量的使用: {{ 变量名 }} (不需要用引号包裹,与playbook中的变量使用的主要区别)
2. 条件语句:
{% if %} ... {% elif %} ... {% else %} ... {% endif %}
3. 循环语句:
{% for %} ... {% endfor %}
(注意:{%%} 是jinjia2模板的语法格式)
2.5 jinjia2过滤器
2.5.1 default过滤器
当指定的变量不存在时,用于设定默认值
示例:
‐ hosts: testgather_facts: falsevars:‐ path: /tmp/testmode: 0400‐ path: /tmp/foo‐ path: /tmp/bartasks:‐ file:path: {{ item.path }}state: touchmode: {{ item.mode|default(omit)}}with_items: "{{ paths }}"
omit表示系统默认的,也可以default(777),当变量不存在的时候,使用777为值。
2.5.2 字符串操作相关过滤器
· upper:将所有字符串转换为大写
· lower:将所有字符串转换为小写
· capitalize:将字符串的首字母大写,其他字母小写
· reverse:将字符串倒序排列
· first:返回字符串的第一个字符
· last:返回字符串的最后一个字符
· trim:将字符串开头和结尾的空格去掉
· center(30):将字符串放在中间,并且字符串两边用空格补齐30位
· length:返回字符串的长度,与count等价
· list:将字符串转换为列表
· shuffle:list将字符串转换为列表,但是顺序排列,shuffle同样将字符串转换为列表,但是会随 机打乱字符串顺序
‐ hosts: testgather_facts: novars:teststr: "abc123ABC"teststr1: " abc "teststr2: "123456789"teststr3: "sfacb1335@#$%"tasks:‐ debug:msg: "{{ teststr | upper }}"‐ debug:msg: "{{ teststr | lower }}"‐ debug:msg: "{{ teststr | capitalize }}"‐ debug:msg: "{{ teststr | reverse }}"‐ debug:msg: "{{ teststr|first }}"‐ debug:msg: "{{ teststr|last }}"‐ debug:msg: "{{ teststr1 | trim }}"‐ debug:msg: "{{ teststr2 | center(30) }}"‐ debug:msg: "{{ teststr2 | length }}"‐ debug:msg: "{{ teststr3 | list }}"‐ debug:msg: "{{ teststr3 | shuffle }}"
2.5.3 数字操作相关过滤器
· int: 将对应的值转换为整数
· float:将对应的值转换为浮点数
· abs:获取绝对值
· round:小数点四舍五入
· random:从一个给定的范围中获取随机值
‐ hosts: testgather_facts: novars:testnum: ‐1tasks:‐ debug:msg: "{{ 8+('8'|int) }}"‐ debug:# 默认情况下,如果无法完成数字转换则返回0# 这里指定如果无法完成数字转换则返回6msg: "{{ 'a'|int(default=6) }}"‐ debug:msg: "{{ '8'|float }}"‐ debug:msg: "{{ 'a'|float(8.88)' }}"‐ debug:msg: "{{ testnum|abs }}"‐ debug:msg: "{{ 12.5|round }}"‐ debug:msg: "{{ 3.1415926 | round(5) }}"‐ debug:# 从0到100中随机返回一个数字msg: "{{ 100|random }}"‐ debug:# 从5到10中随机返回一个数字msg: "{{ 10|random(start=5) }}"‐ debug:# 从4到15中随机返回一个数字,步长为3# 返回的随机数只可能是:4,7,10,13中的一个msg: "{{ 15|random(start=4,step=3) }}"‐ debug:# 从0到15随机返回一个数字,步长为4msg: "{{ 15|random(step=4) }}"
2.5.4 列表操作相关过滤器
· length: 返回列表长度
· first:返回列表的第一个值
· last:返回列表的最后一个值
· min:返回列表中最小的值
· max:返回列表中最大的值
· sort:重新排列列表,默认为升序排列,sort(reverse=true)为降序
· sum:返回纯数字非嵌套列表中所有数字的和
· flatten:如果列表中包含列表,则flatten可拉平嵌套的列表,levels参数可用于指定被拉平的层级
· join:将列表中的元素合并为一个字符串
· random:从列表中随机返回一个元素
· shuffle
· upper
· lower
· union:将两个列表合并,如果元素有重复,则只留下一个
· intersect:获取两个列表的交集
· difference:获取存在于第一个列表中,但不存在于第二个列表中的元素 · symmetric_difference:取出两个列表中各自独立的元素,如果重复则只留一个
2.5.5 应用于文件的过滤器
· basename:返回文件路径中的文件名部分
· dirname:返回文件路径中的目录部分
· expanduser:将文件路径中的~替换为用户目录
· realpath:处理符号链接后的文件实际路径
2.5.6 应用于注册变量的过滤器
正常情况下,当某个task执行失败的时候,ansible会中止运行。此时我们可以通过 ignore_errors 来 捕获异常以让task继续往下执行。然后调用debug模块打印出出错时的内容,拿来错误结果后,主动 失败。
‐ name: Run myprogcommand: /opt/myprogregister: resultignore_errors: True
‐ debug:var: result‐ debug:msg: "Stop running the playbook if myprog failed"failed_when: result|failed
任务返回值过滤器:
· failed: 如果注册变量的值是任务failed则返回True
· changed: 如果注册变量的值是任务changed则返回True
· success:如果注册变量的值是任务succeeded则返回True
· skipped:如果注册变量的值是任务skipped则返回True
相关文章:
[Ansible系列]ansible JinJia2过滤器
目录 一. JinJia2简介 二. JinJia2模板使用 2.1 在play中使用jinjia2 2.2 template模块使用 2.3 jinjia2条件语句 2.4 jinjia2循环语句 2.5 jinjia2过滤器 2.5.1 default过滤器 2.5.2 字符串操作相关过滤器 2.5.3 数字操作相关过滤器 2.5.4 列表操作…...
Cookie、Session、Token区分
一开始接触这三个东西,肯定会被绕的不知道都是干什么的。1、为什么要有它们?首先,由于HTTP协议是无状态的,所谓的无状态,其实就是 客户端每次想要与服务端通信,都必须重新与服务端连接,这就意味…...
回暖!“数”说城市烟火气背后
“人间烟火气,最抚凡人心”。在全国各地政策支持以及企业的积极生产运营下,经济、社会、生活各领域正加速回暖,“烟火气”在城市中升腾,信心和希望正在每个人心中燃起。 发展新阶段,高效统筹经济发展和公共安全&#…...
JS逆向-百度翻译sign
前言 本文是该专栏的第36篇,后面会持续分享python爬虫干货知识,记得关注。 有粉丝留言,近期需要做个翻译功能,考虑到百度翻译语言语种比较全面,但是它的参数被逆向加密了,对于这种情况需要怎么处理呢?所以本文以它为例。 废话不多说,跟着笔者直接往下看正文详细内容。…...
Fiddler抓包之Fiddler过滤器(Filters)调试
Filters:过滤器,帮助我们过滤请求。 如果需要过滤掉与测试项目无关的抓包请求,更加精准的展现抓到的请求,而不是杂乱的一堆,那功能强大的 Filters 过滤器能帮到你。 2、Filters界面说明 fiddler中的过滤 说明&#…...
【xib文件的加载过程 Objective-C语言】
一、xib文件的加载过程: 1.xib文件,是不是在这里啊: View这个文件夹里, 然后呢,我们加载xib是怎么加载的呢, 是不是在控制器里,通过我们这个类方法,加载xib: TestAppView *appView = [TestAppView appView]; + (instancetype)appView{NSBundle *rootBundle = [N…...
react setState学习记录
react setState学习记录1.总体看来2.setState的执行是异步的3.函数式setState1.总体看来 (1). setState(stateChange, [callback])------对象式的setState 1.stateChange为状态改变对象(该对象可以体现出状态的更改) 2.callback是可选的回调函数, 它在状态更新完毕、界面也更新…...
Docker容器cpu利用率问题
1.top原理 top 是读的/proc/stat文件 比如cat /proc/PID/stat 进程的总Cpu时间processCpuTime utime stime cutime cstime,该值包括其所有线程的cpu时间 某一进程Cpu使用率的计算 计算方法: 1 采样两个足够短的时间间隔的cpu快照与进程快照&…...
FreeRTOS入门(06):任务通知
文章目录目的基础说明使用演示作为二进制信号量作为计数信号量作为事件组作为队列或邮箱相关函数总结目的 任务通知(TaskNotify)是RTOS中相对常用的用于任务间交互的功能,这篇文章将对相关内容做个介绍。 本文代码测试环境见前面的文章&…...
谷歌seo做的外链怎样更快被semrush识别
本文主要分享做谷歌seo外链如何能让semrush工具快速的记录并能查询到。 本文由光算创作,有可能会被剽窃和修改,我们佛系对待这种行为吧。 谷歌seo做的外链怎样更快被semrush识别? 答案是:多使用semrush搜索目标网站可加速爬虫抓…...
Java | IO 模式之 JavaBIO 应用
文章目录IO模型Java BIOJava NIOJava AIO(NIO.2)BIO、NIO、AIO的使用场景BIO1 BIO 基本介绍2 BIO 的工作机制3 BIO 传统通信实现3.1 业务需求3.2 实现思路3.3 代码实现4 BIO 模式下的多发和多收消息4.1 业务需求4.2 实现思路4.3 代码实现5 BIO 模式下接收…...
C语言学习及复习笔记-【18】C内存管理
18 C内存管理 C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 序号函数和描述1void *calloc(int num, int size); 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了…...
linux--多线程(一)
文章目录Linux线程的概念线程的优点线程的缺点线程异常线程的控制创建线程线程ID以及进程地址空间终止线程线程等待线程分离线程互斥进程线程间的互斥相关概念互斥量mutex有线程安全问题的售票系统查看ticket--部分的汇编代码互斥量的接口互斥量实现原理探究可重入和线程安全常…...
计算机组成原理(2.1)--系统总线
目录 一、总线基本知识 1.总线 2.总线的信息传送 3.分散连接图 4.注 二、总线结构的计算机举例 1.面向 CPU 的双总线结构框图 2.单总线结构框图 3.以存储器为中心的双总线结构框图 三、总线的分类 1.片内总线 2.系统总线 (板级总线或板间总线&#…...
C语言数组【详解】
数组1. 一维数组的创建和初始化1.1 数组的创建1.2 数组的初始化1.3 一维数组的使用1.4 一维数组在内存中的存储2. 二维数组的创建和初始化2.1 二维数组的创建2.2 二维数组的初始化2.3 二维数组的使用2.4 二维数组在内存中的存储3. 数组越界4. 数组作为函数参数4.1 冒泡排序函数…...
并行与体系结构会议
A类会议 USENIX ATC 2022: USENIX Annual Technical Conference(录用率21%) CCF a, CORE a, QUALIS a1 会议截稿日期:2022-01-06 会议通知日期:2022-04-29 会议日期:2022-07-11 会议地点:Carlsbad, Califo…...
【巨人的肩膀】JAVA面试总结(三)
1、💪 目录1、💪1、说说List, Set, Queue, Map 四者的区别1.1、List1.2、Set1.3、Map2、如何选用集合4、线程安全的集合有哪些?线程不安全的呢?3、为什么需要使用集合4、comparable和Comparator的区别5、无序性和不可重复性的含义…...
嵌入式 STM32 SHT31温湿度传感器
目录 简介 1、原理图 2、时序说明 数据传输 起始信号 结束信号 3、SHT31读写数据 SHT31指令集 读数据 温湿度转换 4、温湿度转换应用 sht3x初始化 读取温湿度 简介 什么是SHT31? 一主机多从机--通过寻址的方式--每个从机都有唯一的地址&…...
哪款蓝牙耳机打电话好用?打电话音质好的蓝牙耳机
现在几乎是人人离不开耳机的时代。在快节奏的生活和充满嘈杂声音的世界中,戴着耳机听歌,是每个人生活中最不可或缺的一段自由、放松的时光,下面小编就来分享几款通话音质好的蓝牙耳机。 一、南卡小音舱蓝牙耳机 动圈单元:13.3mm…...
【C++】-- 内存泄漏
目录 内存泄漏 内存泄漏分类 如何检测内存泄漏 如何避免内存泄漏 内存泄漏 #问:什么是内存泄漏?内存泄漏:指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某…...
C++ STL学习之【string类的模拟实现】
✨个人主页: Yohifo 🎉所属专栏: C修行之路 🎊每篇一句: 图片来源 The key is to keep company only with people who uplift you, whose presence calls forth your best. 关键是只与那些提升你的人在一起,…...
Selenium基于POM的自动化测试实践
什么是Page Object模式 Page Object 见名知意,就是页面对象,并将页面元素定位方法和元素操作进行分离。在实际自动化测试实战过程中,我们一般对脚本的实现分为三层: (1)对象层: 用于存放页面元素定位和控件操作 (2)逻…...
记录每日LeetCode 2373.矩阵中的局部最大值 Java实现
题目描述: 给你一个大小为 n x n 的整数矩阵 grid 。 生成一个大小为 (n - 2) x (n - 2) 的整数矩阵 maxLocal ,并满足: maxLocal[i][j] 等于 grid 中以 i 1 行和 j 1 列为中心的 3 x 3 矩阵中的 最大值 。 换句话说,我们希…...
QT中级(6)基于QT的文件传输工具(2)
QT中级(6)基于QT的文件传输工具(2)本文实现第一步1 新增功能2 运行效果3 实现思路4 源代码实现这个文件传输工具大概需要那几步?实现多线程对文件的读写实现TCP客户端和服务端实现网络传输 书接上回:QT中级…...
【Linux】工具(3)——gcc/g++
咱们继续进阶,接下来进入到Linux工具中gcc和g的学习在本章博客正式开始介绍之前,我们先要弄清楚程序是怎么翻译的:C语言程序环境一、什么是gcc/g📌gcc是一个c编译器, g是c编译器。我们根据代码的后缀名来判断用哪个编译…...
Android文件选择器
使用方法:在里层的build.grade的dependency里面加入: implementation com.leon:lfilepickerlibrary:1.8.0 引用https://github.com/leonHua/LFilePicker/blob/master/README_CH.md#lfilepicker LFilePicker 说明:如果发现应用名称被修改,可以参考issues#26 查看解决方案,或…...
《MySql学习》 Select 查询语句慢的非性能原因
一.查询被阻塞 A会话执行 查询操作,长时间没有返回信息,此时我们就可以去排查一下是否是被阻塞了 select * from words 被阻塞的原因有很多,首先列举第一种情况 1.等MDL锁 当我们执行DDL语句时,会自动给表加上MDL写锁。当执行DML和DQL时&…...
Vue组件间通信方式超详细(父传子、父传后代、子传父、后代传父、兄弟组件传值)
一、父传子、父传后代 方式一:子通过props来接收 父组件:父组件引入子组件时,通过<child :parentValue "parentValue"></child>子组件传值。 备注:这种方式父传值很方便,但是传递给后代组件不…...
【ES】Elasticsearch-深入理解索引原理
文章目录Elasticsearch-深入理解索引原理读操作更新操作SHARD不变性动态更新索引删除和更新实时索引更新持久化Segment合并近实时搜索,段数据刷新,数据可见性更新和事务日志更新索引并且将改动提交修改Searcher对象默认的更新时间Elasticsearch-深入理解…...
pdf压缩文件大小的方法是什么?word文件怎么批量转换成pdf格式?
大家在存储文件时,通常会遇到一些较大的文件,这时需要对其进行压缩处理。下面介绍一下如何压缩PDF文件大小以及批量转换Word文件为PDF格式。pdf压缩文件大小的方法是什么?1.打开小圆象PDF转换器,选择“PDF压缩”功能。2.在“PDF压缩”界面中…...
成都科技网站建设找/网络营销策略存在的问题
时间进入2019年,我们在网页设计中看到旧有风格的重生,也见证了新的设计趋势的诞生。 Web 技术的快速发展,不仅让设计和产品足以满足更多更细致深入的需求,也让设计师能够进行更细腻更独特的表达。现今的网页设计趋势,…...
wordpress主题背景图片/营销推广有哪些公司
time模块 表示时间有三种表示方式: 时间戳-----time.time(); 格式化的字符串形式 ------time.strftime(); 结构化的元组----time.localtime() time.time(): 时间戳,主要是给计算机看的,从1970年算起到现在过了多少秒; import time…...
面试网站开发员/优化大师win10能用吗
偶尔想在宿舍使用下VCS做些模块,从EETOP上下载了2009.12 MX版本的vcs,在自己vmware (X64) (Ubuntu 2.6.38-8-generic (32bit))下安装一路出现了问题首先:在进行安装时出现失败查找install.log出现如下错误chmod: cannot access var: No such…...
柳州网站建设价格/内蒙古网站seo
说到原型法,首先应该想到原型模型,20 世纪 80 年代中期推出一种新的开发模式,弥补了传统结构化生命周期法的不足,缩短了开发周期,减少了开发风险,这种开发模型叫作原型模型。原型模型是先借用已有软件系统作…...
北京app制作开发/广东seo快速排名
看过openstack的安装脚本,但自己一直再用手动安装.在dashboard地方总是出现健全问题,检查keystone,nova总是定位不出来原因.不想拖得太久时间,也会采用脚本安装方式.这里收藏网友陈沙克的文章http://hi.baidu.com/chenshake/blog/item/4ed92d4e96768dd7d0c86a3e.html.供本人自己…...
wordpress 访客/广州全网推广
目录 一.静态代理 二.动态代理: 一.静态代理 1)静态代理角色分析: a:抽象角色:一般使用接口 或者 抽象类来实现。 b:真实角色:被代…...