第 1 层
直接通过命令行使用 Ansible 命令
第 2 层
将 Ansible 里的内容写入到 Playbook 里,执行 Playbook,Playbook 类似于 1 个脚本
第 3 层
制作 1 个 Ansible role,之后在 Playbook 里调用 role,一次性调用多个 role 时可以用分号 “;” 相隔,role 类似于 1 个自定义的模块
直接通过命令行使用 Ansible 命令
将 Ansible 里的内容写入到 Playbook 里,执行 Playbook,Playbook 类似于 1 个脚本
制作 1 个 Ansible role,之后在 Playbook 里调用 role,一次性调用多个 role 时可以用分号 “;” 相隔,role 类似于 1 个自定义的模块
# python3
>>> import uuid
>>> uuid.uuid4()
>>> uuid.uuid4().get_hex()
1) 在增加 Django MariaDB&MySQL 数据之前要先创建连接了 MariaDB 数据库或 MySQL 数据库的 Django 项目
2) 对于本文而言,必须要先完成内容一里的内容,再完成内容二里的内容,才能继续完成内容三里的内容
(django_env) [root@python mysite]# python3
>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
>>> django.setup()
>>> from movies.models import *
>>> def showsql():
... from django.db import connection
... print(connection.queries[-1]['sql'])
(补充:这里的 [-1] 是指显示上 1 条操作的 SQL 语句)
>>> Movies.objects.get(mid=2)
<Movies: Movies object (2)>
(补充:这里以查询 movies 表中 mid 字段的值为 2 的数据为例)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mid` = 2 LIMIT 21
(补充:这里以查询 movies 表中 mid 字段的值为 2 的数据为例)
>>> Movies.objects.filter(mname__exact='Titanic')
<QuerySet [<Movies: Movies object (1)>]>
(补充:这里以查询 movies 表中 mname 字段的值精确为 Titanic 的数据为例)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mname` = 'Titanic' LIMIT 21
(补充:这里以查询 movies 表中 mname 字段的值精确为 Titanic 的数据为例)
>>> Movies.objects.filter(mname='titanic')
<QuerySet [<Movies: Movies object (1)>]>
(补充:这里以查询 movies 表中 mname 字段的值为 titanic 的数据为例)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mname` = 'titanic' LIMIT 21
(补充:这里以查询 movies 表中 mname 字段的值为 titanic 的数据为例)
>>> Movies.objects.first()
<Movies: Movies object (1)>
(补充:这里以查询 movies 表中第一条数据为例)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` ORDER BY `movies`.`mid` ASC LIMIT 1
(补充:这里以查询 movies 表中第一条数据为例)
>>> Movies.objects.last()
<Movies: Movies object (5)>
(补充:这里以查询 movies 表中最后一条数据为例)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` ORDER BY `movies`.`mid` DESC LIMIT 1
(补充:这里以查询 movies 表中最后 1 条数据为例)
>>> Movies.objects.filter(mname__contains='it')
<QuerySet [<Movies: Movies object (1)>]>
(补充:这里以查询 movies 表中 mname 字段的值包含 it 字符串的所有数据为例)
(
注意:
1) 这里需要区分大小写
2) 这里的 mname__contains= 在 mname 和 contains 之间有两个下横线 “_”
)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mname` LIKE BINARY '%it%' LIMIT 21
(补充:这里以查询 movies 表中 mname 字段的值包含 it 字符串的所有数据为例)
>>> Movies.objects.filter(mname__contains='Car').exclude(mname__contains='Tit')
<QuerySet [<Movies: Movies object (4)>]>
(补充:这里以查询 movies 表中 mname 字段的值包含 Car 字符串但不包含 Tit 字符串的所有数据为例)
(
注意:
1) 这里需要区分大小写
2) 这里的 mname__contains= 在 mname 和 contains 之间有两个下横线 “_”
)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE (`movies`.`mname` LIKE BINARY '%Car%' AND NOT (`movies`.`mname` LIKE BINARY '%Tit%')) LIMIT 21
(补充:这里以查询 movies 表中 mname 字段的值包含 Car 字符串且不包含 Tit 字符串的所有数据为例)
>>> Movies.objects.filter(mid__gt='2')
<QuerySet [<Movies: Movies object (3)>, <Movies: Movies object (4)>, <Movies: Movies object (5)>]>
(补充:这里以查询 movies 表中 mid 字段的值大于 2 的所有数据为例)
(
注意:
1) 这里需要区分大小写
2) 这里的 mid__gt= 在 mid 和 gt 之间有两个下横线 “_”
)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mid` > 2 LIMIT 21
(补充:这里以查询 movies 表中 mid 字段的值大于 2 的所有数据为例)
>>> Movies.objects.filter(mid__gte='2')
<QuerySet [<Movies: Movies object (2)>, <Movies: Movies object (3)>, <Movies: Movies object (4)>, <Movies: Movies object (5)>]>
(补充:这里以查询 movies 表中 mid 字段的值大于等于 2 的所有数据为例)
(
注意:
1) 这里需要区分大小写
2) 这里的 mid__gte= 在 mid 和 gte 之间有两个下横线 “_”
)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mid` >= 2 LIMIT 21
(补充:这里以查询 movies 表中 mid 字段的值大于等于 2 的所有数据为例)
>>> Movies.objects.filter(mid__lt='2')
<QuerySet [<Movies: Movies object (1)>]>
(补充:这里以查询 movies 表中 mid 字段的值小于 2 的所有数据为例)
(
注意:
1) 这里需要区分大小写
2) 这里的 mid__lt= 在 mid 和 lt 之间有两个下横线 “_”
)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mid` < 2 LIMIT 21
(补充:这里以查询 movies 表中 mid 字段的值小于 2 的所有数据为例)
>>> Movies.objects.filter(mid__lte='2')
<QuerySet [<Movies: Movies object (1)>, <Movies: Movies object (2)>]>
(补充:这里以查询 movies 表中 mid 字段的值小于等于 2 的所有数据为例)
(
注意:
1) 这里需要区分大小写
2) 这里的 mid__lt= 在 mid 和 lt 之间有两个下横线 “_”
)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mid` <= 2 LIMIT 21
(补充:这里以查询 movies 表中 mid 字段的值小于等于 2 的所有数据为例)
>>> Movies.objects.filter(mid__in=(2,4))
<QuerySet [<Movies: Movies object (2)>, <Movies: Movies object (4)>]>
(补充:这里以查询 movies 表中 mid 字段的值为 2 或者为 4 的数据为例)
(
注意:
1) 这里需要区分大小写
2) 这里的 mid__in= 在 mid 和 in 之间有两个下横线 “_”
)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mid` IN (2, 4) LIMIT 21
>>> Movies.objects.filter(mid__range=(2,4))
<QuerySet [<Movies: Movies object (2)>, <Movies: Movies object (3)>, <Movies: Movies object (4)>]>
(补充:这里以查询 movies 表中 mid 字段的值在 2 和 4 之间的所有数据为例)
(
注意:
1) 这里需要区分大小写
2) 这里的 mid__range= 在 mid 和 range 之间有两个下横线 “_”
)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mid` BETWEEN 2 AND 4 LIMIT 21
(
补充:
1) 这里以查询 movies 表中 mid 字段的值在 2 和 4 之间的所有数据为例
2) 这一步翻译成 SQL 语句也可以是:SELECT movies
.mid
, movies
.mname
, movies
.mdesc
, movies
.mimg
, movies
.mlink
FROM movies
WHERE movies
.mid
>= 2 AND mid
<= 4
)
>>> Movies.objects.filter(mname__isnull=True)
<QuerySet []>
(补充:这里以查询 movies 表中 mname 字段是空值的数据为例)
(
注意:
1) 这里需要区分大小写
2) 这里的 mname__isnull= 在 mname 和 isnull 之间有两个下横线 “_”
)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mname` IS NULL LIMIT 21
(补充:这里以查询 movies 表中 mname 字段是空值的数据为例)
>>> Movies.objects.all()
<QuerySet [<Movies: Movies object (1)>, <Movies: Movies object (2)>, <Movies: Movies object (3)>, <Movies: Movies object (4)>, <Movies: Movies object (5)>]>
(补充:这里以查询 movies 表中所有的数据为例)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` LIMIT 21
(补充:这里以查询 movies 表中所有的数据为例)
>>> Movies.objects.all()[2:4]
<QuerySet [<Movies: Movies object (3)>, <Movies: Movies object (4)>]>
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` LIMIT 2 OFFSET 2
(补充:这里以查询 movies 表中的第 2 条到第 4 条的数据为例)
>>> Movies.objects.filter(mname__startswith='Tit')
<QuerySet [<Movies: Movies object (1)>]>
(补充:这里以查询 movies 表中 mname 字段包含 Tit 的数据之后的所有数据为例)
(
注意:
1) 这里需要区分大小写
2) 这里的 mname__startswith 在 mname 和 startswith 之间有两个下横线 “_”
)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mname` LIKE BINARY 'Tit%' LIMIT 21
(补充:这里以查询 movies 表中 mname 字段以包含 Tit 的数据之后的所有数据为例)
>>> Movies.objects.filter(mname__endswith='nic')
<QuerySet [<Movies: Movies object (1)>]>
(补充:这里以查询 movies 表中 mname 字段包含 nic 的数据之前的所有数据为例)
(
注意:
1) 这里需要区分大小写
2) 这里的 mname__endswith 在 mname 和 endswith 之间有两个下横线 “_”
)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mname` LIKE BINARY '%nic' LIMIT 21
(补充:这里以查询 movies 表中 mname 字段包含 nic 的数据之前的所有数据为例)
>>> Movies.objects.values('mname','mid').filter(mname__contains='Tit')
<QuerySet [{'mname': 'Titanic', 'mid': 1}]>
(补充:这里以查询 movies 表中 mname 字段包含 Tit 的所有数据为例)
(
注意:
1) 这里需要区分大小写
2) 这里的 mname__contains 在 mname 和 contains 之间有两个下横线 “_”
)
>>> showsql()
SELECT `movies`.`mname`, `movies`.`mid` FROM `movies` WHERE `movies`.`mname` LIKE BINARY '%Tit%' LIMIT 21
(补充:这里以查询 movies 表中 mname 字段包含 Tit 的所有数据为例)
>>> Movies.objects.filter(mname__istartswith='Titanic')
<QuerySet [<Movies: Movies object (1)>]>
(补充:这里以查询 movies 表中 mname 字段包含 Titanic 的数据之后的所有数据为例)
(注意:这里的 mname__istartswith 在 mname 和 istartswith 之间有两个下横线 “_”)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mname` LIKE 'Titanic%' LIMIT 21
(补充:这里以查询 movies 表中 mname 字段包含 Titanic 的数据之后的所有数据为例)
>>> Movies.objects.order_by('mid')
<QuerySet [<Movies: Movies object (1)>, <Movies: Movies object (2)>, <Movies: Movies object (3)>, <Movies: Movies object (4)>, <Movies: Movies object (5)>]>
(补充:这里以查询 movies 表中的所有数据并以 mid 字段进行升序展示为例)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` ORDER BY `movies`.`mid` ASC LIMIT 21
(补充:这里以查询 movies 表中的所有数据并以 mid 字段进行升序展示为例)
>>> Movies.objects.order_by('-mid')
<QuerySet [<Movies: Movies object (5)>, <Movies: Movies object (4)>, <Movies: Movies object (3)>, <Movies: Movies object (2)>, <Movies: Movies object (1)>]>
(补充:这里以查询 movies 表中的所有数据并以 mid 字段进行降序展示为例)
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` ORDER BY `movies`.`mid` DESC LIMIT 21
(补充:这里以查询 movies 表中的所有数据并以 mid 字段进行降序展示为例)
>>> Movies.objects.count()
5
(补充:这里以查询 movies 表中的所有数据为例)
>>> showsql()
SELECT COUNT(*) AS `__count` FROM `movies`
(补充:这里以查询 movies 表中的所有数据为例)
在网页上出现的报错信息
DisallowedHost at /
Invalid HTTP_HOST header: '192.168.102.2:8000'. You may need to add '192.168.102.2' to ALLOWED_HOSTS.
Request Method: GET
Request URL: http://192.168.102.2:8000/
Django Version: 1.11.6
Exception Type: DisallowedHost
Exception Value:
Invalid HTTP_HOST header: '192.168.102.2:8000'. You may need to add '192.168.102.2' to ALLOWED_HOSTS.
Exception Location: /root/project/django_env/lib64/python3.6/site-packages/django/http/request.py in get_host, line 113
Python Executable: /root/project/django_env/bin/python
Python Version: 3.6.8
Python Path:
['/root/project/mysite',
'/usr/lib64/python36.zip',
'/usr/lib64/python3.6',
'/usr/lib64/python3.6/lib-dynload',
'/root/project/django_env/lib64/python3.6/site-packages',
'/root/project/django_env/lib/python3.6/site-packages']
Server time: Thu, 27 Feb 2020 06:08:45 +0000
(django_env) [root@python mysite]# vi mysite/settings.py
将以下内容:
......
ALLOWED_HOSTS = []
......
修改为:
......
ALLOWED_HOSTS = ['*']
......
作者:朱明宇
名称:批量修改多个远程服务器某个用户的密码
作用:批量修改多个远程服务器某个用户的密码,并显示密码更新时间
1. 将此脚本和清单 $list 文件放在同一目录下
2. 清单 $list 里每个服务器名占用 1 行
3. 给脚本分割线里的变量赋值
4. 给此脚本添加执行权限
5. 执行此脚本
1. list=”list.txt” #指定清单的目录和名称
2. user=eternalcenter #指定要修改密码的用户
3. password=eternalcenter #指定要修改的密码
此脚本执行前必须要先保证执行本脚本的用户能无密码 ssh 远程这些远程服务器,并且可以通过 sudo 获得 su 的 root 权限
#!/bin/bash
####################### Separator ########################
list="list.txt"
user=eternalcenter
password=eternalcenter
####################### Separator ########################
num=1
cat $list
for i in `cat $list`
do
echo $num
echo $i
ssh -t $i "sudo -u root su - root -c \"echo $password | passwd --stdin $user\""
ssh -t $i "sudo -u root su - root -c \"echo $user:$password | chpasswd\""
ssh -t $i sudo -u root su - root -c \"chage -l $user\"
let num++
echo
done