知识了解:
Ansible 是给 Linux 系统管理员使用的出色自动化工具。它是一种开源配置工具,能让系统管理员可以从一个中心节点(即 Ansible 服务器)管理数百台服务器。将 Ansible 与 Puppet、Chef 和 Salt 等类似工具进行比较时,它是首选的配置工具,因为它不需要任何代理,并且可以工作在 SSH 和 python 上。
在本教程中,我们将学习如何在 CentOS 8 系统上安装 Ansible。
ansible安装:
一、ansible用法
ansible通过ssh实现配置管理、应用部署、任务执行等功能。
语法:
ansible <host-patten> [-m module_name] [-a args]
选项 | 说明 |
--version | 显示版本 |
-m module | 指定模块,默认为command,可以通过修改配置文件进行修改 |
-v | 显示详细过程 -vv -vvv可以显示更加详细的内容 |
--list-hosts | 显示主机列表,可以缩写--list |
-k | 提示输入ssh连接密码,默认KEY验证 |
-C | 检查不执行 |
-T,--timeout=TIMEOUT | 执行命令的超时时长 |
-u,--user=REMOTE_USER | 指定远程执行的用户 |
-b,--become | 代替旧版的sudo其替换 |
--become-user=USERNAME | 指定sudo的runas用户,默认为root |
-K,--ask-become-pass | 提示输入sudo时的口令 |
二、ansible模块
1.ping模块
ping 用来测试主机的连通性
查看ping模块用法,-s可以简单的查看简单相关用法
ansible-doc -s ping
测试主机的连通性
ansible webserver -m ping
2.shell模块
shell模块用于执行shell命令
查看shell用法
ansible-doc -s shell
1.使用shell来修改用户口令
ansible webserver -m shell -a 'echo 123456 |passwd --stdin cib'
Ps:cib是192.168.137.134和192.168.137.135的普通用户名
2.在shell模块中使用变量时参数需要使用单引号,若使用双引号则变量指向的是本机的值
在192.168.137.134设置临时环境变量
export HOSTNAME="LINUX系统环境变量设置"
ansible webserver -m shell -a 'echo $HOSTNAME'
ansible webserver -m shell -a "echo $HOSTNAME"
1.shell重定向
ansible webserver -m shell -a 'dp=/root echo 欢迎来到英雄联盟 > test.log'
ansible webserver -m shell -a 'dp=/root cat test.log'
2.sed对文件进行修改
ansible webserver -m shell -a 'sed -i "s/欢迎来到英雄联盟/提莫队长正在送 命/" /root/test.log'
验证是否修改成功
ansible webserver -m shell -a 'cat /root/test.log'
警告不用管
3.script模块
script 模块是在远程主机上运行ansible服务器上的脚本
写个helloword.sh
vim helloword.sh
赋权
chmod 775 helloword.sh
执行
ansible webserver -m script -a '/root/helloword.sh'
4.copy模块
copy 从主控端复制文件到远程主机
参数 | 说明 |
src | 本机的源文件位置 |
dest | 目标主机存放文件位置 |
owner | 修改属主 |
group | 修改属组 |
mode | 修改权限 |
backup | 备份,copy时文件若是存在会直接覆盖 |
content | 指定生成文件的内容 |
1.复制本机文件到远程主机,并修改属主,修改权限
ansible webserver -m copy -a 'src=/root/helloword.sh dest=/home/cib owner=cib mode=755 backup=yes'
(ansible命令执行两次命令会显示成功绿绿的哦)
验证
在192.168.137.135从机上
2.使用content直接生成文件
ansible webserver -m copy -a 'content="欢迎来到英雄联盟\n提莫队长正在送命\n" dest=/root/test1'
验证
5.fetch模块
fetch 从远程主机提取文件至主控端,只能提取文件,若要提取目录可以将目录先打包
参数 | 说明 |
dest | 在主控端存放文件的位置 |
src | 远程主机所要提取的文件 |
将远程/etc/目录抓取至本地的/data
ansible webserver -m fetch -a'dest=/data src=/etc/fstab'
验证
6.File模块
File模块可以设置文件的属性
参数 | 说明 |
access_time | 访问时间 |
access_time_format | 时间格式 |
attributes | attr格式 |
force | 当软连接的源文件不存在时使用 |
group | 设置文件的属组 |
mode | 设置文件的权限 |
modification_time | 文件修改时间 |
modification_time_format | 文件修改时间格式 |
owner | 设置文件的属主 |
path | 被管理的文件路径 |
src | 指定软硬链接的源文件位置 |
state | 设置文件的类型,file:文件不存在时不会被创建,link:创建软连接,hard:创建硬连接,absent:删除文件,touch:创建空文件 |
1.修改文件的属主,权限
ansible webserver -m file -a 'path=/root/test1 owner=cib mode=755'
验证
2.创建硬连接,state=hard
ansible webserver -m file -a 'src=/root/test1 name=/root/test1.log state=hard'
验证
2.创建软连接,state=link
ansible webserver -m file -a 'src=/root/test1 name=/root/123 state=link'
验证
7.hostname 模块
hostname 管理主机名
参数 | 说明 |
name | 设置主机名 |
修改主机名
ansible webserver -m hostname -a 'name=dp'
验证
8.cron 模块
corn 计划任务模块
参数 | 说明 |
backup | 在计划任务创建前先备份 |
day | 天 |
hour | 小时 |
minute | 分钟 |
month | 月 |
weekday | 星期 |
name | 计划任务的名称 |
reboot | 重启后执行 |
state | absent:删除 |
job | 计划任务的内容 |
disabled | 启用和禁用 |
1.创建计划任务,每天1点备份/etc/目录
ansible webserver -m cron -a 'name=backupetc hour=1 job="/usr/bin/cp -a /etc /data/`date +%F`"'
验证
2.计划任务的禁用,disabled=true
ansible webserver -m cron -a 'name=backupetc day=* hour=1 job="/usr/bin/cp -a /etc /data/`date +%F`" disabled=true'
验证
3.计划任务的启用,disabled=false
ansible webserver -m cron -a 'name=backupetc day=* hour=1 job="/usr/bin/cp -a /etc /data/`date +%F`" disabled=false'
验证
4.删除计划任务,state=absent
ansible webserver -m cron -a 'name=backupetc day=* hour=1 job="/usr/bin/cp -a /etc /data/`date +%F`" state=absent'
验证
9.yum 模块
yum 包管理
参数 | 说明 |
name | 包的名字 |
state | present:安装(可缺省),absent:卸载 |
安装lrzsz
ansible webserver -m yum -a 'name=lrzsz'
卸载lrzsz
ansible webserver -m yum -a 'name=lrzsz state=absent'
10.service 模块
service 用来管理服务
参数 | 说明 |
enabled | 是否开机启动 |
name | 服务名称 |
runlevel | 运行在哪个级别上 |
state | started:启动,stopped:停止,reloaded:重读配置文件,restarted:重启服务 |
启动httpd服务
ansible webserver -m service -a 'name=httpd state=started'
验证
11.user 模块
user 用户管理模块
参数 | 说明 |
name | 指定用户名 |
system | 系统用户 |
create_home | 创建家目录 |
shell | 指定shell类型 |
group | 指定主组 |
groups | 指定附加组 |
remove | 删除用户是删除家目录 |
state | absent:删除用户 |
uid | 指定Uid号 |
1.创建mysql用户,为系统用户,shell类型为/sbin/nologin
ansible webserver -m user -a 'name=mysql system=yes shell=/sbin/nologin'
验证
2.删除账号,删除账号时需要带上remove参数,默认不会删除用户的家目录
ansible webserver -m user -a 'name=mysql remove=yes state=absent'
三、ansible-console
ansible-console为可交互的ansible工具
#all:为当前的所有主机,切换组可以使用cd + 组名 的方式
#2:主机数
#f:5 并行执行数,设置并发数 fork + NUM
四、ansible的playbook
ansible playbook 为ansible的脚本,其是由yaml语言构成,这种语言对格式的要求非常高。
1.yaml语言格式要求
1.在单一档案中,可以用连续三个连字号(---)区分多个档案,另外,还有选择性的连续三个点号_(...)来表示档案的结尾
2.此行开始正常写playbook的内容,一般建议写明该playbook的功能
3.使用#注释代码
4.缩进必须统一的,不能空格和tab混用
5.缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
6.YAML文件内容是区分大小写的,k/v的值均需大小写敏感
7.多个k/v可以同行写也可以换行写,同行使用,分割
8.v可以是个字符串,也可以是另一个列表
9.一个完整的代码块功能需最少元素包括name和task
10.一个name只能包括一个task
11.YAML文件扩展名通常为yaml或yml
1.playbook写hello world
vim hello.yaml
- hosts: webserver
remote_user: root
tasks:
- name: hello world
shell: /usr/bin/wall hello world
检测是否存在语法错误
ansible-playbook -C hello.yaml
执行
ansible-playbook hello.yaml
2.Playbook 卸载并安装httpd
准备httpd.yml剧本
vim httpd.yml
- hosts: webserver
remote_user: root
tasks:
- name: remove
yum: name=httpd
- name: install
yum: name=httpd
检测是否存在语法错误
ansible-playbook -C httpd.yml
执行
ansible-playbook httpd.yml
3.创建mysql用户
准备剧本
vim user.yml
- hosts: webserver
remote_user: root
tasks:
- name: create group
group: name=mysql gid=3306
- name: create user
user: name=mysql uid=3306 shell=/sbin/nologlin system=yes group=mysql create_home=no
检测是否存在语法错误
ansible-playbook -C user.yml
执行
ansible-playbook user.yml
验证mysql用户是否创建成功(两种方法都可以)
2.playbook中的变量
变量命名规则:仅能由字母、数字和下划线组成,且只能以字母开头
1.ansible setup facts 远程主机的所有变量都可直接调用
此命令可以查看远程主机上所有已存在的各种变量,此处查看hostname的变量名
ansible webserver -m setup -a 'filter=*hostname'
准备剧本
vim var.yaml
- hosts: webserver
remote_user: root
tasks:
- name: file
file: name={{ansible_hostname}}.log state=touch
执行
ansible-playbook var.yaml
验证
ansible webserver -a 'ls /root'
2.变量可以定义在主机清单中
主机清单中的变量分为两种,普通变量和公共变量
普通变量:主机组中主机单独定义,优先级高于公共变量
公共变量:针对主机组中所有主机定义的统一变量
修改主机清单
vim /etc/ansible/hosts
[webserver]
192.168.137.134 port=80
192.168.137.135 port=8080
[webserver:vars]
mark="-"
准备剧本
vim var2.yaml
- hosts: webserver
remote_user: root
tasks:
- name: file
file: name={{ansible_hostname}}{{mark}}{{port}}.log state=touch
执行
ansible-playbook var2.yaml
验证
ansible webserver -a 'ls /root'
3.变量可以通过-e来定义 依旧使用刚才的剧本,直接在命令行添加-e选项
ansible-playbook -e port=1234 var2.yaml
验证
ansible webserver -a 'ls /root'
由此可以发现,通过命令行指定的变量优先级高于主机文件中定义的变量
4.在剧本中定义变量
vars:
-var1:value1
-var2:value2
示例:
在playbook中添加变量
准备剧本
vim var3.yaml
- hosts: webserver
remote_user: root
vars:
- port: 4321
tasks:
- name: file
file: name={{ansible_hostname}}{{mark}}{{port}}.log state=touch
执行
ansible-playbook var3.yaml
验证
ansible webserver -a 'ls /root'
5.变量定义在一个专用的变量文件中
创建一个存放变量的文件
vim vars.yml
port: 888
准备剧本
vim var4.yaml
- hosts: webserver
remote_user: root
vars_files:
- vars.yml
vars:
- port: 4321
tasks:
- name: file
file: name={{ansible_hostname}}{{mark}}{{port}}.log state=touch
执行
ansible-playbook var4.yaml
验证
ansible webserver -a 'ls /root'
由此可见使用变量文件定义的变量优先级高于playbook中定义的变量
变量优先级的总结:
命令-e指定 > 变量文件 > playbook指定 > hosts文件
3.ansible的模板template
template可以根据模块文件动态生成相对应的配置文件。
template对文件的存放和命名有要求,template文件必须存放在templates目录下,并且以.j2后缀命名。
yaml文件需要和templates目录平级,目录结构如下。
为主机列表中的主机安装nginx
准备剧本
vim nginx.yml
- hosts: webserver
remote_user: root
tasks:
- name: install
yum: name=nginx
- name: service
service: name=nginx state=started enabled=yes
执行
ansible-playbook nginx.yml
用模板文件实现cpu个数+2的进程数
1.获取nginx的配置文件,并改名为.j2后缀的文件存放在templates目录下
cp /etc/nginx/nginx.conf /root/yml/templates/nginx.conf.j2
获取cpu个数的变量
ansible 192.168.137.134 -m setup | grep cpu
修改模板文件
vim nginx.conf.j2
因为之前安装过nginx,所以要先卸载
ansible webserver -m yum -a'name=nginx state=absent'
执行
ansible-playbook nginx2.yml
验证
ansible webserver -a 'cat /etc/nginx/nginx.conf | grep work'
2.修改模板中的端口
vim ./templates/nginx.conf.j2
修改主机文件定义port
vim /etc/ansible/hosts
[webserver]
192.168.137.134 port=80
192.168.137.135 port=8080
[webserver:vars]
mark="-"
~
重新执行
先卸载
ansible webserver -m yum -a'name=nginx state=absent'
ansible-playbook nginx2.yml
验证
ansible webserver -a 'ss -tnl |grep 80'
完成!!!