From 23eec4661c7a4732c78ffb2e6c5c6bbf50a5db15 Mon Sep 17 00:00:00 2001 From: tan <123> Date: Mon, 15 Jul 2024 23:49:05 +0800 Subject: [PATCH] biji --- ...75\344\270\216\350\277\230\345\216\237.md" | 105 +++++ ...62\345\207\200\345\215\270\350\275\275.md" | 73 ++++ ...75\344\270\216\346\201\242\345\244\215.md" | 69 ++++ ...5\350\257\242+\347\264\242\345\274\225.md" | 117 ++++++ ...32\346\234\254\345\205\245\351\227\250.md" | 269 +++++++++++++ ...25\345\217\212\350\257\255\345\217\245.md" | 232 +++++++++++ ...50\345\214\226\350\277\220\347\273\264.md" | 359 ++++++++++++++++++ 7 files changed, 1224 insertions(+) create mode 100644 "17\351\273\204\344\270\275\345\207\244/2024.07.04-\346\225\260\346\215\256\345\272\223\345\244\207\344\273\275\344\270\216\350\277\230\345\216\237.md" create mode 100644 "17\351\273\204\344\270\275\345\207\244/2024.07.06-\344\270\213\350\275\275PostGreSQL+\345\271\262\345\207\200\345\215\270\350\275\275.md" create mode 100644 "17\351\273\204\344\270\275\345\207\244/2024.07.09-postgres \345\244\207\344\273\275\344\270\216\346\201\242\345\244\215.md" create mode 100644 "17\351\273\204\344\270\275\345\207\244/2024.07.10-\346\205\242\346\237\245\350\257\242+\347\264\242\345\274\225.md" create mode 100644 "17\351\273\204\344\270\275\345\207\244/2024.07.11-shell\350\204\232\346\234\254\345\205\245\351\227\250.md" create mode 100644 "17\351\273\204\344\270\275\345\207\244/2024.07.12-shell \346\265\213\350\257\225\345\217\212\350\257\255\345\217\245.md" create mode 100644 "17\351\273\204\344\270\275\345\207\244/2024.07.13-Ansible\350\207\252\345\212\250\345\214\226\350\277\220\347\273\264.md" diff --git "a/17\351\273\204\344\270\275\345\207\244/2024.07.04-\346\225\260\346\215\256\345\272\223\345\244\207\344\273\275\344\270\216\350\277\230\345\216\237.md" "b/17\351\273\204\344\270\275\345\207\244/2024.07.04-\346\225\260\346\215\256\345\272\223\345\244\207\344\273\275\344\270\216\350\277\230\345\216\237.md" new file mode 100644 index 0000000..e1539a8 --- /dev/null +++ "b/17\351\273\204\344\270\275\345\207\244/2024.07.04-\346\225\260\346\215\256\345\272\223\345\244\207\344\273\275\344\270\216\350\277\230\345\216\237.md" @@ -0,0 +1,105 @@ +### 数据库备份与还原 + +##### 1.备份 + +​ 备份类型: + +​ 1.冷备:需要关MySQL服务,读写请求均不允许状态下进行 + +​ 2.温备:服务在线,但仅支持读请求,不允许写请求 + +​ 3.热备:读,写不受影响 + + + +​ mysqldump工具是mysql数据库备份工具 + +​ mysqldump与MySQL是同级的,不可以在MySQL使用mysqldump工具 + +MySQLdump:单库备份,不会包含建库语句,所以恢复时要先指定数据库 + +​ 1.要么在恢复时,先指定好数据库(这个库可以任意) + +​ 2.要么在要恢复的表中写好创建数据库语句 + +``` +mysql -u 用户名 -p 要备份的表 > 存放路径(目标地址) +例如:mysql -u root -p testdb > /tmp/test.sql +``` + +指定多个库的备份,已经包含建库语句,所以恢复时不指定数据库 + +``` +mysql -u root -p >/tmp/test.sql +``` + +备份所有数据库 + +``` +mysqldump -u root -p --all-databases>/tmp/test.sql +``` + +备份单个表 + +``` +mysqldump -u 用户名 -p 库名 表名 >存放的路径 +mysqldump -u root -p AAA student >/tmp/test.sql +``` + +备份多个表 + +``` +mysqldump -u 用户名 -p 库名 表名1 表名2 >存放的路径 +mysqldump -u root -p mysql_test stu1 stu2 > /tmp/test.sql +``` + +只备份数据结构,不备份数据 + +``` +mysqldump -u 用户名 -p --no-creste-info 库 >存放的路径 +mysqldump -u root -p --no-creste-info mysql_test >/tmp/test.sql +``` + +备份数据库,压缩输出 + +``` +mysqldump -u 用户名 -p 库名 |gzip >/tmp/test.sql.gz +``` + +压缩再备份 + +``` +gzip -d 存放的位置 + +1. pg_dump -U postgres -d text > /tmp/test.sql +2. pg_dump -U postgres -d text -f 存放的位置 +3. pg_dump -U postgres -Fc text > 存放位置 + +​ 4. pg_dump -h x.x.x.x -U postgres -d text > /tmp/test.sql + + + +##### 备份一个或多个表 + +​ pg_dump -U 数据库用户 -d 数据库 -t 表1 -t 表2 >存放的位置 + + + +##### 压缩备份单个数据 + +pg_dump -U postgres -d test -t 表1 -t 表2 | gzip >存放的位置 + + + +##### 压缩恢复单个数据库 + +gunzip < 存放的位置 | psql -h 主机IP -U 数据库用户 -d 库 + +例如:gunzip /tmp/test.sql.gz + + + +##### 压缩恢复所有数据库 + +gunzip < /tmp/test.sql.gz | psql + + + +#### 恢复 + +1. psql -h 主机IP -U 用户 -d 要恢复的数据库 -f 被恢复数据的地址 + +​ 2. psql -h 主机IP -U 数据库用户 -d 要恢复的的数据库 < 被恢复数据的地址 + +如果加了-h 主机,就要密码,而且要指定-u这个选项指定用户名 \ No newline at end of file diff --git "a/17\351\273\204\344\270\275\345\207\244/2024.07.10-\346\205\242\346\237\245\350\257\242+\347\264\242\345\274\225.md" "b/17\351\273\204\344\270\275\345\207\244/2024.07.10-\346\205\242\346\237\245\350\257\242+\347\264\242\345\274\225.md" new file mode 100644 index 0000000..f827ac4 --- /dev/null +++ "b/17\351\273\204\344\270\275\345\207\244/2024.07.10-\346\205\242\346\237\245\350\257\242+\347\264\242\345\274\225.md" @@ -0,0 +1,117 @@ +### 慢查询 + +show variables 查看当前会话的系统变量 + +show variables like 'max_connections' 查看最大连接数 + +select sleep(3); 慢查询等3秒再查找 + +select count(1) from 表名; 查看表中有几条数据 + + + +注意:超过阈值才会被记录,等于不会被记录 + +​ 默认慢查询要超过10秒才算慢 + + + +开启慢查询 + +``` +set global show_query_log=on +``` + +查询慢查询的配置(查看慢查询日志是否开启) + +``` +show variables like '%show_query_log%' +``` + +查看long_query_time时间 + +``` +show variables like '%long_query_time%' +``` + +查询当前系统中有多少条慢查询记录 + +```bash +show global status like '%Slow_queries%'; +``` + +/var/run/mysqld/mysqld.sock 记录慢查询的日志,谁慢查谁 + + + +### 索引 + +##### 索引是对数据库表中一列或多列的值进行排序的一种结构,可以大大提高MySQL的检索速度 + +如果MySQL中有大数据量的表,需要花时间创建最优秀的索引,或优化查询语句 + +有主键的列不用创建索引 + +explain select * from ttt where id=998 #查询ttt表中id是998的行 (分析这条命令如何查找的,了解查询语句执行的过程,可以知道有没有索引) + + + +例如:创建普通索引 + +``` +create index 索引名 on 表名(列名) +create index index_name on table_name(col_name) +``` + +创建唯一索引 + +``` +create unique index index_name on table_name(col_name) +``` + +创建普通组合索引 + +``` +create index index_name on table_name(col_name1,col_name2) +``` + +修改表结构创建索引 + +``` +alter table table_name add index index_name(col_name) +``` + +创建表时直接指定索引 + +``` +create talbe talbe_name( + id int not null, + col_name varchar(16) not null, + index index_name(col_name) +); +``` + + + +##### 删除索引 + +直接删除索引 + +``` +dorp index index_name on table_name +``` + +修改表结构删除索引 + +``` +alter table table_name drop index index_name +``` + + + + + + + + + diff --git "a/17\351\273\204\344\270\275\345\207\244/2024.07.11-shell\350\204\232\346\234\254\345\205\245\351\227\250.md" "b/17\351\273\204\344\270\275\345\207\244/2024.07.11-shell\350\204\232\346\234\254\345\205\245\351\227\250.md" new file mode 100644 index 0000000..3b4ee06 --- /dev/null +++ "b/17\351\273\204\344\270\275\345\207\244/2024.07.11-shell\350\204\232\346\234\254\345\205\245\351\227\250.md" @@ -0,0 +1,269 @@ +## shell脚本入门 + +shell是一个命令的解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户输入的命令给操作系统,处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户 + +shell脚本文件一般以`.sh`结尾 + + + +cat /etc/shells #显示当前支持shell脚本的类型 + +``` +#!/bin/bash #默认的解释器,还有其他类型的解释器 +如:#!/bin/python + #!/bin/expect +``` + +创建一个基础脚本 + +``` +1.创建一个以.sh结尾的文件,用vim打开 + + `#! /bin/bash` #代表此行一下的代码语句是通过`/bin/bash`程序来解释执行的 + # 这是一行注释,以#开头的为注释信息, + echo "hello word" #输出hello word + mkdir -p /opt/test + touch /opt/test/a.txt + ls -l /opt +``` + + + +## 执行shell脚本 + +1.脚本路径执行:可以是绝对路径,也可以是相对路径,需要权限 + +``` + 例如:/root/t.sh #绝对路径 + + ./t.sh #相对路径 + + 需要权限:chmod +x t.sh +``` + +2.shell 解释器执行 指定使用bash执行,不用权限 + +​ cat /etc/shell #查看支持shell脚本类型 + +``` +例如:bash t.sh #使用bash解释器执行 +``` + +3.source或. 直接执行,不需要权限,但会影响环境 + +``` +例如:source t.sh + + . t.sh +``` + + + + + +#### shell脚本执行逻辑 + +1.顺序执行:程序按从上到下顺序执行 + +2.选择执行:程序执行过程中,根据条件不同,进行选择不同分支继续执行if + +3.循环执行:程序执行过程中需要重复执行多次某段语句while for + + + +脚本错误调试 :bash -x 或 -n + +命令错误时,默认后续命令继续执行, + +使用bash -x观察错误的命令 + +``` +例如:bash -x tt.sh # 可能发现所有错误 + +echo 111 + +cho 222 + + tt.sh:行3:未找到命令 +echo 333 +``` + +使用bash -n 判断有没有语法错误 + +``` +例如:bash -n tt.sh # 只能发现语法错误 +tt.sh: 行 6: 语法错误:未预期的文件结束符 +``` + + + +## 二、变量 + +**自定义变量 语法为** : 变量名=变量值 + +- =号两边不能有空格 +- 变量名称**不能以数字开头** +- 字符串加引号 +- 变量名前加$,表示使用变量的值 + +```bash +root@class1:~#myage=18 # 注意没有空格 +``` + +**交互式定义变量 :** read -p + +语法 : read p "提示语" 变量名 + +```bash +# 语法 : read p "提示语" 变量名 +root@class1:~# read -p "请输入一个日期" date +请输入一个日期666 +date=666 +root@class1:~# echo $date +666 + +``` + +#### **只读变量** + +只读变量在声明后不能更改其值。在Bash shell中,通过readonly 命令来声明位置变量 + +```bash +root@class1:~# readonly name=张三 +root@class1:~# echo $name +张三 +root@class1:~# name=李四 +-bash: name: 只读变量 +# 一旦建立后,无法进行追加和删除 +root@class1:~# unset name +-bash: unset: name: 无法取消设定:只读variable +``` + +#### **预定义变量** + +预定义变量是Shell在启动时就已经存在的变量,它们由系统自动初始化,并且具有特定含义和用途。例如 + +```bash +$HOME #当前用户的家目录路径。 +$USER 或 $LOGNAME #当前用户的用户名。 +$PATH #用于查找可执行文件的路径列表。 +$PWD #当前工作目录(Present Working Directory) +# 可以同过env命令进行查看当前系统有哪预定义变量 +``` + +#### **环境变量** + +环境变量是一种特殊的预定义变量,不仅在当前Shell会话中可用,还会被所有子进程继承。 + +在当前shell环境中定义的变量是无法自动被其它子进程继承的,需要通过export命令去赋予 + +#### **位置变量** + +指的是从命令行传递给脚本或函数的参数。每个参数都有一个编号,从 $0 开始,其中 $0 是脚本本身的名字,而 $1、$2、$3 等依次对应第一个、第二个、第三个参数等。 + +```bash +#!/bin/bash +echo "脚本的文件名 $0" #会打印出脚本的文件名 +echo "$1" #脚本后面的第一个参数 +echo "$2" #脚本后面的第二个参数 +echo "$3" #脚本后面的第三个参数 +echo "${10}" #脚本后面的第十个参数 + +#①:$0是一个特殊变量,它代表脚本的文件名 +#②:${10}必须用大括号括起来,否则将$看成变量,在后面加0 +#$# 参数的个数 + +!/bin/bash + 将脚本接收的第一个参数赋值给FILE变量 +read -p "请输入你要删除的文件名: " FILE +if [ $0 = $FILE ];then exit; +else + read -p "你是否真的要删除$FILE :" YN +if [ $YN = 'y' ] + then rm $FILE; echo "已删除$FILE" +else + echo "已取消删除" +fi +fi + +echo "程序退出" + + +``` + +### 特殊变量与符号 + +#### 1.符号 + +在变量中,有一些特殊符号,需要我们去掌握 + +| 符号 | 名称 | 作用 | +| ------------------------------------------------------------ | ------ | ---------------------------------------- | +| " " | 双引号 | 弱引用 可以识别变量 "$name",将变量转成值 | +| ‘ ’ | 单引号 | 强引用 不能识别变量 '$name',不变值 | +| { } | 大括号 | 定义变量名的范围 ${dizhi}30 | +| `` | 反撇 | 调用命令的执行结果 ,另一种写法$( 命令 ) \`命令` | | | + +#### 2.特殊变量 + +在预定义变量中,还存在一些特殊变量,比如在之前说到的$0就是一种特殊变量 + +| $* | 代表一个整体,把所有位置参数当成整体返回,所有参数 | +| ---- | ---------------------------------------------------------- | +| $@ | 代表独立个体,把所有位置参数当成个体返回,查询与上面的区别 | +| $? | 上一条命令的执行结果是否成功。正确为0,返回任何非0值为异常 | +| $# | 代表位置参数个数 | +| $0 | 代表当前脚本的名称 | +| $$ | 当前bash的pid | + + + +### (四)四则运算 + +加法 + + +减法 - + +乘法 \ * :*表示乘。但是因为其有特殊含义,需要加上\转义符进行转义,表达原本的意思 + +除法 / + +#### 1.expr运算 + +基本格式为:expr 变量 + 变量 (注意空格) + +```bash +expr $a+$b # 错误 +expr $a + $b +sum=$(expr $a + $b) +``` + +#### 2.使用(())运算 + +将变量a与b相加,格式为 :(( 变量名=算数表达式 )) + +```bash +(( sum=a + b )) +echo $sum +#()内可以直接调用变量,不需要加$符号 +``` + +#### 3.使用let运算 + +格式为 let 运算结果变量名=运算表达式 + +``` +let sum=$a + $b; +``` + +#### 4.方括号[ ]运算 + +语法为:运算结果变量名=$[算术表达式] + +```bash +a=1 +b=2 +sum=$[a+b] +echo $sum +``` + diff --git "a/17\351\273\204\344\270\275\345\207\244/2024.07.12-shell \346\265\213\350\257\225\345\217\212\350\257\255\345\217\245.md" "b/17\351\273\204\344\270\275\345\207\244/2024.07.12-shell \346\265\213\350\257\225\345\217\212\350\257\255\345\217\245.md" new file mode 100644 index 0000000..d392eeb --- /dev/null +++ "b/17\351\273\204\344\270\275\345\207\244/2024.07.12-shell \346\265\213\350\257\225\345\217\212\350\257\255\345\217\245.md" @@ -0,0 +1,232 @@ +## shell 测试及语句 + +特殊变量:$? #上条命令执行结果是否成功,正确为0,不正确返回非0的任何数 + +1.简单条件测试 + +格式1:test 操作符 目录/文件 + +格式2:[操作符 目录/文件] # []两边操作符和条件之间需要空格 + +常见操作符 + +​ -d 测试是否为目录 + +​ -e 测试目录或文件是否存在 + +​ -f 测试是否为文件 + +​ -r 测试当前用户是否有权限读取 + +​ -w 测试当前用户是否有权限写入 + +​ -x 测试当前用户是否有权限执行 + +​ -l 测试是否为软连接文件 + +也可以直接使用方括号进行测试 + +[ -r /etc/passwd ]; + +echo $? + +但执行权限比较特殊,如果属主,属组,其他用户任何一方有执行权限,那么超级用户就有权限,如果所有人没有,超级用户也没有 + + + +##### 逻辑测试 + +使用逻辑运算符 + +&&(与) ||(或) !(非) + +并且 或者 取反 + + + +##### 整数比较 + +语法:[整数 操作符 整数] + +​ -eq 判断是否等于 + +​ -ne 判断是否不等于 + +​ -gt 判断是否大于 + +​ -lt 判断是否小于 + +​ -le 判断是否等于或小于 + +​ -ge 判断是否大于或等于 + +``` +例如:a=10 b=20 +[ $a -lt $b ] +echo $? +输出0 +``` + + + +##### 字符串比较 + +1. 语法:[字符串1 操作符 字符串2] + +2. 常用操作符 + + | = | 比较字符串内容是否相同。 | + | ---- | ------------------------ | + | != | 比较字符串内容是否不同。 | + | z | 判断字符串内容是否为空。 | + +``` +例如:txt=file.log +[ $txt=file.log] && echo "yes" +输出yes +``` + + + +##### 字符串长度检查 + +[ -z $text];echo $? + +输出0 # 变量值为空,检测正确,输出0 + +[-z $txt];echo $? + +输出1 #变量值为非空,检测错误,输出1 + + + +##### 不同比较 + +判断当前用户是否为root用户,不是就输出not root + +su hlif 切换用户 + +[$user !=root] && echo not root + +输出 not root #因为切换了用户,所以输出 not root + + + +#### 条件测试语句 + +1. #### if 条件语句 + + 单分支结构 + + ``` + 1|if [判断条件];then + 2|需要执行的命令 + 3|fi + ``` + +``` +例如:判断目录是否存在,若不存在则自动创建 +# !/bin/bash +DIR="/test/test.txt" +if [! -e $DIR];then if表示判断如果这个变量不存在,then表示接下要执行的条件 +mkdir -p $DIR +fi fi表示结束 +``` + + + +​ 双分支结构 + +​ 双分支结构,做条件成立或条件不成立的判断 + +``` +1|if [判断条件];then +2|需要执行的命令 +3|else +4|条件不成立时需要执行的命令 +5|fi +``` + + + +多分支结构 + +``` +1|if [判断条件1];then +2|命令序列1 +3|elif [判断条件2];then +4|命令序列2 +5|elif 判断条件3;then +6|命令序列3 +7|else +8|以上条件都为假的命令序列 #托底命令 +9|fi +``` + + + +1. #### case条件语句 + + ``` + 1 case $变量名 in + 2 模式1) # 判断条件 + 3 命令1... # 判断为该模式后需要执行的命令 + 4 ;; + 5 模式2) + 6 命令2... + 7 ;; + 8 模式3|模式4) # 可以用'|'分隔多个模式进行联合匹配 + 9 命令3... + 10 ;; + 11 *) + 12 default_commands... # 匹配所有未明确列出的其他情况(可选) + 13 ;; + 14 esac # 内容的结尾格式,与if语句中的fi类似 + ``` + +2. #### 循环语句 + + - for 语句 读取多个不同的变量值,逐一执行同一组命令 + + ``` + 1 for 变量名 in 取值列表 ;do + 2 命令序列 + 3 done + ``` + + ``` + 例如:算数累加,求1-100的和 + for i in {1..100} + do + sum=$[sum+i] sum默认为空,for每次调用变量值时,sum会加上这个数,一直加到100 + done + echo $sum + ``` + + + + - while语句 + + ``` + while 判断条件 + do + 命令1 + done + #语法与if相似 + ``` + + + +++ 自身变量+1 + +-- 自身变量-1 + ++=5 自身变量+5 + +-= 自身变量-5 + +*= 自身变量`*`5 + +/=5 自身变量/5 + +%5 自身变量%5 \ No newline at end of file diff --git "a/17\351\273\204\344\270\275\345\207\244/2024.07.13-Ansible\350\207\252\345\212\250\345\214\226\350\277\220\347\273\264.md" "b/17\351\273\204\344\270\275\345\207\244/2024.07.13-Ansible\350\207\252\345\212\250\345\214\226\350\277\220\347\273\264.md" new file mode 100644 index 0000000..f8a0172 --- /dev/null +++ "b/17\351\273\204\344\270\275\345\207\244/2024.07.13-Ansible\350\207\252\345\212\250\345\214\226\350\277\220\347\273\264.md" @@ -0,0 +1,359 @@ +| 系统 | IP | 名称 | ROOT密码 | +| -------- | ------------- | ------- | -------- | +| Debian12 | 172.16.90.71 | 被控机 | 666666 | +| Debian12 | 172.16.90.72 | 被控机 | 666666 | +| Debian12 | 172.16.90.73 | 管理机* | 666666 | +| Debian12 | 172.16.90.102 | 被控机 | 666666 | + +## 一、ssh免秘钥登录配置 + +1.管理机生成密钥对,将公钥复制安装到各被控机,**可以写个脚本批量实现** + +```bash +# 在管理机上172.16.90.71 操作 +root@class1:~# ssh-keygen #生成密钥对 +Generating public/private rsa key pair. +Enter file in which to save the key (/root/.ssh/id_rsa): #保存的路径:直接回车,默认 +Enter passphrase (empty for no passphrase): #输入访问的密码,回车 +Enter same passphrase again: #回车 +Your identification has been saved in /root/.ssh/id_rsa #私钥 +Your public key has been saved in /root/.ssh/id_rsa.pub #公钥 +The key fingerprint is: +SHA256:SUsHZoABqfQbKUs3J9wADMGYRiEkgTE6d/Zdrd/z/Yg root@class3 +The key's randomart image is: ++---[RSA 3072]----+ +|^X+o.o..+ | +|B*... o . . | +|=.+ * o o . | +|.= @ + + = . | +|. + * . S . | +| . . . . | +| . o | +| . +.| +| E . =| ++----[SHA256]-----+ +# 复制到被控机 172.16.90.72 +root@class1:~# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.90.72 +/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" +/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed +/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to +install the new keys +root@172.16.90.72's password: # 这里要输入被控机 172.16.90.72的root密码 + +Number of key(s) added: 1 + +Now try logging into the machine, with: "ssh 'root@172.16.90.71'" +and check to make sure that only the key(s) you wanted were added. + + +# 完成后,管理机可以直接免密全登录被控机 172.16.90.72 +root@class1:~# ssh root@172.16.90.72 +Linux class1 6.1.0-21-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64 +root@class2:~# +``` + +二、管理机安装ansible + +```bash +root@class2:~#apt install -y ansible +root@class2:~#ansible --version # 查看版本信息 +``` + +三、生成配置文件 + +```bash +root@class2:~# mkdir -p /etc/ansible # 创建目录 +root@class2:~# cd /etc/ansible +root@class2:/etc/ansible# ansible-config init --disabled > ansible.cfg + +``` + +编辑hosts文件,指定要被管理的主机的ip,可以分组 + +```bash +vim /etc/ansible/hosts +# 分组 +[mdd] + +172.16.90.71 +172.16.90.73 + +[test] + +172.16.90.102 +``` + +测试 + +``` +# ansible 组名 -m 模块名 -a 参数 +ansible mdd -m command -a 'free' +ansible mdd -m shell -a 'shell脚本语句' +ansible mdd -m ping # ping模块 +``` + +语法: + +``` +ansible 要控制组名 -m 模块名 -a 参数 +``` + +常用模块: + +### 1)主机连通性测试 ping + +### 2)command 模块:命令 + +  这个模块可以直接在远程主机上执行命令,并将结果返回本主机。命令模块接受命令名称,后面是空格分隔的列表参数。 + +```bash +chdir       # 在执行命令之前,先切换到该目录 +executable # 切换shell来执行命令,需要使用命令的绝对路径 +free_form   # 要执行的Linux指令,一般使用Ansible的-a参数代替。 +creates  # 一个文件名,当这个文件存在,则该命令不执行,可以 +用来做判断 +removes # 一个文件名,这个文件不存在,则该命令不执行 + +[root@server ~]# ansible web -m command -a 'chdir=/data/ ls' #先切换到/data/ 目录,再执行“ls”命令 +``` + +### 3)shell 模块 + +  shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。 + +```bash +[root@server ~]# ansible mdd -m shell -a 'cat /etc/passwd |grep "root"' +#只要是我们的shell命令,都可以通过这个模块在远程主机上运行 +``` + +### 4)copy 模块 + +  这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等 +  其相关选项如下: + +> `src`    #被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于"rsync" +> `content`   #用于替换"src",可以直接指定文件的值 +> `dest`    #必选项,将源文件复制到的远程主机的**绝对路径** +> `backup`   #当文件内容发生改变后,在覆盖之前把源文件备份,备份文件包含时间信息 +> `directory_mode`    #递归设定目录的权限,默认为系统默认权限 +> `force`    #当目标主机包含该文件,但内容不同时,设为"yes",表示强制覆盖;设为"no",表示目标主机的目标位置不存在该文件才复制。默认为"yes" +> `others`    #所有的 file 模块中的选项可以在这里使用 +> +> mode : 权限 + +用法举例如下: +**** + +```bash +# ① 复制文件: +[root@server ~]# ansible mdd -m copy -a 'src=~/hello dest=/tmp/hello' +# ② 给定内容生成文件,并制定权限 +[root@server ~]# ansible mdd -m copy -a 'content="I am qq\n" dest=/tmp/name mode=666' +[root@server ~]# ansible mdd -m shell -a 'ls -l /tmp/' +# ③ 关于覆盖  我们把文件的内容修改一下,然后选择覆盖备份: +[root@server ~]# ansible mdd -m copy -a 'content="I am big qq\n" backup=yes dest=/tmp/name mode=666' +``` + +### 5)file 模块 + +  该模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等。 + +下面是一些常见的命令: + +> `path`:定义文件/目录的路径 +> +> `mode`:定义文件/目录的权限 +> +> `force`  #需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no +> `group`  #定义文件/目录的属组。后面可以加上`mode`:定义文件/目录的权限 +> `owner`  #定义文件/目录的属主。后面必须跟上`path`:定义文件/目录的路径 +> `recurse`  #递归设置文件的属性,只对目录有效,后面跟上`src`:被链接的源文件路径,只应用于`state=link`的情况 +> `dest`  #被链接到的路径,只应用于`state=link`的情况 +> `state`  #状态,有以下选项: +> +> +> +> > `directory`:如果目录不存在,就创建目录 +> > `file`:即使文件不存在,也不会被创建 +> > `link`:创建软链接 +> > `hard`:创建硬链接 +> > `touch`:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间 +> > `absent`:删除目录、文件或者取消链接文件 + +用法举例如下: + +```bash +# ① 创建目录: +[root@server ~]# ansible mdd -m file -a 'path=/tmp/app state=directory' +# ② 创建链接文件 +[root@server ~]# ansible mdd -m file -a 'path=/tmp/bbb.jpg src=aaa.jpg state=link' +# ③ 删除文件 +[root@server ~]# ansible mdd -m file -a 'path=/tmp/a state=absent' + +``` + +### 6)fetch 模块 + +该模块用于从远程某主机获取(复制)文件到本地。 +  有两个选项: + +> `dest`:用来存放文件的目录 +> `src`:在远程拉取的文件,并且必须是一个**file**,不能是**目录** + +  具体举例如下: + +```bash +[root@server ~]# ansible mdd -m fetch -a 'src=/tmp/hello dest=/tmp' +``` + +### 7)cron 模块 + +该模块适用于管理`cron`计划任务的。 +  其使用的语法跟我们的`crontab`文件中的语法一致,同时,可以指定以下选项: + +> `day=` #日应该运行的工作( 1-31, *, */2, ) +> `hour=` # 小时 ( 0-23, *, */2, ) +> `minute=` #分钟( 0-59, *, */2, ) +> `month=` # 月( 1-12, *, /2, ) +> `weekday=` # 周 ( 0-6 for Sunday-Saturday,, ) +> `job=` #指明运行的命令是什么 +> `name=` #定时任务描述 +> `reboot` # 任务在重启时运行,不建议使用,建议使用special_time +> `special_time` #特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时) +> `state` #指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务 +> `user` # 以哪个用户的身份执行 + +```bash +① 添加计划任务 +[root@server ~]# ansible mdd -m cron -a 'name="ntp update every 5 min" minute=*/5 job="/sbin/ntpdate 172.17.0.1 &> /dev/null"' +#我们可以去查看一下: +[root@server ~]# ansible web -m shell -a 'crontab -l' +#② 删除计划任务 +# 如果我们的计划任务添加错误,想要删除的话,则执行以下操作: +#  首先我们查看一下现有的计划任务: +[root@server ~]# ansible web -m shell -a 'crontab -l' +# 然后执行删除操作: +[root@server ~]# ansible web -m cron -a 'name="df everyday" hour=15 job="df -lh >> /tmp/disk_total &> /dev/null" state=absent' + +``` + +### 8)apt 模块 + +  顾名思义,该模块主要用于软件的安装。 +  其选项如下: + +> `name=`  #所安装的包的名称 +> `state=`  #`present`--->安装, `latest`--->安装最新的, `absent`---> 卸载软件。 +> `update_cache`  #强制更新yum的缓存 +> `conf_file`  #指定远程yum安装时所依赖的配置文件(安装本地已有的包)。 +> `disable_pgp_check`  #是否禁止GPG checking,只用于`present`or `latest`。 +> `disablerepo`  #临时禁止使用yum库。 只用于安装或更新时。 +> `enablerepo`  #临时使用的yum库。只用于安装或更新时。 + +``` +root@class2:~# ansible test -m apt -a 'name=tree state=present' +``` + +### 9)service 模块 + +该模块用于服务程序的管理。 +  其主要选项如下: + +> `arguments` #命令行提供额外的参数 +> `enabled` #设置开机启动。 +> `name=` #服务名称 +> `runlevel` #开机启动的级别,一般不用指定。 +> `sleep` #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。(定义在剧本中。) +> `state` #有四种状态,分别为:`started`--->启动服务, `stopped`--->停止服务, `restarted`--->重启服务, `reloaded`--->重载配置 + +```bash +# ① 开启服务并设置自启动 +[root@server ~]# ansible mdd -m service -a 'name=nginx state=started enabled=true' +# ② 关闭服务  我们也可以通过该模块来关闭我们的服务: +[root@server ~]# ansible web -m service -a 'name=nginx state=stopped' +``` + +### 10)user 模块 + +该模块主要是用来管理用户账号。 +  其主要选项如下: + +> `comment`  # 用户的描述信息 +> `createhome`  # 是否创建家目录 +> `force`  # 在使用state=absent时, 行为与userdel –force一致. +> `group`  # 指定基本组 +> `groups`  # 指定附加组,如果指定为(groups=)表示删除所有组 +> `home`  # 指定用户家目录 +> `move_home`  # 如果设置为home=时, 试图将用户主目录移动到指定的目录 +> `name`  # 指定用户名 +> `non_unique`  # 该选项允许改变非唯一的用户ID值 +> `password`  # 指定用户密码 +> `remove`  # 在使用state=absent时, 行为是与userdel –remove一致 +> `shell`  # 指定默认shell +> `state`  # 设置帐号状态,不指定为创建,指定值为absent表示删除 +> `system`  # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户 +> `uid`  # 指定用户的uid + +```bash +#① 添加一个用户并指定其 uid +[root@server ~]# ansible mdd -m user -a 'name=qq uid=11111' +#② 删除用户 +[root@server ~]# ansible mdd -m user -a 'name=qq state=absent' +``` + +### 11)group 模块 + +该模块主要用于添加或删除组。 +  常用的选项如下: + +> `gid=`  #设置组的GID号 +> `name=`  #指定组的名称 +> `state=`  #指定组的状态,默认为创建,设置值为`absent`为删除 +> `system=`  #设置值为`yes`,表示创建为系统组 + +```bash +#① 创建组 +[root@server ~]# ansible mdd -m group -a 'name=mdd gid=12222' +创建过后,我们来查看一下: +[root@server ~]# ansible mdd -m shell -a 'cat /etc/group | grep 12222' +#② 删除组 +[root@server ~]# ansible web -m group -a 'name=sanguo state=absent' +``` + +### 12)script 模块 + + 该模块用于将本机的脚本在被管理端的机器上运行。 + + 该模块直接指定脚本的路径即可,我们通过例子来看一看到底如何使用的: +  + +```bash +#首先,我们写一个脚本,并给其加上执行权限: +[root@server ~]# vim /tmp/df.sh + #!/bin/bash + date >> /tmp/disk_total.log + df -lh >> /tmp/disk_total.log +[root@server ~]# chmod +x /tmp/df.sh +# 然后,我们直接运行命令来实现在被管理端执行该脚本: +[root@server ~]# ansible mdd -m script -a '/tmp/df.sh' +``` + +### 13)setup 模块 + +  该模块主要用于收集信息,是通过调用facts组件来实现的。 + +```bash +#① 查看信息 +#  我们可以直接用命令获取到变量的值,具体我们来看看例子: +[root@server ~]# ansible mdd -m setup -a 'filter="*mem*"' #查看内存 + +#2 查看并保存信息 +root@class2:~# ansible mdd -m setup -a 'filter="*mem*"' --tree /tmp/facts + +``` + + + + + +剧本:playbook -- Gitee