此处将为大家介绍关于在jinja2模板上使用CSS样式表的详细内容,并且为您解答有关jq写css样式的相关问题,此外,我们还将为您介绍关于05-jinja2模板、2.Flaskjinjia2模板、an
此处将为大家介绍关于在jinja2模板上使用CSS样式表的详细内容,并且为您解答有关jq写css样式的相关问题,此外,我们还将为您介绍关于05-jinja2模板、2.Flask jinjia2模板、ansible - jinja2模板、ansible使用jinja2模板的有用信息。
本文目录一览:在jinja2模板上使用CSS样式表(jq写css样式)
我正在使用html,css,flask和jinja2创建网站。
我有一个在Flask服务器上工作的页面,显示了按钮和标签等,但是没有加载我的CSS样式表。
如何将样式表链接到jinja2模板。我在互联网上四处张望,但找不到答案。
这是css样式表链接;我应该更改此代码还是python代码?
<link rel="stylesheet" type="text/css" href="styles.css">
这是我的烧瓶代码:
@app.route('/')
def resultstemplate():
return render_template('questions.html',head='Welcome!')
这是文件的位置:
/python-code.py /templates/template.html /templates/styles.css
05-jinja2模板
⼀、Ansible Jinja2模板背景介绍
⽬前Nginx的配置⽂件在所有的服务器上都是相同的,但我希望能根据每⼀台服务器的性能去定制服务的启动进程。
同时定制每⼀台Nginx服务的响应头,以便于当某台服务出现问题时能快速定位到具体的服务器。
要做这样的定制势必会导致⼀个问题,Nginx 在每台物理服务器上的配置⽂件都不⼀样,
这样的配置⽂件如何管理呢? 再使⽤copy 模块去做管理显然已经不合适。
此时使⽤Ansible 提供的另⼀个模板(template) 功能,它可以帮助我们完美的解决问题。
⼆、 JinJa2 模板
要学会Ansible 中的模板(template)使⽤,前提我们必须要学会JinJa2模板。学会了它,就相当于我们学会了Ansible 模板。
JinJa2 是什么
Jinja2是基于Python书写的模板引擎。功能⽐较类似于PHP的smarty模板。
JinJa2 必知必会
1、jinja2 ⽂件以 .j2 为后缀, 也可以不写后缀。
2、jinja2 中存在 三种定界符
- 注释: {# 注释内容 #}
- 变量引⽤: {{ var }}
- 逻辑表达: {% %}
JinJa2 逻辑控制
条件表达
{% if %}
...
{% elif %}
...
{% else %}
...
{% endif %}
Example
{# 如果定义了 idc 变量, 则输出 #}
{% if idc is defined %}
{{ idc }}
{% elif %}
没有定义
{% endif %}
循环控制
{% for %}
...
...
{% endfor %}
Example
{# 列举出 dbservers 这个 group 中的所有主机 #}
{% for host in groups[''dbservers''] %}
{{ host }}
{% endfor %}
{#与Python 语法不通,模板中的循环内不能break或continue。但你可以在迭代中过滤序列来跳过某些项#}
{#打印dbservers 组中的所有主机,但是不打印1.1.1.1 这台主机#}
{% for host in groups[''dbservers''] if host !="1.1.1.1" %}
{{host}}
{% endfor %}
三、如何使用模板
⼀个基于Facts的Jinja2 实例
# cat config.j2
{# use variable example #}
{# 都是内置变量 #}
wlecome host {{ ansible_hostname }}, os is {{ ansible_os_family }}
today is {{ ansible_date_time.date }}
cpucore numbers {{ ansible_processor_vcpus }}
{# use condition example #}
{% if ansible_processor_vcpus > 1 %}
OS cpu more than one core
{% endif %}
{% for m in ansible_mounts if m[''mount''] != "/" %}
mount {{ m[''mount''] }}, total size is
{{m[''size_total'']}}, free size is
{{m[''size_available'']}}
{% endfor %}
在Ansible 中使⽤模板
---
- name: a template example
hosts: all
remote_user: root
tasks:
- name: update jinja2 config
template: src=config.j2 dest=/tmp/config.conf
四、 实例演示
Jinja2 模板以及如何在Ansible中使⽤模板,已经介绍完了。那么如何去实现我们的需求呢?
# cat Nginx.conf.j2
user Nginx;
{# start process equal cpu cores #}
worker_processes {{ ansible_processor_vcpus }};
error_log /var/log/Nginx/error.log;
pid /var/run/Nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/Nginx/mime.types;
default_type application/octet-stream;
log_format main ''$remote_addr - $remote_user
[$time_local] "$request" ''
''$status $body_bytes_sent
"$http_referer" ''
''"$http_user_agent"
"$http_x_forwarded_for"'';
sendfile on;
tcp_nopush on;
keepalive_timeout 0;
gzip on;
gzip_min_length 1k;
gzip_buffers 8 64k;
gzip_http_version 1.0;
gzip_comp_level 5;
gzip_types text/plain application/x-javascript
text/css application/json application/xml
application/x-shockwave-flash application/javascript
image/svg+xml image/x-icon;
gzip_vary on;
{# add_header {{ ansible_hostname }}; #}
add_header x-hostname {{ ansible_hostname }};
include /etc/Nginx/conf.d/*.conf;
}
继续优化我们的PlayBook, 让它⽀持模板
vars:
createuser:
- tomcat
- www
- MysqL
tasks:
- name: create user
user: name={{ item }} state=present
with_items: "{{ createuser }}"
- name: yum Nginx webserver
yum: name=Nginx state=present
# use ansible template
- name: update Nginx main config
template:
src: Nginx.conf.j2
dest: /etc/Nginx/Nginx.conf
tags: updateconfig
notify: reload Nginx server
- name: add virtualhost config
copy:
src: www.qfedu.com.conf
dest: /etc/Nginx/conf.d/
tags: updateconfig
notify: reload Nginx server
- name: check Nginx Syntax
shell: /usr/sbin/Nginx -t
register: NginxSyntax
tags: updateconfig
- name: check Nginx running
stat: path=/var/run/Nginx.pid
register: Nginxrunning
tags: updateconfig
- name: print Nginx Syntax
debug: var=NginxSyntax
- name: start Nginx server
service: name=Nginx state=started
when:
- NginxSyntax.rc == 0
- Nginxrunning.stat.exists == false
handlers:
- name: reload Nginx server
service: name=Nginx state=started
when:
- NginxSyntax.rc == 0
- Nginxrunning.stat.exists == true
执⾏还是按照原来的⽅式执⾏即可
ansible-playbook -i hosts site.yml
1
总结
以上是小编为你收集整理的05-jinja2模板全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
原文地址:https://www.cnblogs.com/yzgblogs/p/15201025.html
2.Flask jinjia2模板
1.1.模板传参
(1)主程序
from flask import Flask,render_template
app = Flask(__name__)
@app.route(''/'')
def hello_world():
context = {
''username'':''derek'',
''age'':18,
''gf'':{
''name'':''xxx'',
''height'':160
}
}
return render_template(''index.html'',**context) #加双下划綫,就可以直接获取key和value了
if __name__ == ''__main__'':
app.run(debug=True)
(2)index.html
<h2>模板中渲染数据</h2>
<p>{{ username }}</p>
<p>{{ age }}</p>
<p>{{ gf.name }}</p>
<p>{{ gf[''height''] }}</p>
1.2.过滤器
常用的过滤器
- abs:绝对值
- default:如果当前变量没有值,则会使用参数中的值来替代
- escape:转义字符
- first:返回一个序列的第一个元素
- format:格式化字符串
- last:返回一个序列的最后一个元素
- length:返回一个序列的长度
- join:拼接字符串
- safe:关掉转义
- int:转为int类型
- float:转为浮点类型
- lower:转换为小写
- upper:转换为答谢
- replace:替换
- truncate:截取length长度的字符串
- striptags:删除字符串中所有的html标签,如果出现多个空格,将替换成一个空格
default过滤器的使用
主程序
from flask import Flask,render_template
app = Flask(__name__)
@app.route(''/'')
def hello_world():
context = {
''position'':-9,
''signature'':None #个性签名
}
return render_template(''index.html'',**context)
if __name__ == ''__main__'':
app.run(debug=True)
index.html
<h2>过滤器</h2>
<p>{{ position|abs }}</p>
<p>个性签名:{{ signature|default(''此人很懒,没有留下任何说明'',boolean=True) }}</p>
也可以用or的方式
<h2>过滤器</h2>
<p>{{ position|abs }}</p>
{# <p>个性签名:{{ signature|default(''此人很懒,没有留下任何说明'',boolean=True) }}</p>#}
<p>个性签名:{{ signature or ''此人很懒,没有留下任何说明'' }}</p>
1.3.自定义过滤器
过滤器本质上就是一个函数,如果在模板中调用这个过滤器,那么就会将这个变量的值作为第一个参数传给过滤器这个函数,
然后函数的返回值会作为这个过滤器的返回值。需要使用一个装饰器:@app.template_filter(''args'')
实例:自定义时间处理过滤器
主程序
from flask import Flask,render_template
from datetime import datetime
app = Flask(__name__)
@app.route(''/'')
def hello_world():
context = {
''create_time'':datetime(2018,5,25,17,52,10)
}
return render_template(''index.html'',**context)
@app.template_filter(''handle_time'') #括号里面是自己给过滤器起的名字
def handle_time(time):
''''''
1.如果时间间隔小与1分钟以内,就显示“刚刚”
2.如果是1小时以内,显示“xx分钟”
3.如果24h以内,显示“xx小时前”
4.如果大于24小时小与30天,显示“xx天前”
5.大于一个月,显示具体的时间
:param time:
:return:
''''''
if isinstance(time,datetime):
now = datetime.now()
timestamp = (now-time).total_seconds() #当前时间离创建时间的秒数
if timestamp < 60: #60s以内
return "刚刚"
elif timestamp >= 60 and timestamp < 60*60:
minutes = timestamp / 60
return "%s分钟前"%int(minutes)
elif timestamp >= 60*60 and timestamp < 60*60*24:
hours = timestamp / (60*60)
return ''%s小时前''%int(hours)
elif timestamp >= 60*60*24 and timestamp < 60*60*24*30:
days = timestamp / (60*60*24)
return ''%s天前''%int(days)
else:
return time.strftime(''%Y/%m/%d %H:%M'')
else:
return time
if __name__ == ''__main__'':
app.run(debug=True)
index.html
<h2>自定义时间过滤器</h2>
{{ create_time|handle_time }}
1.4.if和for的使用
for中包含以下变量,可以用来获取当前的遍历状态
- loop.index
- loop.index0
- loop.first
- loop.last
- loop.length
if和for简单用法
from flask import Flask,render_template
app = Flask(__name__)
app.config.update({
''DEBUG'':True,
''TEMPLATES_AUTO_RELOAD'':True
})
@app.route(''/'')
def hello_world():
context = {
''age'':20,
''users'':[''tom'',''jack'',''alice''],
''person'':{
''name'':''derek'',
''age'':18
}
}
return render_template(''index.html'',**context)
if __name__ == ''__main__'':
app.run(debug=True)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% if age >= 18 %}
欢迎
{% else %}
无权限
{% endif %}
<ul>
{% for user in users %}
<li>{{ user }}</li>
{% endfor %}
</ul>
<table>
<thead>
<tr>
<th>用户名</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
<tr>
{% for key,value in person.items() %}
<td>{{ value }}</td>
{% endfor %}
</tr>
</tbody>
</table>
</body>
</html>
1.5.宏的使用和导入
模板的宏跟python中的函数类似,可以传递参数,但是不能有返回值,可以将一些经常用到的代码片段放到宏中,然后把一些
不固定的值抽取出来当成一个变量。
(1)简单使用实例
{# 定义一个宏,input是宏的名字,里面三个参数,可以指定默认参数值,也可以调用的传参#}
{% macro input(name="",value="",type="text") %}
<input name="{{ name }}" value="{{ value }}" type="{{ type }}">
{% endmacro %}
<form>
<p>用户名:{{ input(''username'') }}</p>
<p>密码:{{ input(''password'',type="password" )}}</p>
<p> {{ input(value="提交",type="submit" )}}</p>
</form>
(2)宏的两种导入方式
新建macros.html
{% macro input(name="",value="",type="text") %}
<input name="{{ name }}" value="{{ value }}" type="{{ type }}">
{% endmacro %}
index.html中导入使用宏
{#第一种#}
{# with context可以把后端传到当前模板的变量传到定义的宏里面#}
{% import "macros.html" as macro with context %}
{#第二种#}
{% from "macros.html" import input as input_field %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# 第一种#}
<form>
<p>用户名:{{ macro.input(''username'') }}</p>
<p>密码:{{ macro.input(''password'',type="password" )}}</p>
<p> {{ macro.input(value="提交",type="submit" )}}</p>
</form>
{# 第二种#}
<form>
<p>用户名:{{ input_field(''username'') }}</p>
<p>密码:{{ input_field(''password'',type="password" )}}</p>
<p> {{ input_field(value="提交",type="submit" )}}</p>
</form>
</body>
</html>
1.6.set、with在模板中自定义变量
(1)set
在模板中可以使用set来定义变量,一旦定义了这个变量,在后面的代码中都可以使用,index.html
{% set usernmae=''derek'' %}
<p>用户名:{{ usernmae }}</p>
(2)with
with语句定义的变量,只能在with语句代码块(endwith)里面使用,超过代码块,就不能再使用了,set语句没有end,全局使用
{% with age=18 %}
<p>年龄:{{ age }}</p>
{% endwith %}
1.7.蓝图的使用
目录如下:
(1)news.py
from flask import Blueprint
news_bp = Blueprint(''new'',__name__,url_prefix=''/news'') @news_bp.route(''/list/'') def news_list(): return ''新闻列表''
(2)user.py
from flask import Blueprint
# 1.定义一个蓝图,''user'':蓝图的名字,url_prefix=''/user'':给url加一个前缀,注意后面不要加''/'' user_bp = Blueprint(''user'',__name__,url_prefix=''/user'') @user_bp.route(''/profile/'') def profile(): return ''个人中心''
(3)bluepoint_demo.py
from flask import Flask,url_for
# 2.导入 from blueprints.user import user_bp from blueprints.news import news_bp app = Flask(__name__) # 3.注册蓝图 app.register_blueprint(user_bp) app.register_blueprint(news_bp) @app.route(''/'') def hello_world(): return ''Hello World!'' with app.test_request_context(): print(url_for(''new.news_list'')) # /news/list/ 通过url_for反转url的时候要加蓝图的名字 print(url_for(''user.profile'')) # /user/profile/ if __name__ == ''__main__'': app.run(debug=True)
ansible - jinja2模板
ansible - jinja2模板
什么是jinja模板
jinja2是python的全功能模板引擎
jinja2模板和ansible的关系
ansible通常会使用jinja2模板来修改被管理主机配置文件等 在sltstack中同样会使用到jinja2,模板
如果在100台主机上安装Nginx,每台Nginx的端口都不一样,怎么解决
ansible如何使用jinja2
使用ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是将文件复制到远端主机上去,但是区别在于,template模块可以获取到文件中的变量,而copy则是将原封不动的文件内容复制过去。
之前我们在推送rsync的backup脚本是,想着吧脚本的变量名改成主机名,如果使用copy模块则推送过去就是{{ ansible_fdpn }},不变,如果使用template,则会变成对应的主机名
ansible使用jinja2注意事项
Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用
# 注意:不是每个管理员都需要这个特性,但是有些时候jinja2模块能大大提高效率
jinja2模板基础语法
# 调用变量
{{ 变量名 }}
{# 注释 #}
jinja2判断语法
# shell 判断
if [ 条件 ];then
xxx
elif [ 条件 ];then
aaa
else
bbb
fi
# python判断
if 条件:
xxx
elif 条件:
aaa
else:
bbb
xxxx
# jinja2判断
{% if 提条件 %}
xxx
{% elif 条件 %}
aaa
{% else %}
bbb
{% endif %}
jinja2循环
{% for n in 条件 %}
xxx
{% endfor %}
jinja2实战部署keepalived
global_defs {
router_id {{ ansible_hostname }}
}
{% if ansible_hostname == "lb01" %}
vrrp_script check_web_zh {
script "/root/check_web.sh"
interval 5
}
vrrp_instance VI_1 {
track_script {
check_web_zh
}
state MASTER
priority 150
{% else %}
vrrp_instance VI_1 {
state BACKUP
priority 100
{% endif %}
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
jinja2实战部署负载均衡
# Nginx配置文件
upstream www.zh.com {
{% for num in range(7,9) %}
server 172.16.1.{{ num }};
{% endfor %}
}
server{
listen 80;
server_name www.zh.com;
location /{
proxy_pass http://www.zh.com;
}
}
作业
# 创建www用户
- hosts: all
tasks:
- include: /root/ansible/ansible2/usadd.yml
# 客户端下载nfs服务端下载nfs和rsync
- include: /root/ansible/ansible2/yum_nfs_rsync.yml
# 配置nfs服务
- include: /root/ansible/ansible2/nfs_conf.yml
- include: /root/ansible/ansible2/nfs_dir.yml
- include: /root/ansible/ansible2/start_nfs.yml
# 部署rsync配置
- include: /root/ansible/ansible2/rsync_conf.yml
- include: /root/ansible/ansible2/rsync_pass.yml
- include: /root/ansible/ansible2/rsync_dir.yml
- include: /root/ansible/ansible2/rsy_start.yml
# 部署wordpress
- include: /root/ansible/ansible2/PHP_Nginx_zip.yml
- include: /root/ansible/ansible2/Nginx_PHP_yes_no_install.yml
- include: /root/ansible/ansible2/Nginx_Nginxconf_PHP_conf.yml
- include: /root/ansible/ansible2/Nginx_dir.yml
- include: /root/ansible/ansible2/wordpress_unzip.yml
- include: /root/ansible/ansible2/Nginx_start.yml
# 部署数据库
- include: /root/ansible/ansible2/MysqL_install.yml
- include: /root/ansible/ansible2/MysqL_start.yml
- include: /root/ansible/ansible2/MysqL_conf.yml
- include: /root/ansible/ansible2/MysqLpython_install.yml
- include: /root/ansible/ansible2/MysqL_useradd.yml
- include: /root/ansible/ansible2/MysqL_wordpress_ku.yml
- include: /root/ansible/ansible2/MysqL_cp_sql.yml
- include: /root/ansible/ansible2/MysqL_sql_init.yml
- include: /root/ansible/ansible2/webs_mount_nfs.yml
- include: /root/ansible/ansible2/lb/yum_Nginx.yml
- include: /root/ansible/sersync/yum_inot_sersync.yml
when: ansible_hostname == "nfs"
- include: /root/ansible/ansible2/lb/Nginx_youhua.yml
when: ansible_hostname is match "lb*"
- include: /root/ansible/ansible2/lb/Nginx_conf.yml
when: ansible_hostname is match "lb*"
- include: /root/ansible/ansible2/lb/yum_kep.yml
- include: /root/ansible/ansible2/lb/kep_conf.yml
when: ansible_hostname is match "lb*"
- include: /root/ansible/ansible2/lb/keep_sh.yml
when: ansible_hostname == "lb01"
- include: /root/ansible/ansible2/lb/start_Nginx.yml
when: ansible_hostname is match "lb*"
- include: /root/ansible/sersync/sersync_dir.yml
when: ansible_hostname == "nfs"
- include: /root/ansible/sersync/unzip_sersync.yml
when: ansible_hostname == "nfs"
- include: /root/ansible/sersync/sersync_conf.yml
when: ansible_hostname == "nfs"
- include: /root/ansible/sersync/pass_sersync.yml
when: ansible_hostname == "nfs"
- include: /root/ansible/sersync/sersync_data_dir.yml
when: ansible_hostname == "backup"
- include: /root/ansible/sersync/start_sersync.yml
when: ansible_hostname == "nfs"
handlers:
- name: Nginx_start
service:
name: Nginx
state: restarted
- name: Nginx_conf_start
service:
name: Nginx
state: restarted
- name: PHP_start
service:
name: PHP-fpm
state: restarted
- name: lb_Nginx
service:
name: Nginx
state: restarted
- name: lb_keep
service:
name: keepalived
state: restarted
# 目录结构
[root@m01 ~]# tree
.
├── anaconda-ks.cfg
├── ansible
│ ├── 1.yml
│ ├── ansible2
│ │ ├── group_vars
│ │ │ └── all
│ │ ├── host_vars
│ │ ├── install_nfs_rsync.yml
│ │ ├── lb
│ │ │ ├── check_web.sh
│ │ │ ├── keepalived.conf
│ │ │ ├── keep_sh.yml
│ │ │ ├── kep_conf.yml
│ │ │ ├── Nginx_conf.yml
│ │ │ ├── Nginx_youhua
│ │ │ ├── Nginx_youhua.yml
│ │ │ ├── start_Nginx.yml
│ │ │ ├── www.zh.conf
│ │ │ ├── yum_kep.yml
│ │ │ └── yum_Nginx.yml
│ │ ├── MysqL_conf.yml
│ │ ├── MysqL_cp_sql.yml
│ │ ├── MysqL_install.yml
│ │ ├── MysqLpython_install.yml
│ │ ├── MysqL_sql_init.yml
│ │ ├── MysqL_start.yml
│ │ ├── MysqL_useradd.yml
│ │ ├── MysqL_wordpress_ku.yml
│ │ ├── nfs_conf.yml
│ │ ├── nfs_dir.yml
│ │ ├── Nginx_dir.yml
│ │ ├── Nginx_Nginxconf_PHP_conf.yml
│ │ ├── Nginx_PHP_yes_no_install.yml
│ │ ├── Nginx_start.yml
│ │ ├── PHP_Nginx_zip.yml
│ │ ├── rsync_conf.yml
│ │ ├── rsync_dir.yml
│ │ ├── rsync_pass.yml
│ │ ├── rsy_start.yml
│ │ ├── start_nfs.yml
│ │ ├── test.yml
│ │ ├── usadd.yml
│ │ ├── webs_mount_nfs.yml
│ │ ├── wordpress_unzip.yml
│ │ └── yum_nfs_rsync.yml
│ ├── group_vars
│ │ └── all
│ ├── host_vars
│ ├── httpd.yml
│ ├── sersync
│ │ ├── GNU-Linux-x86
│ │ │ ├── confxml.xml
│ │ │ └── sersync2
│ │ ├── pass_sersync.yml
│ │ ├── sersync2.5.4_64bit_binary_stable_final.tar.gz
│ │ ├── sersync_conf.yml
│ │ ├── sersync_data_dir.yml
│ │ ├── sersync_dir.yml
│ │ ├── start_sersync.yml
│ │ ├── unzip_sersync.yml
│ │ └── yum_inot_sersync.yml
│ └── zuoye.yml
├── group_vars
│ └── webs
├── host_ip.sh
├── host_vars
│ ├── web01
│ └── web02
├── http.yml
├── kaoshi_modify.zip
├── key.sh
├── latest-zh_CN.tar.gz
├── latest-zh_CN.tar.gz.1
├── nfs.sh
├── PHPNginx
│ ├── autoconf-2.69-11.el7.noarch.rpm
│ ├── automake-1.13.4-3.el7.noarch.rpm
│ ├── libjpeg-turbo-1.2.90-8.el7.x86_64.rpm
│ ├── libmcrypt-2.5.8-13.el7.x86_64.rpm
│ ├── libmemcached-1.0.16-5.el7.x86_64.rpm
│ ├── libX11-1.6.7-4.el7_9.x86_64.rpm
│ ├── libX11-common-1.6.7-4.el7_9.noarch.rpm
│ ├── libXau-1.0.8-2.1.el7.x86_64.rpm
│ ├── libxcb-1.13-1.el7.x86_64.rpm
│ ├── libXpm-3.5.12-1.el7.x86_64.rpm
│ ├── m4-1.4.16-10.el7.x86_64.rpm
│ ├── mod_PHP71w-7.1.33-1.w7.x86_64.rpm
│ ├── Nginx-1.22.0-1.el7.ngx.x86_64.rpm
│ ├── Nginx_PHP.tgz
│ ├── pcre2-10.23-2.el7.x86_64.rpm
│ ├── pcre-devel-8.32-17.el7.x86_64.rpm
│ ├── perl-Data-Dumper-2.145-3.el7.x86_64.rpm
│ ├── perl-Test-Harness-3.28-3.el7.noarch.rpm
│ ├── perl-Thread-Queue-3.02-2.el7.noarch.rpm
│ ├── PHP71w-cli-7.1.33-1.w7.x86_64.rpm
│ ├── PHP71w-common-7.1.33-1.w7.x86_64.rpm
│ ├── PHP71w-devel-7.1.33-1.w7.x86_64.rpm
│ ├── PHP71w-embedded-7.1.33-1.w7.x86_64.rpm
│ ├── PHP71w-fpm-7.1.33-1.w7.x86_64.rpm
│ ├── PHP71w-gd-7.1.33-1.w7.x86_64.rpm
│ ├── PHP71w-mbstring-7.1.33-1.w7.x86_64.rpm
│ ├── PHP71w-mcrypt-7.1.33-1.w7.x86_64.rpm
│ ├── PHP71w-MysqLnd-7.1.33-1.w7.x86_64.rpm
│ ├── PHP71w-opcache-7.1.33-1.w7.x86_64.rpm
│ ├── PHP71w-pdo-7.1.33-1.w7.x86_64.rpm
│ ├── PHP71w-pear-1.10.4-1.w7.noarch.rpm
│ ├── PHP71w-pecl-igbinary-2.0.5-1.w7.x86_64.rpm
│ ├── PHP71w-pecl-memcached-3.0.4-1.w7.x86_64.rpm
│ ├── PHP71w-pecl-mongodb-1.5.3-1.w7.x86_64.rpm
│ ├── PHP71w-pecl-redis-3.1.6-1.w7.x86_64.rpm
│ ├── PHP71w-process-7.1.33-1.w7.x86_64.rpm
│ └── PHP71w-xml-7.1.33-1.w7.x86_64.rpm
├── rsyncd.conf
├── rsync.sh
├── test.yml
├── wordpress
│ ├── wordpress.sql
│ └── wordpress.tgz
├── zh_var.yml
└── zuoye.sh
总结
以上是小编为你收集整理的ansible - jinja2模板全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
原文地址:https://www.cnblogs.com/ghjhkj/p/16441311.html
ansible使用jinja2模板
jinja2基本语法
- 控制结构 {% %}
jinja2中的for循环用于迭代Python的数据类型,包括列表,元组和字典
2.变量取值 {{ }}
jinja2模板中使用 {{ }} 语法表示一个变量,它是一种特殊的占位符。当利用jinja2进行渲染的时候,它会把这些特殊的占位符进行填充/替换,jinja2支持python中所有的Python数据类型比如列表、字段、对象等。
所有对变量的操作都必须在{{}}代码块中,{% %}只能使用一些控制语句
3.注释 {# #}
4.过滤器
safe: 渲染时值不转义
capitialize: 把值的首字母转换成大写,其他子母转换为小写
lower: 把值转换成小写形式
upper: 把值转换成大写形式
title: 把值中每个单词的首字母都转换成大写
trim: 把值的首尾空格去掉
striptags: 渲染之前把值中所有的HTML标签都删掉
join: 拼接多个值为字符串
replace: 替换字符串的值
round: 默认对数字进行四舍五入,也可以用参数进行控制
int: 把值转换成整型
只需要在变量后面使用管道(|)分割,多个过滤器可以链式调用,前一个过滤器的输出会作为后一个过滤器的输入
模板实例
cluster.name: es-cluster node.name: node-{{ ansible_default_ipv4[''address''].split(''.'')| last }} cluster.initial_master_nodes: node-{{ ansible_default_ipv4[''address''].split(''.'')| last }} path.data: {{ es_path_data }} path.logs: {{ es_path_logs }} network.host: 0.0.0.0 {% set hosts = [] %} #定义一个python列表变量 {% for host in groups[''elastic-master''] %} #使用循环控制语句遍历列表 {{ hosts.append(host) }} #对python列表变量进行操作 {% endfor %} discovery.seed_hosts: {{ hosts }} #输出变量的值 xpack.security.enabled: true xpack.security.http.ssl.enabled: true正确模板
cluster.name: es-cluster node.name: node-{{ ansible_default_ipv4[''address''].split(''.'')| last }} cluster.initial_master_nodes: node-{{ ansible_default_ipv4[''address''].split(''.'')| last }} path.data: {{ es_path_data }} path.logs: {{ es_path_logs }} network.host: 0.0.0.0 {% set seed_hosts = [] %} {% for host in groups[''elastic''] %} {% seed_hosts.append("{{ host }}") %} {% endfor %} discovery.seed_hosts: {{ seed_hosts }} xpack.security.enabled: true xpack.security.http.ssl.enabled: true错误模板
cluster.name: es-cluster node.name: node-{{ ansible_default_ipv4[''address''].split(''.'')| last }} cluster.initial_master_nodes: node-{{ ansible_default_ipv4[''address''].split(''.'')| last }} path.data: {{ es_path_data }} path.logs: {{ es_path_logs }} network.host: 0.0.0.0 {% set hosts = [] %} {% for host in groups[''elastic''] %} {% if hosts.append("{{ host }}") %} {% endif %} {% endfor %} discovery.seed_hosts: {{ hosts }} xpack.security.enabled: true xpack.security.http.ssl.enabled: true错误模板2
jinjia2字符串处理
使用和python的strip一样,{{ string | trim }} == string.strip()
python使用函数调用符号.号来进行调用string.strip
jinjia2使用 | 符号进行调用 {{ string | trim }}
把一个列表变量拼接成字符串
zookeeper.connect={{ groups[''zookeeper''] | join('':2181,'') }}:2181 拼接结果:zookeeper.connect=192.168.30.174:2181,192.168.30.175:2181,192.168.30.176:2181
ansible变量声明注意事项
ansible在vars中声明的变量名称中不能带有横线-号,只能带有下划线_
flink-history-dir 是错误的,ansible在读取的时候会报错
flink_history_dir 这样声明变量才可以
变量声明不能带.号
变量声明其他规则
ansible的模板变量渲染后带u(unicode).用template模块渲染,渲染后成了unicode的字符串。这样对应的前端服务无法解析该配置
- name: copy setuptools-24.0.2.tar.gz to {{ groups["all"] | to_json }} [''192.168.1.1'',''192.168.1.2'']
- name: copy setuptools-24.0.2.tar.gz to {{ groups["all"] }} [u''192.168.1.1'',u''192.168.1.2'']
总结
以上是小编为你收集整理的ansible使用jinja2模板全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
原文地址:https://www.cnblogs.com/yxh168/p/14822773.html
关于在jinja2模板上使用CSS样式表和jq写css样式的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于05-jinja2模板、2.Flask jinjia2模板、ansible - jinja2模板、ansible使用jinja2模板的相关知识,请在本站寻找。
本文标签: