automation
2023-07-26 17:08:22 0 举报
AI智能生成
linux
作者其他创作
大纲/内容
day01
配置ansible管理环境
使用一套ansible软件,有可能需要管理多种环境。如在同一台管理主机上管理开发环境和生产环境。
通过创建不同的工作目录,来实现相应的管理需求。
将某一环境下的主机写入到对应工作目录的主机清单文件。
进入对应的工作目录执行管理任务,就可以管理相应环境的主机。
通过创建不同的工作目录,来实现相应的管理需求。
将某一环境下的主机写入到对应工作目录的主机清单文件。
进入对应的工作目录执行管理任务,就可以管理相应环境的主机。
ansible ad-hoc语法格式是什么样:
Ansible adhoc语法是一种命令行工具,用于快速执行一些简单的任务。
它的语法格式为:ansible [options] pattern [-m module_name] [-a args]。
其中,pattern指定要执行任务的主机或主机组,module_name指定要使用的模块,args指定模块的参数。
例如,要在所有主机上安装nginx,可以使用以下命令:ansible all -m yum -a "name=nginx state=present"。
这将在所有主机上执行yum模块,安装nginx软件包
Ansible adhoc语法是一种命令行工具,用于快速执行一些简单的任务。
它的语法格式为:ansible [options] pattern [-m module_name] [-a args]。
其中,pattern指定要执行任务的主机或主机组,module_name指定要使用的模块,args指定模块的参数。
例如,要在所有主机上安装nginx,可以使用以下命令:ansible all -m yum -a "name=nginx state=present"。
这将在所有主机上执行yum模块,安装nginx软件包
[...~]# mkdir ansible # 创建ansible工作目录,目录名自己定义,不是固定的。
[....~]# cd ansible # 创建配置文件,默认的配置文件是/etc/ansible/ansible.cfg,
但是一般不使用它,而是在工作目录下创建自己的配置文件
[...ansible]# vim ansible.cfg # 文件名必须是ansible.cfg
[defaults]
host_key_checking = false # 不检查主机密钥,=号两边空格可有可无。
inventory = inventory # 定义主机清单文件为当前目录的inventory
[...ansible]# vim inventory # 创建主机清单文件。写在[]里的是组名,[]下面的是组内的主机名
[webservers]
web[1:2] # web1和web2的简化写法,表示从1到2
[dbs]
db1
[cluster:children] # cluster是组名,自定义的;:children是固定写法,表示下面的组名是cluster的子组。
webservers
dbs
[...ansible]# ansible all --list-hosts # 查看被管理的所有的主机。注意,一定在工作目录下执行命令。
hosts (3):
web1
web2
db1
[...ansible]# ansible webservers --list-hosts # 查看webservers组中所有的主机
hosts (2):
web1
web2
[....~]# cd ansible # 创建配置文件,默认的配置文件是/etc/ansible/ansible.cfg,
但是一般不使用它,而是在工作目录下创建自己的配置文件
[...ansible]# vim ansible.cfg # 文件名必须是ansible.cfg
[defaults]
host_key_checking = false # 不检查主机密钥,=号两边空格可有可无。
inventory = inventory # 定义主机清单文件为当前目录的inventory
[...ansible]# vim inventory # 创建主机清单文件。写在[]里的是组名,[]下面的是组内的主机名
[webservers]
web[1:2] # web1和web2的简化写法,表示从1到2
[dbs]
db1
[cluster:children] # cluster是组名,自定义的;:children是固定写法,表示下面的组名是cluster的子组。
webservers
dbs
[...ansible]# ansible all --list-hosts # 查看被管理的所有的主机。注意,一定在工作目录下执行命令。
hosts (3):
web1
web2
db1
[...ansible]# ansible webservers --list-hosts # 查看webservers组中所有的主机
hosts (2):
web1
web2
ansible管理
ansible进行远程管理的两个方法:
adhoc临时命令。就是在命令行上执行管理命令。
playbook剧本。把管理任务用特定格式写到文件中。
无论哪种方式,都是通过模块加参数进行管理。
adhoc临时命令。就是在命令行上执行管理命令。
playbook剧本。把管理任务用特定格式写到文件中。
无论哪种方式,都是通过模块加参数进行管理。
adhoc临时命令
语法:
ansible 主机或组列表 -m 模块 -a "参数" # -a是可选的
ansible 主机或组列表 -m 模块 -a "参数" # -a是可选的
通过ping模块测试到远程主机的连通性。
[root@pubserver ansible]# ansible all -m ping
# 该命令检查是否可以管理远程主机。如果结果为绿色的SUCCESS,则表示成功。
# 如果是红色的UNREACHABLE,则检查网络是否可通,是否已经可以免密登陆
[root@pubserver ansible]# ansible all -m ping
# 该命令检查是否可以管理远程主机。如果结果为绿色的SUCCESS,则表示成功。
# 如果是红色的UNREACHABLE,则检查网络是否可通,是否已经可以免密登陆
ansible模块
在ansible中,通过模块来完成某一特定任务。
学习模块,主要知道实现某种功能,需要哪个模块。
模块的使用方式都一样。主要是查看该模块有哪些参数。
学习模块,主要知道实现某种功能,需要哪个模块。
模块的使用方式都一样。主要是查看该模块有哪些参数。
# 列出全部可用模块,按空格键向下翻页,按q退出
[root@pubserver ansible]# ansible-doc -l
# 列出模块数量
[root@pubserver ansible]# ansible-doc -l | wc -l # 如有WARNING提示,可忽略
7214
# 查看包含yum的模块名
[root@pubserver ansible]# ansible-doc -l | grep yum
# 查看yum模块的帮助文档,按空格键向下翻页,按q退出
[roo@pubserver ansible]# ansible-doc yum
[root@pubserver ansible]# ansible-doc -l
# 列出模块数量
[root@pubserver ansible]# ansible-doc -l | wc -l # 如有WARNING提示,可忽略
7214
# 查看包含yum的模块名
[root@pubserver ansible]# ansible-doc -l | grep yum
# 查看yum模块的帮助文档,按空格键向下翻页,按q退出
[roo@pubserver ansible]# ansible-doc yum
ping模块 # 测试到远程主机的连通性。
...ansible]# ansible all -m ping
command模块
ansible默认模块,用于在远程主机上执行任意命令
command不支持shell特性,如管道、重定向。
shell模块
与command模块类似,但是支持shell特性,如管道、重定向。
...ansible]# ansible web1 -m shell -a "ip a s | head" # 查看web1的ip地址,只显示前10行
script模块: 用于在远程主机上执行脚本
[...ansible]# vim test.sh # 在控制端创建脚本即可
#!/bin/bash
for i in user{1..5}
do
useradd $i
echo '123456' | passwd --stdin $i
done
....ansible]# ansible webservers -m script -a "test.sh" # 在webservers组的主机上执行脚本
...ansible]# ansible all -m ping
command模块
ansible默认模块,用于在远程主机上执行任意命令
command不支持shell特性,如管道、重定向。
shell模块
与command模块类似,但是支持shell特性,如管道、重定向。
...ansible]# ansible web1 -m shell -a "ip a s | head" # 查看web1的ip地址,只显示前10行
script模块: 用于在远程主机上执行脚本
[...ansible]# vim test.sh # 在控制端创建脚本即可
#!/bin/bash
for i in user{1..5}
do
useradd $i
echo '123456' | passwd --stdin $i
done
....ansible]# ansible webservers -m script -a "test.sh" # 在webservers组的主机上执行脚本
file模块:
可以创建文件、目录、链接等,还可以修改权限、属性等
常用的选项:
path:指定文件路径
owner:设置文件所有者
group:设置文件所属组
state:状态。
touch表示创建文件,directory表示创建目录
link表示创建软链接,absent表示删除
mode:设置权限
src:source的简写,源
dest:destination的简写,目标
ansible-doc file #查看使用帮助
... ...
EXAMPLES:
- name: Change file ownership, group and permissions # 忽略
ansible.builtin.file: # 模块名。以下是它的各种参数
path: /etc/foo.conf # 要修改的文件的路径
owner: foo # 文件所有者
group: foo # 文件的所有组
mode: '0644' # 权限
... ...
# 根据上面的example,-m file -a的内容就是doc中把各参数的冒号换成=号
可以创建文件、目录、链接等,还可以修改权限、属性等
常用的选项:
path:指定文件路径
owner:设置文件所有者
group:设置文件所属组
state:状态。
touch表示创建文件,directory表示创建目录
link表示创建软链接,absent表示删除
mode:设置权限
src:source的简写,源
dest:destination的简写,目标
ansible-doc file #查看使用帮助
... ...
EXAMPLES:
- name: Change file ownership, group and permissions # 忽略
ansible.builtin.file: # 模块名。以下是它的各种参数
path: /etc/foo.conf # 要修改的文件的路径
owner: foo # 文件所有者
group: foo # 文件的所有组
mode: '0644' # 权限
... ...
# 根据上面的example,-m file -a的内容就是doc中把各参数的冒号换成=号
ansible webservers -m file -a "path=/tmp/file.txt state=touch"
# touch是指如果文件不存在,则创建;如果存在则改变它的时间戳
ansible webservers -m file -a "path=/tmp/demo state=directory"
# 在webservers组的主机上创建/tmp/demo目录
ansible webservers -m file -a "path=/tmp/file.txt owner=sshd group=adm mode='0777'"
# 将webservers组的主机上/tmp/file.txt的属主改为sshd,属组改为adm,权限改为0777
ansible webservers -a "ls -l /tmp/file.txt"
ansible webservers -m file -a "path=/tmp/file.txt state=absent"
# 删除webservers组的主机上/tmp/file.txt
ansible webservers -m file -a "path=/tmp/demo state=absent"
# 删除webservers组的主机上/tmp/demo
ansible webservers -m file -a "src=/etc/hosts dest=/tmp/hosts.txt state=link"
# 在webservers组的主机上创建/etc/hosts的软链接,目标是/tmp/hosts.txt
# touch是指如果文件不存在,则创建;如果存在则改变它的时间戳
ansible webservers -m file -a "path=/tmp/demo state=directory"
# 在webservers组的主机上创建/tmp/demo目录
ansible webservers -m file -a "path=/tmp/file.txt owner=sshd group=adm mode='0777'"
# 将webservers组的主机上/tmp/file.txt的属主改为sshd,属组改为adm,权限改为0777
ansible webservers -a "ls -l /tmp/file.txt"
ansible webservers -m file -a "path=/tmp/file.txt state=absent"
# 删除webservers组的主机上/tmp/file.txt
ansible webservers -m file -a "path=/tmp/demo state=absent"
# 删除webservers组的主机上/tmp/demo
ansible webservers -m file -a "src=/etc/hosts dest=/tmp/hosts.txt state=link"
# 在webservers组的主机上创建/etc/hosts的软链接,目标是/tmp/hosts.txt
copy模块:
用于将文件从控制端拷贝到被控端
src:源。控制端的文件路径
dest:目标。被控制端的文件路径
content:内容。需要写到文件中的内容
可以上传目录
fetch模块:
与copy模块相反,copy是上传,fetch是下载
src:源。被控制端的文件路径
dest:目标。控制端的文件路径
不能下载目录
用于将文件从控制端拷贝到被控端
src:源。控制端的文件路径
dest:目标。被控制端的文件路径
content:内容。需要写到文件中的内容
可以上传目录
fetch模块:
与copy模块相反,copy是上传,fetch是下载
src:源。被控制端的文件路径
dest:目标。控制端的文件路径
不能下载目录
ansible webservers -m copy -a "src=a3.txt dest=/root/"
ansible webservers -m copy -a "content='Hello World' dest=/tmp/mytest.txt"
# 在目标主机上创建/tmp/mytest.txt,内容是Hello World
ansible webservers -m fetch -a "src=/etc/hostname dest=~/"
# 将webservers主机上的/etc/hostname下载到本地用户的家目录下
ansible webservers -m copy -a "content='Hello World' dest=/tmp/mytest.txt"
# 在目标主机上创建/tmp/mytest.txt,内容是Hello World
ansible webservers -m fetch -a "src=/etc/hostname dest=~/"
# 将webservers主机上的/etc/hostname下载到本地用户的家目录下
操作文件内容:
lineinfile模块:
用于确保存目标文件中有某一行内容
path:待修改的文件路径
line:写入文件的一行内容
regexp:正则表达式,用于查找文件中的内容
replace模块:
replace可以替换关键词
path:待修改的文件路径
replace:将正则表达式查到的内容,替换成replace的内容
regexp:正则表达式,用于查找文件中的内容
lineinfile模块:
用于确保存目标文件中有某一行内容
path:待修改的文件路径
line:写入文件的一行内容
regexp:正则表达式,用于查找文件中的内容
replace模块:
replace可以替换关键词
path:待修改的文件路径
replace:将正则表达式查到的内容,替换成replace的内容
regexp:正则表达式,用于查找文件中的内容
ansible webservers -m lineinfile -a "path=/etc/issue line='Hello World'"
# webservers组中的主机,/etc/issue中一定要有一行Hello World。
如果该行不存在,则默认添加到文件结尾
ansible webservers -m lineinfile -a "path=/etc/issue line='chi le ma' regexp='Hello'"
# webservers组中的主机,把/etc/issue中有Hello的行,替换成chi le ma
ansible webservers -m replace -a "path=/etc/issue regexp='chi' replace='he'"
# 把webservers组中主机上/etc/issue文件中的chi,替换成he
# webservers组中的主机,/etc/issue中一定要有一行Hello World。
如果该行不存在,则默认添加到文件结尾
ansible webservers -m lineinfile -a "path=/etc/issue line='chi le ma' regexp='Hello'"
# webservers组中的主机,把/etc/issue中有Hello的行,替换成chi le ma
ansible webservers -m replace -a "path=/etc/issue regexp='chi' replace='he'"
# 把webservers组中主机上/etc/issue文件中的chi,替换成he
综合操作:
所有操作均对webservers组中的主机生效
在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777
将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600
替换目标主机/tmp/mydemo/hosts文件中的db1为database1
将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录
所有操作均对webservers组中的主机生效
在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777
将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600
替换目标主机/tmp/mydemo/hosts文件中的db1为database1
将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录
# 在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777
ansible webservers -m file -a "path=/tmp/mydemo owner=adm group=adm mode='0777' state=directory"
# 将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600
ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/mydemo owner=adm group=adm mode='0600'"
# 替换目标主机/tmp/mydemo/hosts文件中的db1为database1
ansible webservers -m replace -a "path=/tmp/mydemo/hosts regexp='db1' replace='database1'"
# 将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录。
ansible webservers -m fetch -a "src=/tmp/mydemo/hosts dest=."
ansible webservers -m file -a "path=/tmp/mydemo owner=adm group=adm mode='0777' state=directory"
# 将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600
ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/mydemo owner=adm group=adm mode='0600'"
# 替换目标主机/tmp/mydemo/hosts文件中的db1为database1
ansible webservers -m replace -a "path=/tmp/mydemo/hosts regexp='db1' replace='database1'"
# 将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录。
ansible webservers -m fetch -a "src=/tmp/mydemo/hosts dest=."
user模块:
实现linux用户管理
name:待创建的用户名
uid:用户ID
group:设置主组
groups:设置附加组
home:设置家目录
password:设置用户密码
state:状态。present表示创建,它是默认选项。absent表示删除
remove:删除家目录、邮箱等。值为yes或true都可以。
实现linux用户管理
name:待创建的用户名
uid:用户ID
group:设置主组
groups:设置附加组
home:设置家目录
password:设置用户密码
state:状态。present表示创建,它是默认选项。absent表示删除
remove:删除家目录、邮箱等。值为yes或true都可以。
ansible webservers -m user -a "name=zhangsan"
ansible webservers -m user -a "name=lisi uid=1010 group=adm groups=daemon,root home=/home/lisi"
# 在webservers组中的主机上,创建lisi用户。设置其uid为1010,主组是adm,
附加组是daemon和root,家目录是/home/lisi。
ansible webservers -m user -a "name=zhangsan password={{'123456'|password_hash('sha512')}}"
# 设置zhangsan的密码是123456
# {{}}是固定格式,表示执行命令。password_hash是函数,sha512是加密算法,
则password_hash函数将会把123456通过sha512加密变成zhangsan的密码。
ansible webservers -m user -a "name=zhangsan state=absent"
# 删除zhangsan用户,不删除家目录
ansible webservers -m user -a "name=lisi state=absent remove=yes"
# 删除lisi用户,同时删除家目录
ansible webservers -m user -a "name=lisi uid=1010 group=adm groups=daemon,root home=/home/lisi"
# 在webservers组中的主机上,创建lisi用户。设置其uid为1010,主组是adm,
附加组是daemon和root,家目录是/home/lisi。
ansible webservers -m user -a "name=zhangsan password={{'123456'|password_hash('sha512')}}"
# 设置zhangsan的密码是123456
# {{}}是固定格式,表示执行命令。password_hash是函数,sha512是加密算法,
则password_hash函数将会把123456通过sha512加密变成zhangsan的密码。
ansible webservers -m user -a "name=zhangsan state=absent"
# 删除zhangsan用户,不删除家目录
ansible webservers -m user -a "name=lisi state=absent remove=yes"
# 删除lisi用户,同时删除家目录
group模块
创建、删除组
name:待创建的组名
gid:组的ID号
state:present表示创建,它是默认选项。absent表示删除
创建、删除组
name:待创建的组名
gid:组的ID号
state:present表示创建,它是默认选项。absent表示删除
ansible webservers -m group -a "name=devops"
# 在webservers组中的主机上创建名为devops的组
ansible webservers -m group -a "name=devops state=absent"
# 在webservers组中的主机上删除名为devops的组
# 在webservers组中的主机上创建名为devops的组
ansible webservers -m group -a "name=devops state=absent"
# 在webservers组中的主机上删除名为devops的组
day02
常用模块
yum_repository
用于配置yum
file: 指定文件名
用于配置yum
file: 指定文件名
# 在webservers组中的主机上,配置yum
ansible webservers -m yum_repository -a "file=myrepo name=myApp description='My App'
baseurl=ftp://192.168.88.240/dvd/AppStream gpgcheck=no enabled=yes"
[...web1 ~]# cat /etc/yum.repos.d/myrepo.repo
[myApp]
async = 1
baseurl = ftp://192.168.88.240/dvd/AppStream
enabled = 1
gpgcheck = 0
name = My App
ansible webservers -m yum_repository -a "file=myrepo name=BaseOS description='Base OS'
baseurl=ftp://192.168.88.240/dvd/BaseOS gpgcheck=no enabled=yes"
[...web1 ~]# cat /etc/yum.repos.d/myrepo.repo
[myApp]
................
[BaseOS]
................
ansible webservers -m yum_repository -a "file=myrepo name=myApp description='My App'
baseurl=ftp://192.168.88.240/dvd/AppStream gpgcheck=no enabled=yes"
[...web1 ~]# cat /etc/yum.repos.d/myrepo.repo
[myApp]
async = 1
baseurl = ftp://192.168.88.240/dvd/AppStream
enabled = 1
gpgcheck = 0
name = My App
ansible webservers -m yum_repository -a "file=myrepo name=BaseOS description='Base OS'
baseurl=ftp://192.168.88.240/dvd/BaseOS gpgcheck=no enabled=yes"
[...web1 ~]# cat /etc/yum.repos.d/myrepo.repo
[myApp]
................
[BaseOS]
................
yum模块
用于rpm软件包管理,如安装、升级、卸载
name:包名
state:状态。默认是安装,可以不写安装!
present表示安装,如果已安装则忽略;
latest表示安装或升级到最新版本;
absent表示卸载。
用于rpm软件包管理,如安装、升级、卸载
name:包名
state:状态。默认是安装,可以不写安装!
present表示安装,如果已安装则忽略;
latest表示安装或升级到最新版本;
absent表示卸载。
ansible webservers -m yum -a "name=tar state=present"
ansible webservers -m yum -a "name=wget,net-tools"
ansible webservers -m yum -a "name=wget state=absent"
ansible webservers -m yum -a "name=nginx state=latest"
ansible webservers -m yum -a "name=wget,net-tools"
ansible webservers -m yum -a "name=wget state=absent"
ansible webservers -m yum -a "name=nginx state=latest"
service模块
用于控制服务。启动、关闭、重启、开机自启。
name:控制的服务名
state:started表示启动;
stopped表示关闭;
restarted表示重启
enabled:yes表示设置开机自启;
no表示设置开机不要自启。
用于控制服务。启动、关闭、重启、开机自启。
name:控制的服务名
state:started表示启动;
stopped表示关闭;
restarted表示重启
enabled:yes表示设置开机自启;
no表示设置开机不要自启。
ansible webservers -m service -a "name=nginx state=started enabled=yes"
逻辑卷相关模块
动态管理存储空间
对逻辑卷进行扩容或缩减
PV---VG---LV
LV可以像普通分区一样,进行格式化、挂载
动态管理存储空间
对逻辑卷进行扩容或缩减
PV---VG---LV
LV可以像普通分区一样,进行格式化、挂载
lvg模块
创建、删除卷组,修改卷组大小
vg:定义卷组名---volume group
pvs:由哪些物理卷构成---physical volumes
创建、删除卷组,修改卷组大小
vg:定义卷组名---volume group
pvs:由哪些物理卷构成---physical volumes
ansible web1 -m yum -a "name=lvm2"
...web1 ~]# fdisk /dev/vdb # 手工在web1上对vdb进行分区
Command (m for help): g # 创建GPT分区表
Command (m for help): n # 新建分区
Partition number (1-128, default 1): # 回车,使用1号分区
First sector (2048-41943006, default 2048): # 起始位置,回车
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943006, default 41943006): +5G
# 结束位置+5G
...........
lsblk # vdb被分出来了两个分区
ansible web1 -m lvg -a "vg=myvg pvs=/dev/vdb1"
# 在web1上创建名为myvg的卷组,该卷组由/dev/vdb1组成
ansible web1 -m lvg -a "vg=myvg pvs=/dev/vdb1,/dev/vdb2"
# 扩容卷组。卷组由PV构成,只要向卷组中加入新的PV,即可实现扩容
vgs # 在web1上查看卷组
...web1 ~]# fdisk /dev/vdb # 手工在web1上对vdb进行分区
Command (m for help): g # 创建GPT分区表
Command (m for help): n # 新建分区
Partition number (1-128, default 1): # 回车,使用1号分区
First sector (2048-41943006, default 2048): # 起始位置,回车
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943006, default 41943006): +5G
# 结束位置+5G
...........
lsblk # vdb被分出来了两个分区
ansible web1 -m lvg -a "vg=myvg pvs=/dev/vdb1"
# 在web1上创建名为myvg的卷组,该卷组由/dev/vdb1组成
ansible web1 -m lvg -a "vg=myvg pvs=/dev/vdb1,/dev/vdb2"
# 扩容卷组。卷组由PV构成,只要向卷组中加入新的PV,即可实现扩容
vgs # 在web1上查看卷组
lvol模块
创建、删除逻辑卷,修改逻辑卷大小
vg:指定在哪个卷组上创建逻辑卷
lv:创建的逻辑卷名。logical volume
size:逻辑卷的大小,不写单位,以M为单位
创建、删除逻辑卷,修改逻辑卷大小
vg:指定在哪个卷组上创建逻辑卷
lv:创建的逻辑卷名。logical volume
size:逻辑卷的大小,不写单位,以M为单位
ansible web1 -m lvol -a "vg=myvg lv=mylv size=2G"
# 在web1上创建名为mylv的逻辑卷,大小为2GB
ansible web1 -m lvol -a "vg=myvg lv=mylv size=4G"
# mylv扩容至4GB
lvs # 在web1上查看逻辑卷
ansible web1 -m lvol -a "vg=myvg lv=mylv size=6G resizefs=true"
#格式化后再扩容,需要再格式化!
# 在web1上创建名为mylv的逻辑卷,大小为2GB
ansible web1 -m lvol -a "vg=myvg lv=mylv size=4G"
# mylv扩容至4GB
lvs # 在web1上查看逻辑卷
ansible web1 -m lvol -a "vg=myvg lv=mylv size=6G resizefs=true"
#格式化后再扩容,需要再格式化!
filesystem模块
用于格式化,也就是创建文件系统
fstype:指定文件系统类型
dev:指定要格式化的设备,可以是分区,可以是逻辑卷
用于格式化,也就是创建文件系统
fstype:指定文件系统类型
dev:指定要格式化的设备,可以是分区,可以是逻辑卷
ansible web1 -m filesystem -a "fstype=xfs dev=/dev/myvg/mylv"
# 在web1上,把/dev/myvg/mylv格式化为xfs
blkid /dev/myvg/mylv # 在web1上查看格式化结果
# 在web1上,把/dev/myvg/mylv格式化为xfs
blkid /dev/myvg/mylv # 在web1上查看格式化结果
mount模块
用于挂载文件系统
path:挂载点。如果挂载点不存在,自动创建。
src:待挂载的设备
fstype:文件系统类型
state:mounted,表示永久挂载
present 临时挂载
用于挂载文件系统
path:挂载点。如果挂载点不存在,自动创建。
src:待挂载的设备
fstype:文件系统类型
state:mounted,表示永久挂载
present 临时挂载
ansible web1 -m mount -a "path=/data src=/dev/myvg/mylv state=mounted fstype=xfs"
# 在web1上,把/dev/myvg/mylv永久挂载到/data,回自动在/etc/fstab生成一行
ansible web1 -m mount -a "path=/data state=absent"
#卸载/dev/myvg/mylv
ansible web1 -m lvol -a "lv=mylv state=absent vg=myvg force=yes"
#强制删除/dev/myvg/mylv
ansible web1 -m lvg -a "vg=myvg state=absent"
#删除myvg卷组
# 在web1上,把/dev/myvg/mylv永久挂载到/data,回自动在/etc/fstab生成一行
ansible web1 -m mount -a "path=/data state=absent"
#卸载/dev/myvg/mylv
ansible web1 -m lvol -a "lv=mylv state=absent vg=myvg force=yes"
#强制删除/dev/myvg/mylv
ansible web1 -m lvg -a "vg=myvg state=absent"
#删除myvg卷组
Playbook
常用于复杂任务的管理,以及管理经常要完成的任务
playbook也是通过模块和它的参数,在特定主机上执行任务
playbook是一个文件,该文件中需要通过yaml格式进行书写
playbook也是通过模块和它的参数,在特定主机上执行任务
playbook是一个文件,该文件中需要通过yaml格式进行书写
Playbook的作用:
Ansible的核心组件之一,它是一种用于定义、组织和执行Ansible任务的语言。
可包含多个任务,每个任务可以指定要执行的模块、主机、变量和条件等信息。
使用Playbook可以实现自动化部署、配置管理、应用程序发布等任务。
Playbook通常使用YAML格式编写,易于阅读和维护。
Ansible的核心组件之一,它是一种用于定义、组织和执行Ansible任务的语言。
可包含多个任务,每个任务可以指定要执行的模块、主机、变量和条件等信息。
使用Playbook可以实现自动化部署、配置管理、应用程序发布等任务。
Playbook通常使用YAML格式编写,易于阅读和维护。
yaml语法规范-----YAML Ain't a Markup Language
1.yaml文件的文件名,一般以yml或yaml作为扩展名
2.文件一般以---作为第一行,不是必须的,但是常用
3.键值对使用冒号:表示,冒号后面必须有空格。
name=zhangsan ------ name: zhangsan
4.数组使用-表示,-后面必须有空格。
5.相同的层级必须有相同的缩进。如果缩进不对,则有语法错误。
每一级缩进,建议2个空格。
6.全文不能使用tab,必须使用空格。
vim ~/.vimrc
set ai # 设置自动缩进
set ts=2 # 设置按tab键,缩进2个空格
set et # 将tab转换成相应个数的空格
1.yaml文件的文件名,一般以yml或yaml作为扩展名
2.文件一般以---作为第一行,不是必须的,但是常用
3.键值对使用冒号:表示,冒号后面必须有空格。
name=zhangsan ------ name: zhangsan
4.数组使用-表示,-后面必须有空格。
5.相同的层级必须有相同的缩进。如果缩进不对,则有语法错误。
每一级缩进,建议2个空格。
6.全文不能使用tab,必须使用空格。
vim ~/.vimrc
set ai # 设置自动缩进
set ts=2 # 设置按tab键,缩进2个空格
set et # 将tab转换成相应个数的空格
编写playbook:
一个剧本(即playbook),可以包含多个play
每个play用于在指定的主机上,通过模块和参数执行相应的任务
每个play可以包含多个任务。
任务有模块和参数构成。
一个剧本(即playbook),可以包含多个play
每个play用于在指定的主机上,通过模块和参数执行相应的任务
每个play可以包含多个任务。
任务有模块和参数构成。
vim test.yml
---
- name: test network # play的名字,可选项
hosts: all # 作用于所有的主机
tasks: # 任务
- name: test via ping # 第1个任务的名字,可选项
ping: # 第1个任务使用的模块
ansible-playbook test.yml # 执行playbook
---
- name: test network # play的名字,可选项
hosts: all # 作用于所有的主机
tasks: # 任务
- name: test via ping # 第1个任务的名字,可选项
ping: # 第1个任务使用的模块
ansible-playbook test.yml # 执行playbook
在dbs组的主机和web1上创建/tmp/demo目录,权限是0755。
将控制端/etc/hosts拷贝到目标主机的/tmp/demo中。
vim fileop.yml
---
- name: create dir and copy file
hosts: dbs,web1 # 这里的名称,必须出现在主机清单文件中
tasks:
- name: create dir
file:
path: /tmp/demo
state: directory
mode: '0755'
- name: copy file
copy:
src: /etc/hosts
dest: /tmp/demo/hosts
ansible-playbook fileop.yml
将控制端/etc/hosts拷贝到目标主机的/tmp/demo中。
vim fileop.yml
---
- name: create dir and copy file
hosts: dbs,web1 # 这里的名称,必须出现在主机清单文件中
tasks:
- name: create dir
file:
path: /tmp/demo
state: directory
mode: '0755'
- name: copy file
copy:
src: /etc/hosts
dest: /tmp/demo/hosts
ansible-playbook fileop.yml
在webservers组中的主机上,创建用户bob,附加组是adm;
在db1主机上,创建/tmp/hi.txt,其内容为Hello World.
---
- name: create user
hosts: webservers
tasks:
- name: create bob
user:
name: bob
groups: adm
- name: create file
hosts: db1
tasks:
- name: make file
copy:
dest: /tmp/hi.txt
content: 'hello world\n'
在db1主机上,创建/tmp/hi.txt,其内容为Hello World.
---
- name: create user
hosts: webservers
tasks:
- name: create bob
user:
name: bob
groups: adm
- name: create file
hosts: db1
tasks:
- name: make file
copy:
dest: /tmp/hi.txt
content: 'hello world\n'
|和>的区别:
|它保留换行符,>把多行合并为一行
|它保留换行符,>把多行合并为一行
vim f1.yml
---
- name: play 1
hosts: webservers
tasks:
- name: mkfile 1.txt
copy:
dest: /tmp/1.txt
content: | 或者 >
Hello World!
ni hao.
---
- name: play 1
hosts: webservers
tasks:
- name: mkfile 1.txt
copy:
dest: /tmp/1.txt
content: | 或者 >
Hello World!
ni hao.
cat /tmp/1.txt 写 | 结果,换行
Hello World!
ni hao.
cat /tmp/2.txt 写 > 结果,不换行
Hello World! ni hao.
Hello World!
ni hao.
cat /tmp/2.txt 写 > 结果,不换行
Hello World! ni hao.
在webservers组中的主机上创建john用户,它的uid是1040,主组是daemon,密码为123
vim user_john.yml
---
- name: create user
hosts: webservers
tasks:
- name: create user john
user:
name: john
uid: 1040
group: daemon
password: "{{'123'|password_hash('sha512')}}" {{}}开头,必须加引号;字符类型的必须加引号
vim user_john.yml
---
- name: create user
hosts: webservers
tasks:
- name: create user john
user:
name: john
uid: 1040
group: daemon
password: "{{'123'|password_hash('sha512')}}" {{}}开头,必须加引号;字符类型的必须加引号
在webservers组中的主机上删除用户john
vim del_john.yml
---
- name: delete user
hosts: webservers
tasks:
- name: delete user john
user:
name: john
state: absent
vim del_john.yml
---
- name: delete user
hosts: webservers
tasks:
- name: delete user john
user:
name: john
state: absent
硬盘管理
常用的分区表类型有:MBR(主引导记录)、GPT(GUID分区表)
MBR最多支持4个主分区,或3个主分区加1个扩展分区。最大支持2.2TB左右的硬盘
GPT最多支持128个主分区。支持大硬盘
常用的分区表类型有:MBR(主引导记录)、GPT(GUID分区表)
MBR最多支持4个主分区,或3个主分区加1个扩展分区。最大支持2.2TB左右的硬盘
GPT最多支持128个主分区。支持大硬盘
parted模块
用于硬盘分区管理
device:待分区的设备
number:分区编号
state:present表示创建,absent表示删除
part_start:分区的起始位置,不写表示从开头
part_end:表示分区的结束位置,不写表示到结尾
用于硬盘分区管理
device:待分区的设备
number:分区编号
state:present表示创建,absent表示删除
part_start:分区的起始位置,不写表示从开头
part_end:表示分区的结束位置,不写表示到结尾
子主题
vim disk.yml
---
- name: disk manage #创建分区
hosts: web1
tasks:
- name: create a partition
parted:
device: /dev/vdc
number: 1 #分区1
state: present
part_end: 1GiB #单位必须写GiB
- name: add a new partition
parted:
device: /dev/vdc
number: 2 #分区2
state: present
part_start: 1GiB #开始位置
part_end: 6GiB #结束位置
- name: create my_vg #创建名为my_vg的卷组
lvg:
vg: my_vg
pvs: /dev/vdc1,/dev/vdc2
- name: create my_lv #创建名为my_lv的逻辑卷
lvol:
vg: my_vg
lv: my_lv
size: 1G #单位可以写G
- name: mkfs my_lv #格式化
filesystem:
dev: /dev/my_vg/my_lv
fstype: ext4
- name: mount my_lv
mount: #挂载,没有目录/data,自动创建
path: /data
src: /dev/my_vg/my_lv
fstype: ext4
state: mounted #永久挂载,并写入/etc/fstab
---
- name: disk manage #创建分区
hosts: web1
tasks:
- name: create a partition
parted:
device: /dev/vdc
number: 1 #分区1
state: present
part_end: 1GiB #单位必须写GiB
- name: add a new partition
parted:
device: /dev/vdc
number: 2 #分区2
state: present
part_start: 1GiB #开始位置
part_end: 6GiB #结束位置
- name: create my_vg #创建名为my_vg的卷组
lvg:
vg: my_vg
pvs: /dev/vdc1,/dev/vdc2
- name: create my_lv #创建名为my_lv的逻辑卷
lvol:
vg: my_vg
lv: my_lv
size: 1G #单位可以写G
- name: mkfs my_lv #格式化
filesystem:
dev: /dev/my_vg/my_lv
fstype: ext4
- name: mount my_lv
mount: #挂载,没有目录/data,自动创建
path: /data
src: /dev/my_vg/my_lv
fstype: ext4
state: mounted #永久挂载,并写入/etc/fstab
day03
ansible
模块进阶及变量
模块进阶及变量
---
- name: install pkgs
hosts: webservers
tasks:
- name: install web pkgs
yum:
name: 还可以写为--- name:httpd,php,php-mysqlnd
- httpd 还可以写为--- name:[httpd,php,php-mysqlnd]
- php
- php-mysqlnd
state: present
- name: install dev group
yum:
name: "@Development Tools" # 安装软件包组,@表示后面的名字是组名
state: present yum grouplist # 列出所有的软件包组,yum groupinstall "Development Tools"
如果列出的组名为中文,可以这样进行:LANG=C yum grouplist
- name: update system # 相当于yum update命令
yum:
name: "*" # 表示系统已经安装的所有包
state: latest #升级
- name: install pkgs
hosts: webservers
tasks:
- name: install web pkgs
yum:
name: 还可以写为--- name:httpd,php,php-mysqlnd
- httpd 还可以写为--- name:[httpd,php,php-mysqlnd]
- php
- php-mysqlnd
state: present
- name: install dev group
yum:
name: "@Development Tools" # 安装软件包组,@表示后面的名字是组名
state: present yum grouplist # 列出所有的软件包组,yum groupinstall "Development Tools"
如果列出的组名为中文,可以这样进行:LANG=C yum grouplist
- name: update system # 相当于yum update命令
yum:
name: "*" # 表示系统已经安装的所有包
state: latest #升级
facts变量:
ansible自带的预定义变量,
用于描述被控端软硬件信息
facts变量通过setup模块获得
ansible自带的预定义变量,
用于描述被控端软硬件信息
facts变量通过setup模块获得
ansible webservers -m setup # 通过setup模块查看所有facts变量
facts变量是一个大的由{}构成的键值对字典。在{}中,有很多层级的嵌套。可以通过参数过滤出第一个层级的内容。
ansible webservers -m setup -a "filter=ansible_all_ipv4_addresses" # 查看所有的IPV4地址,filter是过滤的意思
ansible webservers -m setup -a "filter=ansible_memfree_mb" # 查看可用内存
ansible webservers -m setup -a "filter=ansible_all_ipv4_addresses" # 查看所有的IPV4地址,filter是过滤的意思
ansible webservers -m setup -a "filter=ansible_memfree_mb" # 查看可用内存
常用的facts变量
ansible_all_ipv4_addresses:所有的IPV4地址
ansible_bios_version:BIOS版本信息
ansible_memtotal_mb:总内存大小
ansible_hostname:主机名
ansible_all_ipv4_addresses:所有的IPV4地址
ansible_bios_version:BIOS版本信息
ansible_memtotal_mb:总内存大小
ansible_hostname:主机名
# 显示远程主机的主机名和内存大小。在ansible中,变量使用{{}}表示
# debug模块用于输出信息,常用的参数是msg,用于输出指定内容
vim debug.yml
---
- name: display host info
hosts: webservers
tasks:
- name: display hostname and memory
debug: # debug是模块,它的选项msg可以输出指定信息
msg: "hostname: {{ansible_hostname}}; mem: {{ansible_memtotal_mb}} MB"
# debug模块用于输出信息,常用的参数是msg,用于输出指定内容
vim debug.yml
---
- name: display host info
hosts: webservers
tasks:
- name: display hostname and memory
debug: # debug是模块,它的选项msg可以输出指定信息
msg: "hostname: {{ansible_hostname}}; mem: {{ansible_memtotal_mb}} MB"
自定义变量:
引入变量,可以方便Playbook重用。
比如装包的playbook,包名使用变量。
多次执行playbook,只要改变变量名,不用编写新的playbook。
常用变量:
inventory变量。变量来自于主机清单文件
playbook变量。变量在playbook中定义。
变量文件。专门创建用于保存变量的文件。推荐变量写入单独的文件。
引入变量,可以方便Playbook重用。
比如装包的playbook,包名使用变量。
多次执行playbook,只要改变变量名,不用编写新的playbook。
常用变量:
inventory变量。变量来自于主机清单文件
playbook变量。变量在playbook中定义。
变量文件。专门创建用于保存变量的文件。推荐变量写入单独的文件。
1.使用inventory变量:
vim inventory
[webservers]
web1
web2
[dbs]
db1 username="wangwu" # 定义主机变量的方法
[webservers:vars] # 定义组变量的方法,:vars是固定格式
username="zhaoliu"
2.通过变量创建用户:
vim var1.yml
---
- name: webservers create user
hosts: dbs,webservers
tasks:
- name: create user
user:
name: "{{username}}"
state: present
vim inventory
[webservers]
web1
web2
[dbs]
db1 username="wangwu" # 定义主机变量的方法
[webservers:vars] # 定义组变量的方法,:vars是固定格式
username="zhaoliu"
2.通过变量创建用户:
vim var1.yml
---
- name: webservers create user
hosts: dbs,webservers
tasks:
- name: create user
user:
name: "{{username}}"
state: present
3.在playbook中定义变量:
vim user_jack.yml
---
- name: create user
hosts: webservers
vars: # 固定格式,用于声明变量
username: "jack" # 此处引号可有可无
mima: "123456" # 此处引号是需要的,表示数字字符
tasks:
- name: create some users
user:
name: "{{username}}" # {}出现在开头,必须有引号
state: present
password: "{{mima|password_hash('sha512')}}"
vim user_jack.yml
---
- name: create user
hosts: webservers
vars: # 固定格式,用于声明变量
username: "jack" # 此处引号可有可无
mima: "123456" # 此处引号是需要的,表示数字字符
tasks:
- name: create some users
user:
name: "{{username}}" # {}出现在开头,必须有引号
state: present
password: "{{mima|password_hash('sha512')}}"
4.将变量定义在文件中:
vim vars.yml # 文件名自定义
---
yonghu: rose
mima: abcd
vim user_rose.yml
---
- name: create user
hosts: webservers
vars_files: vars.yml # vars_files用于声明变量文件
tasks:
- name: create some users
user:
name: "{{yonghu}}" # 这里的变量来自于vars.yml
state: present
password: "{{mima|password_hash('sha512')}}"
vim vars.yml # 文件名自定义
---
yonghu: rose
mima: abcd
vim user_rose.yml
---
- name: create user
hosts: webservers
vars_files: vars.yml # vars_files用于声明变量文件
tasks:
- name: create some users
user:
name: "{{yonghu}}" # 这里的变量来自于vars.yml
state: present
password: "{{mima|password_hash('sha512')}}"
firewalld 模块
用于配置防火墙的模块
port:声明端口
permanent:永久生效,但不会立即生效
immediate:立即生效,临时生效
state:enabled,放行;disabled拒绝
用于配置防火墙的模块
port:声明端口
permanent:永久生效,但不会立即生效
immediate:立即生效,临时生效
state:enabled,放行;disabled拒绝
vim firewall.yml
---
- name: configure webservers
hosts: webservers
tasks:
- name: install nginx pkg # 这里通过yum模块装包
yum:
name: nginx
state: present
- name: start nginx service # 这里通过service模块启服务
service:
name: nginx
state: started
enabled: yes
- name: install firewalld pkg # 这里通过yum模块安装firewalld
yum:
name: firewalld
state: present
- name: start firewalld service # 这里通过service模块启service服务
service:
name: firewalld
state: started
enabled: yes
- name: set firewalld rules # 通过firewalld模块开放80端口
firewalld:
port: 80/tcp
permanent: yes
immediate: yes
state: enabled
---
- name: configure webservers
hosts: webservers
tasks:
- name: install nginx pkg # 这里通过yum模块装包
yum:
name: nginx
state: present
- name: start nginx service # 这里通过service模块启服务
service:
name: nginx
state: started
enabled: yes
- name: install firewalld pkg # 这里通过yum模块安装firewalld
yum:
name: firewalld
state: present
- name: start firewalld service # 这里通过service模块启service服务
service:
name: firewalld
state: started
enabled: yes
- name: set firewalld rules # 通过firewalld模块开放80端口
firewalld:
port: 80/tcp
permanent: yes
immediate: yes
state: enabled
template 模块
copy模块可以上传文件,但是文件内容固定
template模块可以上传具有特定格式的文件(如文件中包含变量)
当远程主机接收到文件之后,文件中的变量将会变成具体的值
template模块上传的文件,使用的语法叫Jinja2。
src:要上传的文件
dest:目标文件路径
copy模块可以上传文件,但是文件内容固定
template模块可以上传具有特定格式的文件(如文件中包含变量)
当远程主机接收到文件之后,文件中的变量将会变成具体的值
template模块上传的文件,使用的语法叫Jinja2。
src:要上传的文件
dest:目标文件路径
vim index.html
Welcome to {{ansible_hostname}} on {{ansible_eth0.ipv4.address}}
Welcome to {{ansible_hostname}} on {{ansible_eth0.ipv4.address}}
vim templ.yml
---
- name: upload index
hosts: webservers
tasks:
- name: create web index
template:
src: index.html
dest: /usr/share/nginx/html/index.html
---
- name: upload index
hosts: webservers
tasks:
- name: create web index
template:
src: index.html
dest: /usr/share/nginx/html/index.html
进阶
一、错误处理:ignore_errors: yes
1.写在某个任务里:
指定某一个任务如果出现错误,则忽略它
继续执行后续任务
2.全局设置写在play,无论哪个任务出现问题,都要忽略
1.写在某个任务里:
指定某一个任务如果出现错误,则忽略它
继续执行后续任务
2.全局设置写在play,无论哪个任务出现问题,都要忽略
1.vim myerr.yml
---
- name: my errors
hosts: webservers
tasks:
- name: start mysqld service
service:
name: mysqld
state: started
enabled: yes
ignore_errors: yes # 即使这个任务失败了,也要继续执行下去
- name: touch a file
file:
path: /tmp/service.txt
state: touch
2.- name: my errors
hosts: webservers
ignore_errors: yes #全局设置,忽略
tasks:
- name: start mysqld service
... ...
- name: touch a file
... ...
---
- name: my errors
hosts: webservers
tasks:
- name: start mysqld service
service:
name: mysqld
state: started
enabled: yes
ignore_errors: yes # 即使这个任务失败了,也要继续执行下去
- name: touch a file
file:
path: /tmp/service.txt
state: touch
2.- name: my errors
hosts: webservers
ignore_errors: yes #全局设置,忽略
tasks:
- name: start mysqld service
... ...
- name: touch a file
... ...
二、触发执行任务:
通过handlers定义触发执行的任务
handlers中定义的任务,不是一定会执行的
在tasks中定义的任务,通过notify关键通知handlers中的哪个任务要执行
只有tasks中的任务状态是changed才会进行通知。
通过handlers定义触发执行的任务
handlers中定义的任务,不是一定会执行的
在tasks中定义的任务,通过notify关键通知handlers中的哪个任务要执行
只有tasks中的任务状态是changed才会进行通知。
vim get_conf.yml # 下载web1上的/etc/nginx/nginx.conf
---
- name: download nginx.conf
hosts: web1
tasks:
- name: get nginx.conf
fetch:
src: /etc/nginx/nginx.conf
dest: ./
flat: yes # 直接下载文件,不要目录
---
- name: download nginx.conf
hosts: web1
tasks:
- name: get nginx.conf
fetch:
src: /etc/nginx/nginx.conf
dest: ./
flat: yes # 直接下载文件,不要目录
vim +39 nginx.conf
... ...
server {
listen {{http_port}} default_server;
listen [::]:{{http_port}} default_server;
server_name _;
... ...
... ...
server {
listen {{http_port}} default_server;
listen [::]:{{http_port}} default_server;
server_name _;
... ...
vim trigger.yml # 修改nginx服务的端口为8000,重启nginx
---
- name: configure nginx
hosts: webservers
vars:
http_port: "8000" # 定义nginx.conf中的变量和值
tasks:
name: upload nginx.conf # 上传nginx.conf
template:
src: ./nginx.conf
dest: /etc/nginx/nginx.conf
- name: restart nginx # 重启服务
service:
name: nginx
state: restarted
---
- name: configure nginx
hosts: webservers
vars:
http_port: "8000" # 定义nginx.conf中的变量和值
tasks:
name: upload nginx.conf # 上传nginx.conf
template:
src: ./nginx.conf
dest: /etc/nginx/nginx.conf
- name: restart nginx # 重启服务
service:
name: nginx
state: restarted
# 第一次执行trigger.yml,上传文件和重启服务两个任务的状态都是黄色changed
# 第二次执行trigger.yml,上传文件的任务状态是绿色的ok,重启服务任务的状态是黄色changed
# 第二次执行trigger.yml,上传文件的任务状态是绿色的ok,重启服务任务的状态是黄色changed
vim trigger.yml
---
- name: configure nginx
hosts: webservers
vars:
http_port: "80"
tasks:
- name: upload nginx.conf
template:
src: ./nginx.conf
dest: /etc/nginx/nginx.conf
notify: restart nginx # 通知restart httpd需要执行
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
---
- name: configure nginx
hosts: webservers
vars:
http_port: "80"
tasks:
- name: upload nginx.conf
template:
src: ./nginx.conf
dest: /etc/nginx/nginx.conf
notify: restart nginx # 通知restart httpd需要执行
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
# 既然配置文件没有改变,那么服务就不应该重启
# 修改Playbook,只有配置文件变化了,才重启服务
# 第一次运行Playbook,因为第1个任务是黄色的changed,所以handlers中的任务也被触发执行
# 第二次运行Playbook,因为第1个任务是绿色的OK,也就不会再触发执行其他任务了
# 修改Playbook,只有配置文件变化了,才重启服务
# 第一次运行Playbook,因为第1个任务是黄色的changed,所以handlers中的任务也被触发执行
# 第二次运行Playbook,因为第1个任务是绿色的OK,也就不会再触发执行其他任务了
三、when条件
只有满足某一条件时,才执行任务
常用的操作符:
==:相等
!=:不等
>:大于
<:小于
<=:小于等于
>=:大于等于
多个条件或以使用and或or进行连接
not 取反: not 5 >30 ---5不大于30
when表达式中的变量,可以不使用{{}}
只有满足某一条件时,才执行任务
常用的操作符:
==:相等
!=:不等
>:大于
<:小于
<=:小于等于
>=:大于等于
多个条件或以使用and或or进行连接
not 取反: not 5 >30 ---5不大于30
when表达式中的变量,可以不使用{{}}
vim when1.yml # 当dbs组中的主机内存大于2G的时候,才安装mysql-server
---
- name: install mysql-server
hosts: dbs
tasks:
- name: install mysql-server pkg
yum:
name: mysql-server
state: present
when: ansible_memtotal_mb>2048
---
- name: install mysql-server
hosts: dbs
tasks:
- name: install mysql-server pkg
yum:
name: mysql-server
state: present
when: ansible_memtotal_mb>2048
yum -y install cowsay
cowsay hello world > motd
开机登录设置,/etc/motd
# 多条件---系统发行版是Rocky8才执行任务
# /etc/motd中的内容,将会在用户登陆时显示在屏幕上
停止: echo 'nocows = 1 ' >> ansible.cfg
cowsay hello world > motd
开机登录设置,/etc/motd
# 多条件---系统发行版是Rocky8才执行任务
# /etc/motd中的内容,将会在用户登陆时显示在屏幕上
停止: echo 'nocows = 1 ' >> ansible.cfg
vim when2.yml
---
- name: when condition
hosts: webservers
tasks:
- name: modify /etc/motd
copy:
dest: /etc/motd
src: motd
when: > # 以下三行合并成一行
ansible_distribution == "Rocky"
and
ansible_distribution_major_version == "8"
---
- name: when condition
hosts: webservers
tasks:
- name: modify /etc/motd
copy:
dest: /etc/motd
src: motd
when: > # 以下三行合并成一行
ansible_distribution == "Rocky"
and
ansible_distribution_major_version == "8"
四、regitster注册变量
“register”模块是用于捕获和保存任务执行结果的,它允许将其他任务的输出作为变量使用。
register是一个关键字,可以将任务执行的结果赋值给指定的变量名称。
这个变量可以在后续任务中使用。
register模块可以捕获各种类型的输出,包括stdout、stderr、rc、changed等。
它可以与其他模块一起使用,例如“when”条件、“loop”循环等。
“register”模块是用于捕获和保存任务执行结果的,它允许将其他任务的输出作为变量使用。
register是一个关键字,可以将任务执行的结果赋值给指定的变量名称。
这个变量可以在后续任务中使用。
register模块可以捕获各种类型的输出,包括stdout、stderr、rc、changed等。
它可以与其他模块一起使用,例如“when”条件、“loop”循环等。
创建/tmp/regfile1.txt,并打印创建结果
vim reg1.yml
---
- name: create file /tmp/regfile1.txt
hosts: web1
tasks:
- name: create file
file:
path: /tmp/rgefile1.txt
state: touch
register: result
- name: display output
debug:
msg: "{{result}}"
vim reg1.yml
---
- name: create file /tmp/regfile1.txt
hosts: web1
tasks:
- name: create file
file:
path: /tmp/rgefile1.txt
state: touch
register: result
- name: display output
debug:
msg: "{{result}}"
创建文件/tmp/ademo/abc。如果创建不成功,则通过debug输出create failed
vim reg2.yml
---
- name: create file /tmp/ademo/abc
hosts: web1
ignore_errors: yes
tasks:
- name: create file
file:
path: /tmp/ademo/abc
state: touch
register: result
- name: debug output
debug:
msg: "create failed"
when: result.failed
vim reg2.yml
---
- name: create file /tmp/ademo/abc
hosts: web1
ignore_errors: yes
tasks:
- name: create file
file:
path: /tmp/ademo/abc
state: touch
register: result
- name: debug output
debug:
msg: "create failed"
when: result.failed
day04
任务块
1.
可以通过block关键字,将多个任务组合到一起
可以将整个block任务组,一起控制是否要执行
可以通过block关键字,将多个任务组合到一起
可以将整个block任务组,一起控制是否要执行
vim block1.yml
-1 ---
2 - name: block tasks
3 hosts: webservers
4 tasks:
5 - name: defind a group of tasks
6 block:
7 - name: install nginx
8 yum:
9 name: nginx
10 state: present
11
12 - name: start ngxin
13 service:
14 name: nginx
15 state: started
16 when: ansible_distribution=="Rocky" # 条件为真才会执行上面的任务
-1 ---
2 - name: block tasks
3 hosts: webservers
4 tasks:
5 - name: defind a group of tasks
6 block:
7 - name: install nginx
8 yum:
9 name: nginx
10 state: present
11
12 - name: start ngxin
13 service:
14 name: nginx
15 state: started
16 when: ansible_distribution=="Rocky" # 条件为真才会执行上面的任务
block和rescue、always联合使用:
block中的任务都成功,rescue中的任务不执行
block中的任务出现失败(failed),rescue中的任务执行
block中的任务不管怎么样,always中的任务总是执行
block中的任务都成功,rescue中的任务不执行
block中的任务出现失败(failed),rescue中的任务执行
block中的任务不管怎么样,always中的任务总是执行
vim block2.yml
---
- name: block test
hosts: webservers
tasks:
- name: block / rescue / always test1
block:
- name: touch a file
file:
path: /tmp/abcd/test11.txt
state: touch
rescue:
- name: touch file test22.txt
file:
path: /tmp/test22.txt
state: touch
always:
- name: touch file test33.txt
file:
path: /tmp/test33.txt
state: touch
---
- name: block test
hosts: webservers
tasks:
- name: block / rescue / always test1
block:
- name: touch a file
file:
path: /tmp/abcd/test11.txt
state: touch
rescue:
- name: touch file test22.txt
file:
path: /tmp/test22.txt
state: touch
always:
- name: touch file test33.txt
file:
path: /tmp/test33.txt
state: touch
# 因web1上没/tmp/abcd目录,
所以block中的任务失败。
但是playbook不再崩溃,
而是执行rescue中的任务。
always中的任务总是执行
所以block中的任务失败。
但是playbook不再崩溃,
而是执行rescue中的任务。
always中的任务总是执行
loop循环:
相当于shell中for循环
变量名是固定的,叫item
相当于shell中for循环
变量名是固定的,叫item
vim loop1.yml
---
- name: use loop
hosts: webservers
tasks:
- name: create directory
file:
path: /tmp/{{item}}
state: directory
loop: [aaa,bbb,ccc,ddd,eee] #python的写法
相当于:for item in aaa bbb....
在t主机上创建5个目录/tmp/{aaa,bbb,ccc,ddd,eee}
---
- name: use loop
hosts: webservers
tasks:
- name: create directory
file:
path: /tmp/{{item}}
state: directory
loop: [aaa,bbb,ccc,ddd,eee] #python的写法
相当于:for item in aaa bbb....
在t主机上创建5个目录/tmp/{aaa,bbb,ccc,ddd,eee}
---
- name: use loop
hosts: webservers
tasks:
- name: create directory
file:
path: /tmp/{{item}}
state: directory
loop: # playbook 的写法
- aaa
- bbb
- ccc
- ddd
- eee
- name: use loop
hosts: webservers
tasks:
- name: create directory
file:
path: /tmp/{{item}}
state: directory
loop: # playbook 的写法
- aaa
- bbb
- ccc
- ddd
- eee
# 使用复杂变量。创建zhangsan用户,密码是123;创建lisi用户,密码是456
# item是固定的,用于表示循环中的变量
# 循环时,loop中每个-后面的内容作为一个整体赋值给item。
# loop中{}中的内容是自己定义的,写法为key:val
# 取值时使用句点表示。如下例中取出用户名就是{{item.uname}}
# item是固定的,用于表示循环中的变量
# 循环时,loop中每个-后面的内容作为一个整体赋值给item。
# loop中{}中的内容是自己定义的,写法为key:val
# 取值时使用句点表示。如下例中取出用户名就是{{item.uname}}
vim loop_user.yml
---
- name: create users
hosts: webservers
tasks:
- name: create multiple users
user:
name: "{{item.uname}}"
password: "{{item.upass|password_hash('sha512')}}"
loop:
- {"uname": "zhangsan", "upass": "123"}
- {"uname": "lisi", "upass": "456"}
---
- name: create users
hosts: webservers
tasks:
- name: create multiple users
user:
name: "{{item.uname}}"
password: "{{item.upass|password_hash('sha512')}}"
loop:
- {"uname": "zhangsan", "upass": "123"}
- {"uname": "lisi", "upass": "456"}
role 角色
为了实现playbook重用,可以使用role角色
角色role相当于把任务打散,放到不同的目录中
再把一些固定的值,如用户名、软件包、服务等,用变量来表示
role角色定义好之后,可以在其他playbook中直接调用
角色role相当于把任务打散,放到不同的目录中
再把一些固定的值,如用户名、软件包、服务等,用变量来表示
role角色定义好之后,可以在其他playbook中直接调用
1.使用常规playbook,修改/etc/motd的内容
vim motd
Hostname: {{ansible_hostname}} # facts变量,主机名
Date: {{ansible_date_time.date}} # facts变量,日期
Contact to: {{admin}} # 自定义变量
vim motd.yml
---
- name: modifty /etc/motd
hosts: webservers
vars:
admin: root@tedu.cn # 自定义名为admin的变量
tasks:
- name: modify motd
template:
src: motd
dest: /etc/motd
vim motd
Hostname: {{ansible_hostname}} # facts变量,主机名
Date: {{ansible_date_time.date}} # facts变量,日期
Contact to: {{admin}} # 自定义变量
vim motd.yml
---
- name: modifty /etc/motd
hosts: webservers
vars:
admin: root@tedu.cn # 自定义名为admin的变量
tasks:
- name: modify motd
template:
src: motd
dest: /etc/motd
2.playbook 的方式:
# 创建角色
1. 声明角色存放的位置
vim ansible.cfg
[defaults]
inventory = hosts
roles_path = roles # 定义角色存在当前目录的roles子目录中
2. 创建角色目录
mkdir roles
3. 创建名为motd的角色
ansible-galaxy init roles/motd
ls roles/motd # 生成了motd角色目录
yum install -y tree
tree roles/motd/
roles/motd/
├── defaults # 定义变量的目录,优先级最低
│ └── main.yml
├── files # 保存上传的文件(如copy模块用到的文件)
├── handlers # handlers任务写到这个目录的main.yml中
│ └── main.yml
├── meta # 保存说明数据,如角色作者、版本等
│ └── main.yml
├── README.md # 保存角色如何使用之类的说明
├── tasks # 保存任务
│ └── main.yml
├── templates # 保存template模块上传的模板文件
├── tests # 保存测试用的playbook。可选
│ ├── inventory
│ └── test.yml
└── vars # 定义变量的位置,推荐使用的位置
└── main.yml
4. 将不同的内容分别写到对应目录的main.yml中
4.1 创建motd模板文件
vim roles/motd/templates/motd
Hostname: {{ansible_hostname}}
Date: {{ansible_date_time.date}}
Contact to: {{admin}}
4.2 创建变量
vim roles/motd/vars/main.yml # 追加一行
admin: zzg@tedu.cn
4.3 创建任务
vim roles/motd/tasks/main.yml # 追加
- name: modify motd
template:
src: motd # 这里的文件,自动到templates目录下查找
dest: /etc/motd
5. 创建playbook,调用motd角色
vim role_motd.yml
---
- name: modify motd with role
hosts: webservers
roles:
- motd
6. 执行playbook
ansible-playbook role_motd.yml
# 创建角色
1. 声明角色存放的位置
vim ansible.cfg
[defaults]
inventory = hosts
roles_path = roles # 定义角色存在当前目录的roles子目录中
2. 创建角色目录
mkdir roles
3. 创建名为motd的角色
ansible-galaxy init roles/motd
ls roles/motd # 生成了motd角色目录
yum install -y tree
tree roles/motd/
roles/motd/
├── defaults # 定义变量的目录,优先级最低
│ └── main.yml
├── files # 保存上传的文件(如copy模块用到的文件)
├── handlers # handlers任务写到这个目录的main.yml中
│ └── main.yml
├── meta # 保存说明数据,如角色作者、版本等
│ └── main.yml
├── README.md # 保存角色如何使用之类的说明
├── tasks # 保存任务
│ └── main.yml
├── templates # 保存template模块上传的模板文件
├── tests # 保存测试用的playbook。可选
│ ├── inventory
│ └── test.yml
└── vars # 定义变量的位置,推荐使用的位置
└── main.yml
4. 将不同的内容分别写到对应目录的main.yml中
4.1 创建motd模板文件
vim roles/motd/templates/motd
Hostname: {{ansible_hostname}}
Date: {{ansible_date_time.date}}
Contact to: {{admin}}
4.2 创建变量
vim roles/motd/vars/main.yml # 追加一行
admin: zzg@tedu.cn
4.3 创建任务
vim roles/motd/tasks/main.yml # 追加
- name: modify motd
template:
src: motd # 这里的文件,自动到templates目录下查找
dest: /etc/motd
5. 创建playbook,调用motd角色
vim role_motd.yml
---
- name: modify motd with role
hosts: webservers
roles:
- motd
6. 执行playbook
ansible-playbook role_motd.yml
创建名为pkgs的角色。用于装包。包名使用变量pkg代表
创建inst_nginx.yml,调用pkgs角色,安装nginx
创建inst_mysql.yml,调用pkgs角色,安装mysql
# 1. 创建名为pkgs的角色。
# 1.1 创建角色目录
ansible-galaxy init roles/pkgs
# 1.2 创建装包的任务,包名使用变量pkg代表
vim roles/pkgs/tasks/main.yml
---
# tasks file for roles/pkgs
- name: install rpm pkg
yum:
name: "{{pkg}}"
state: present
# 1.3 定义变量
vim roles/pkgs/defaults/main.yml
---
# defaults file for roles/pkgs
pkg: nginx
# 2. 创建inst_nginx.yml,调用pkgs角色,安装nginx
vim inst_nginx.yml
---
- name: install nginx pkg
hosts: webservers
roles:
- pkgs
ansible-playbook inst_nginx.yml
# 3. 创建inst_mysql.yml,调用pkgs角色,安装mysql-server
vim inst_mysql.yml
---
- name: install mysql pkg
hosts: dbs
vars:
pkg: mysql-server
roles:
- pkgs
创建inst_nginx.yml,调用pkgs角色,安装nginx
创建inst_mysql.yml,调用pkgs角色,安装mysql
# 1. 创建名为pkgs的角色。
# 1.1 创建角色目录
ansible-galaxy init roles/pkgs
# 1.2 创建装包的任务,包名使用变量pkg代表
vim roles/pkgs/tasks/main.yml
---
# tasks file for roles/pkgs
- name: install rpm pkg
yum:
name: "{{pkg}}"
state: present
# 1.3 定义变量
vim roles/pkgs/defaults/main.yml
---
# defaults file for roles/pkgs
pkg: nginx
# 2. 创建inst_nginx.yml,调用pkgs角色,安装nginx
vim inst_nginx.yml
---
- name: install nginx pkg
hosts: webservers
roles:
- pkgs
ansible-playbook inst_nginx.yml
# 3. 创建inst_mysql.yml,调用pkgs角色,安装mysql-server
vim inst_mysql.yml
---
- name: install mysql pkg
hosts: dbs
vars:
pkg: mysql-server
roles:
- pkgs
Role目录结构说明如下:
tasks/:包含Role的主要任务列表,通常是一个名为main.yml的文件。
handlers/:包含Role的handlers列表,通常是一个名为main.yml的文件。
files/:包含Role使用的文件。
templates/:包含Role使用的模板文件。
vars/:包含Role使用的变量文件。
defaults/:包含Role的默认变量文件。
meta/:包含Role的元数据,包括Role的作者、依赖关系等。
tests/:包含Role的测试用例。
以上是Role目录结构的基本要素,可以根据实际情况进行调整和扩展。
tasks/:包含Role的主要任务列表,通常是一个名为main.yml的文件。
handlers/:包含Role的handlers列表,通常是一个名为main.yml的文件。
files/:包含Role使用的文件。
templates/:包含Role使用的模板文件。
vars/:包含Role使用的变量文件。
defaults/:包含Role的默认变量文件。
meta/:包含Role的元数据,包括Role的作者、依赖关系等。
tests/:包含Role的测试用例。
以上是Role目录结构的基本要素,可以根据实际情况进行调整和扩展。
加解密文件
ansible-vault命令
ansible-vault命令
ansible-vault encrypt 文件名 加密文件
ansible-vault decrypt 文件名 解密文件
ansible-vault rekey 文件名 重置密码
ansible-vault view 文件名 不解密查看文件
ansible-vault decrypt 文件名 解密文件
ansible-vault rekey 文件名 重置密码
ansible-vault view 文件名 不解密查看文件
使用密码文件进行加解密:
echo '密码' > pass.txt
echo '内容' > data.txt
ansible-vault encrypt --vault-id=pass.txt data.txt 用文件加密文件
ansible-vault decrypt --vault-id=pass.txt data.txt 解密
echo '密码' > pass.txt
echo '内容' > data.txt
ansible-vault encrypt --vault-id=pass.txt data.txt 用文件加密文件
ansible-vault decrypt --vault-id=pass.txt data.txt 解密
使用ansible管理远程主机,加密执行文件,执行playbook时,通过--ask-vault-password选项提示输入密码
ansible-vault encrypt 文件名 加密文件
ansible-playbook --ask-vault-password 文件名 用密码执行文件,此时没有解密,解密还需用decrypt
ansible-vault encrypt 文件名 加密文件
ansible-playbook --ask-vault-password 文件名 用密码执行文件,此时没有解密,解密还需用decrypt
sudo命令:
一般用于普通用户执行需要root权限的命令
在web1上配置zhangsan拥有sudo权限
一般用于普通用户执行需要root权限的命令
在web1上配置zhangsan拥有sudo权限
web1:
visudo # 将会打开vi,在尾部追加以下一行
zhangsan ALL=(ALL) ALL
或者单个允许:
Cmnd_Alias USERS=/usr/sbin/useradd,/usr/bin/passwd
zhangsan ALL=(ALL) USERS
visudo # 在最后追加一行 # 配置lisi不输入密码可以直接运行sudo
lisi ALL=(ALL) NOPASSWD: ALL
visudo # 将会打开vi,在尾部追加以下一行
zhangsan ALL=(ALL) ALL
或者单个允许:
Cmnd_Alias USERS=/usr/sbin/useradd,/usr/bin/passwd
zhangsan ALL=(ALL) USERS
visudo # 在最后追加一行 # 配置lisi不输入密码可以直接运行sudo
lisi ALL=(ALL) NOPASSWD: ALL
特殊的主机清单变量
如果远程主机没有使用免密登陆,如果远程主机ssh不是标准的22端口,
可以设置特殊的主机清单变量
ansible_ssh_user:指定登陆远程主机的用户名
ansible_ssh_pass:指定登陆远程主机的密码
ansible_ssh_port:指定登陆远程主机的端口号
如果远程主机没有使用免密登陆,如果远程主机ssh不是标准的22端口,
可以设置特殊的主机清单变量
ansible_ssh_user:指定登陆远程主机的用户名
ansible_ssh_pass:指定登陆远程主机的密码
ansible_ssh_port:指定登陆远程主机的端口号
ansible all -m file -a "path=/root/.ssh/authorized_keys state=absent"
# 删除远程主机的/root/.ssh/authorized_keys,以便恢复通过密码登陆
mkdir myansible # 创建新的工作目录
cd myansible
vim ansible.cfg
[defaults]
inventory = inventory
vim inventory
[group1]
web1
web2
db1
# 修改web1 ssh服务的端口为220
systemctl stop firewalld
echo 'Port 220' >> /etc/ssh/sshd_config
systemctl restart sshd
ssh -p220 192.168.88.11 # 退出再登陆时,需要指定端口号
# 配置ssh通过用户名、密码管理远程主机,通过220端口连接web1
vim inventory
[group1]
web1 ansible_ssh_user=root ansible_ssh_pass=a ansible_ssh_port=220
web2 ansible_ssh_user=root ansible_ssh_pass=a
db1 ansible_ssh_user=root ansible_ssh_pass=a
# 删除远程主机的/root/.ssh/authorized_keys,以便恢复通过密码登陆
mkdir myansible # 创建新的工作目录
cd myansible
vim ansible.cfg
[defaults]
inventory = inventory
vim inventory
[group1]
web1
web2
db1
# 修改web1 ssh服务的端口为220
systemctl stop firewalld
echo 'Port 220' >> /etc/ssh/sshd_config
systemctl restart sshd
ssh -p220 192.168.88.11 # 退出再登陆时,需要指定端口号
# 配置ssh通过用户名、密码管理远程主机,通过220端口连接web1
vim inventory
[group1]
web1 ansible_ssh_user=root ansible_ssh_pass=a ansible_ssh_port=220
web2 ansible_ssh_user=root ansible_ssh_pass=a
db1 ansible_ssh_user=root ansible_ssh_pass=a
0 条评论
下一页