准备三台虚拟机,并且让虚拟机能上网
主机 | 角色 | ip |
---|---|---|
server1 | ansible服务端 | 172.25.3.1 |
server2 | ansible客户端 | 172.25.3.2 |
server3 | ansible客户端 | 172.25.3.3 |
在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是一个工具
模块基础测试:
[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
[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
试想我们用超级用户来只加入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连接
## 三台server都做 全平台一致
[root@server2 ~]# visudo ##visudo 有语法监测
92 devops ALL=(ALL) NOPASSWD: ALL
visudo: /etc/sudoers.tmp unchanged
devops用户测试:
执行命令时需要使用sudo给 devops用户权限,所以执行命令时需要加 -b 参数 ;若不想加参数,可以修改配置文件,使其默认使用sudo
[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
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
变量可以定义在
##为了方便维护,在配置变量时尽量沿用一种配置方式定义
/etc/ansible
系统默认ansible配置目录/home/devops/.ansible
devops用户主目录下隐藏配置目录/home/devops/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 all -m ping -u devops
ansible all -m ping -u devops -b
ansible all -m ping -u devops -b --become-user kiosk
ansible all -m ping
ansible “*” -m ping
ansible "web2:web1" -m ping
ansible 'web2:!web1' -m ping
ansible 'test:&web1' -m ping
ansible '172.25.3.*' -m ping
在服务端执行ad-hoc命令实质上是发送给客户端,在客户端执行,再将执行结果返回给服务端;服务端只是接收并将接收结果显示给操作人员
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