Ansible

Ansible

什么是ansible?

Ansible 是一款自动化运维工具,用于配置管理、应用部署、任务自动化和 IT 编排。

安装

1、安装epel-release仓库

1
2
3
4
5
dnf -y install epel-release

dnf clean all

dnf makecache

2、安装ansible

1
dnf -y install ansible

3、设置免密

1
2
3
4
5
6
7
8
#生成密钥
ssh-keygen

#将密钥发往目标主机
ssh-copy-id 目标IP地址

#测试
ssh root@目标IP地址

4、编辑ansible主机清单文件,指定要管理那些主机

1
2
3
4
5
6
7
8
#编辑控制节点的hosts文件
vim /etc/hosts
#最后添加
子节点IP 主机名

vim /etc/ansible/hosts
#最后添加
子节点主机名

5、测试是否能通子节点

1
2
3
4
5
6
#已配置免密
ansible 子节点主机名 -m ping

#未配置免密
ansible 子节点主机名 -m ping -u 用户名 -k
#输入密码

主机清单

想要控制哪些子节点,需要在 /etc/ansible/hosts 文件中指定

1、指定子节点用户名和密码

1
主机名	absible_ssh_user='用户名'	ansible_ssh_pass='密码'

2、当ssh端口不是默认22时,就需要配置端口

1
ansible_ssh_port='端口号'

3、指定分组,操作组时组下的成员都会执行指令

1
2
3
4
[组名]
子节点1
子节点2
...

4、组变量,当组内变量的值过多重复,就可以把相同的值拎出来,作为组全局变量,定义一次组内成员可以使用,例如有十台子节点的用户名都是root,密码都是000

1
2
3
4
[组名:vars]
ansible_ssh_user='用户名'
ansible_ssh_pass='密码'
...

5、子分组,将多个组合并成一个大组

1
2
3
4
5
[子组名:children]
组名
组名
组名
...

Ad-Hoc点对点模式

拷贝模块

1、拷贝文件到子节点

1
2
3
4
ansiable 组名或主机名	-m -a 'src=要拷贝的文件路径 dest=子节点存放文件的路径 owner=所属用户 group=所属组 mode=读写执行权 backup=yes'

#解释 backup=yes
如果目标子节点有这个文件并且内容不同,它会将原来的文件备份,把新文件覆盖在指定目录

用户模块

1、创建用户

1
ansible 主机名或组名 -m user -a 'name=用户名 state=present'

2、设置密码

1
2
3
4
5
#生成加密密码,然后赋值
echo "明文密码" openssl passwd -1 -stdin

#设置密码
ansible 组名或主机名 -m user -a 'name=用户名 passwrd="粘贴上面复制的加密密码"'

软件包管理

常用选项

1
2
3
-m:指定模块
-a:传递参数
-b:使用sudo权限

1、安装语法

1
ansible 组名或用户名 -m dnf -a "name=要安装的软件包名 state=present" -b

2、卸载语法

1
ansible 组名或用户名 -m dnf -a "name="要卸载的软件包名 state=absent" -b

3、更新所有软件包

1
ansible 组名或用户名 -m dnf -a "name='*' state=latest" -b

4、批量安装

1
ansible 组名或用户名 -m dnf -a "name=['1','2','3'] state=present" -b

服务模块

1、启动服务

1
ansible 组名或用户名 -m service -a "name=服务名 state=started" -b

2、停止服务

1
ansible 组名或用户名 -m service -a "name=服务名 state=stopped" -b

3、重启服务

1
ansible 组名或用户名 -m service -a "name=服务名 state=restarted" -b

4、重载服务,不重启

1
ansible 组名或用户名 -m service -a "name=服务名 state=reloaded"  -b

5、查看服务

1
ansible 组名或用户名 -m service -a "name=服务名" -b

6、设置开机启动

1
ansible 组名或用户名 -m service -a "name=服务名 enabled=yes" -b

7、禁止开机自动

1
ansible 组名或用户名 -m service -a "name=服务名 enabled=no" -b

文件模块

1、创建

1
2
3
4
5
#创建文件
ansible 组名或用户名 -m file -a "path=存放路径 state=touch" -b

#创建目录
ansible 组名或用户名 -m file -a "path=存放路径 state=directory mode=权限" -b

2、删除

1
2
ansible 组名或用户名 -m fiel -a "path=文件路径 state=absent" -b
ansible 组名或用户名 -m fiel -a "path=目录路径 state=absent" -b

3、修改

1
2
3
4
5
#修改所有者
ansible all -m file -a "path=路径 owner=用户名 group=组名 mode=0权限" -b

#修改权限
ansible all -m file -a "path=路径 mode=0权限" -b

4、将文件拷贝到子节点

1
2
#可以有多个文件,空格隔开
ansible all -m copy -a "src=文件路径 dest=子节点存放路径 owner=所属用户 group=所属组 mode=0权限" -b

5、从子节点下载到本地

1
2
#flat=yes 不创建主机目录结构
ansible all -m fetch -a "src=本地存放路径 dest=子节点存放路径 flat=yes" -b

6、修改文件内容

1
2
3
4
5
#覆盖
ansible all -m copy -a "content='内容' dest=文件路径" -b

#追加
ansible all -m lineinfile -a "path=文件路径 line='要追加的内容'" -b

收集子节点信息模块

1、查看子节点主机民

1
ansible all -m setup -a "filter=ansible_hostname"

2、查看IP地址

1
ansible all -m setup -a "filter=ansible_default_ipv4"

3、查看CUP信息

1
ansible all -m setup -a "filter=ansible_processor*"

4、查看内存信息

1
ansible all -m setup -a "filter=ansible_memory_mb"

5、查看磁盘信息

1
ansible all -m setup -a "filter=ansible_mounts"

6、查看操作系统版本

1
ansible all -m setup -a "filter=ansible_distribution*"

script脚本模块

1、将本地脚本传输到子节点主机运行

1
2
3
ansible 组名或用户名 -m script -a "脚本路径" -b
#带参
ansible 组名或用户名 -m script -a "脚本路径 参数1 参数2" -b

2、执行子节点已有脚本

1
ansible 组名或用户名 -m shell -a "脚本路径" -b

shell模块

远程执行Linux命令

1
2
#多个命令用 ; 隔开
ansible 组名或用户名 -m shell -a "Linux命令" -b

YAML剧本编写

语法格式

1
2
3
4
5
6
7
8
9
10
11
- hosts: 要执行剧本的子主机
tasks:
- name: 任务描述信息
模块: 要执行的命令
notity: 上面执行命令后,修改内容后执行名称
handlers:
- name: notity里定义的名称
模块: 要执行的命令

#notity和handlers解释
notity和handlers在第一次和内容没有发生改变时是不会执行的,只有内容发生了改变才会调用,例如:服务修改了端口号,子节点的配置文件里的端口号会被修改,但是服务不会重启,修改了端口号后服务需要重启才会生效,这时就可以用到 notity和handlers来重启!

执行

1、检查yaml剧本是否有语法错误

1
ansible-playbook 剧本文件.yaml --syntax-chech

2、列出剧本中的任务

1
ansible-playbook 剧本文件.yaml --list-tasks

3、列出要执行的子主机

1
ansible-playbook 剧本文件.yaml --list-hosts

4、执行剧本

1
ansible-playbook 剧本文件.yaml

角色组织

将yaml剧本内容分开写,实现解耦合、代码简洁、可复用。

标准角色结构

1
2
3
4
5
6
7
8
9
10
roles/
nginx/
├── tasks/
│ └── main.yml
├── handlers/
│ └── main.yml
├── templates/
│ └── nginx.conf.j2
└── vars/
└── main.yml

目录结构解释

roles:角色总目录名称

nginx:角色名称,什么服务用什么名称

tasks:定义任务

handlers:处理器,用于指定任务剧本里定义了 notity 的任务

templates:Jinja2模板文件,处理ansible内置变量和用户自定义变量

vars:决定自定义变量

main.yaml:主剧本,指定哪些子节点执行