文章目录
1.Anaible的部署
1.1 实验说明
准备三台虚拟机,并且让虚拟机能上网
主机 | 角色 | ip |
---|---|---|
server1 | ansible服务端 | 172.25.3.1 |
server2 | ansible客户端 | 172.25.3.2 |
server3 | ansible客户端 | 172.25.3.3 |
1.2 基础配置
在server1:
(1)搭建国内镜像yum源
[root@server1 yum.repos.d]# vi lin.repo
[rhel7] ##本地镜像,安装ansible需要安装python
name=rhel7
baseurl=http://172.25.254.3/rhel7.3/
gpgcheck=0
[epel]
name=epel
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64
gpgcheck=0
(2)下载ansible
[root@server1 ~]# yum install -y ansible
(3)配置ansible服务:
[root@server1 ansible]# pwd ##ansible配置文件
/etc/ansible
[root@server1 ansible]# ls
ansible.cfg ##全局配置文件 hosts roles
[root@server1 ~]# cd /etc/ansible/
[root@server1 ansible]# ls
ansible.cfg hosts roles
[root@server1 ansible]# vi hosts ##编写全局变量文件,让server2,server3做ansible的客户端
45 [test]
46 172.25.3.2
47 172.25.3.3
##不需要重启服务之类的,ansible是一个工具
模块基础测试:
- ping模块测试连通性
[root@server1 ansible]# ansible test -m ping ##连接失败,因为没有输入密码
[root@server1 ansible]# ansible test -m ping -k ##连接成功,-k 输入密码参数
[root@server1 ansible]# ansible test -a hostname -k
SSH password:
172.25.3.2 | CHANGED | rc=0 >>
server2
172.25.3.3 | CHANGED | rc=0 >>
server3
- comand模块测试命令
[root@server1 ansible]# ansible test -a df -k
SSH password:
172.25.3.3 | CHANGED | rc=0 >>
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rhel-root 17811456 1090796 16720660 7% /
devtmpfs 497292 0 497292 0% /dev
tmpfs 508264 0 508264 0% /dev/shm
tmpfs 508264 6764 501500 2% /run
tmpfs 508264 0 508264 0% /sys/fs/cgroup
/dev/sda1 1038336 141512 896824 14% /boot
tmpfs 101656 0 101656 0% /run/user/0
172.25.3.2 | CHANGED | rc=0 >>
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rhel-root 17811456 1090904 16720552 7% /
devtmpfs 497292 0 497292 0% /dev
tmpfs 508264 0 508264 0% /dev/shm
tmpfs 508264 6764 501500 2% /run
tmpfs 508264 0 508264 0% /sys/fs/cgroup
/dev/sda1 1038336 141512 896824 14% /boot
tmpfs 101656 0 101656 0% /run/user/0
1.3 全平台一致配置
试想我们用超级用户来只加入ansible管理,则ansible服务端必定需要客户端的超户密码,这并不安全,所以我门一般情况下建立devops用户来参与ansible的管理
- 建立相同的用户
[root@server1 ~]# useradd devops
[root@server2 ~]# useradd devops
[root@server2 ~]# echo westos | passwd devops --stdin
[root@server3 ~]# useradd devops
[root@server3 ~]# echo westos | passwd devops --stdin
- 安全方便起见,服务器间做免密 ,客户端作加密
[devops@server1 ~]$ ssh-keygen
[devops@server1 ~]$ ssh-copy-id server2
[devops@server1 ~]$ ssh-copy-id server3
## 客户端可用 passwd -l devops 命令做拒绝ssh连接
- 对devops用户授权
## 三台server都做 全平台一致
[root@server2 ~]# visudo ##visudo 有语法监测
92 devops ALL=(ALL) NOPASSWD: ALL
visudo: /etc/sudoers.tmp unchanged
devops用户测试:
执行命令时需要使用sudo给 devops用户权限,所以执行命令时需要加 -b 参数 ;若不想加参数,可以修改配置文件,使其默认使用sudo
- 在devops用户的家目录建立配置文件并配置
[devops@server1 ~]$ pwd
/home/devops
[devops@server1 ~]$ mkdir ansible
[devops@server1 ~]$ ls
ansible
[devops@server1 ansible]$ ls
ansible.cfg hosts
[devops@server1 ansible]$ cat ansible.cfg ##仿照默认配置文件编写
[defaults] ##默认识别组
inventory = ./hosts ##识别当前目录下的hosts文件
[privilege_escalation] ##使用visudo
become=True
become_method=sudo
become_user=root
become_ask_pass=False
[devops@server1 ansible]$ cat hosts ##ansible客户端组
[test]
172.25.3.2
172.25.3.3
测试:
2. ansible 配置文件
2.1 Inventory文件配置
-
Inventory是ansible管理主机信息的配置文件,相当于系统的hosts文件的功能,默认存放在/etc/ansible/hosts
-
主机和组的定义
[ ]中括号表示一个组,也可以表示一个范围
一个栗子:
[weberver] ##webserver组
www[1:10].example.com ##表示主机www1.example.com到主机www10.example.com中所有的主机
db-[a:f].example.com ##表示dba.example.com到dbf.example.com中所有主机
- 个性化定义主机变量
在playbook中使用时对主机进行个性化定制
[webserver]
web1 http_port=8080 maxRequestsPerChild=1024```
定义组变量
[webserver]
server2
server3
[webserver:vars]
ntp_server=time1.aliyun.com
webserver组中的所有主机ntp_server值为time1.aliyun.com
- 嵌套定义组
2.2 ansible中的变量配置
变量可以定义在
- (1)inventory配置文件中
- (2)playbook中vars块中
- (3)roles角色中的vars目录下
- (4)roles角色同级目录的group_vars和hosts_vars目录下
##为了方便维护,在配置变量时尽量沿用一种配置方式定义
变量的设定规范:
- 在".j2"模板文件中变量使用
{{}}
括起来表示变量的设定
eg:
- 在inventory配置文件中或者在其他vars声明变量中,需要给括号带上" ",即:
"{{}}"
eg:
2.3 配置文件优先级
- ansible共有三个配置文件目录
(1)/etc/ansible
系统默认ansible配置目录
(2)/home/devops/.ansible
devops用户主目录下隐藏配置目录
(3)/home/devops/ansible
自建家目录配置目录 - 优先级
权限最大的是当前目录 其次是用户主目录 最后是全局配置文件
3. ansible中的ad-hoc命令
3.1 ad-hoc的使用场景
- Ansible提供两种方式完成任务:
(1)ad-hoc命令
(2)ansible-playbook(剧本) - ad-doc更注重解决一些简单或者平时工作中遇到的任务,相当于LInux系统命令下的shell命令,后者更适合于解决复杂或者固化下来的任务,相当于Linux中的Shell Scripts
- 使用场景:
(1) 关闭所有不必要的服务器
(2)临时更新Apache或Nginx的配置文件
3.2 ansible常用命令参数
ansible --help 查看命令参数帮助
参数 | 作用 |
---|---|
-m | 匹配模块 ##默认为command模块 |
-a | 模块匹配参数 |
-u | 指定ssh连接用户 ##默认连接root |
-b | 使用sudo |
-k | 提示输入ssh登录密码,当使用密码验证的时候用 |
-C | 只是测试一下会改变什么内容,不会真正去执行 |
-f | fork多少进程并发处理,默认为5个 |
-i | 指定hosts文件路径,默认default=/etc/ansible/hosts |
-T | ssh连接超时时间,默认是10秒 |
-t | 日志输出到该目录,日志文件名以主机命名 |
-v | 显示详细日志 |
Ansible命令示例:
- 以devops用户执行ping存活检测
ansible all -m ping -u devops
- 以devops sudo至root执行ping存活检测
ansible all -m ping -u devops -b
- 以devops sudo 至kiosk用户执行ping存活检测
ansible all -m ping -u devops -b --become-user kiosk
3.3 ansible与正则
- 匹配所有主机(all或*功能相同)
ansible all -m ping
ansible “*” -m ping
- 对多台主机或多个组同时执行(相互之间用:分隔即可)
ansible "web2:web1" -m ping
- 在web2组但不在web1组的主机(用!表示)
ansible 'web2:!web1' -m ping
- 在webserver组和database组中同时存在的主机(用&符号表示)
ansible 'test:&web1' -m ping
- 模糊匹配(*)
ansible '172.25.3.*' -m ping
3.4 ansible命令内部执行流程
在服务端执行ad-hoc命令实质上是发送给客户端,在客户端执行,再将执行结果返回给服务端;服务端只是接收并将接收结果显示给操作人员
3.5 ansible-doc的用法
-
ansible的模块非常之多,ansible也提供了类似于man功能的help说明工具ansible-doc;主要用于获取不同模块帮助
-
可用于显示所有可用模块
ansible-doc -l
-
获取xxx模块的帮助
ansible-doc xxx
[devops@server1 ansible]$ ansible-doc -l | wc -l
[WARNING]: win_template parsing did not produce documentation.
[WARNING]: template parsing did not produce documentation.
3387