主机名 | IP地址 | 角色 |
---|---|---|
web1 | 192.168.88.11 | 被控制节点(webserver) |
web2 | 192.168.88.12 | 被控制节点(webserver) |
db1 | 192.168.88.13 | 被控制节点(database) |
pubserver | 192.168.88.240 | 控制节点(manager) |
# 创建3台主机并配置IP地址。pubserver不需要单独准备,继续使用之前课程中的192.168.88.240。
[root@myhost ~]# vm clone web{1,2} db1
[root@myhost ~]# vm setip web1 192.168.88.11
[root@myhost ~]# vm setip web2 192.168.88.12
[root@myhost ~]# vm setip db1 192.168.88.13
# 在192.168.88.240上配置yum源
# 将/linux-soft/s2/目录下的ansible目录中rpm包拷贝到yum服务器的rpms目录
[root@myhost ~]# scp /linux-soft/s2/zzg/ansible_soft/* 192.168.88.240:/var/ftp/rpms
# 更新yum服务器仓库源
[root@pubserver ~]# createrepo /var/ftp/rpms/
# 4台主机的yum全为以下配置
[root@pubserver ~]# vim /etc/yum.repos.d/local.repo
[BaseOS]
name = BaseOS
baseurl = ftp://192.168.88.240/dvd/BaseOS
enabled = 1
gpgcheck = 0
[AppStream]
name = AppStream
baseurl = ftp://192.168.88.240/dvd/AppStream
enabled = 1
gpgcheck = 0
[rpms]
name = rpms
baseurl = ftp://192.168.88.240/rpms
enabled = 1
gpgcheck = 0
[root@pubserver ~]# yum install -y ansible
配置控制节点pubserver,具体要求如下:
# 配置名称解析
[root@pubserver ~]# echo -e "192.168.88.240\tpubserver" >> /etc/hosts
[root@pubserver ~]# for i in 1 2
> do
> echo -e "192.168.88.1$i\tweb$i" >> /etc/hosts
> done
[root@pubserver ~]# echo -e "192.168.88.13\tdb1" >> /etc/hosts
[root@pubserver ~]# tail -4 /etc/hosts
192.168.88.240 pubserver
192.168.88.11 web1
192.168.88.12 web2
192.168.88.13 db1
# 配置免密登陆
[root@pubserver ~]# ssh-keygen # 三个问题都直接回车,使用默认值
# 执行以下命令时,可能需要回答yes和远程用户的密码,请按提示操作
[root@pubserver ~]# for i in web{1..2} db1
> do
> ssh-copy-id $i
> done
# 创建ansible工作目录,目录名自己定义,不是固定的。
[root@pubserver ~]# mkdir ansible
[root@pubserver ~]# cd ansible
# 创建配置文件。默认的配置文件是/etc/ansible/ansible.cfg,但是一般不使用它,而是在工作目录下创建自己的配置文件
[root@pubserver ansible]# vim ansible.cfg # 文件名必须是ansible.cfg
[defaults]
host_key_checking = false # 不检查主机密钥,=号两边空格可有可无。
inventory = inventory # 定义主机清单文件为当前目录的inventory
# 创建主机清单文件。写在[]里的是组名,[]下面的是组内的主机名
[root@pubserver ansible]# vim inventory
[webservers]
web[1:2] # web1和web2的简化写法,表示从1到2
[dbs]
db1
# cluster是组名,自定义的;:children是固定写法,表示下面的组名是cluster的子组。
[cluster:children]
webservers
dbs
# 查看被管理的所有的主机。注意,一定在工作目录下执行命令。
[root@pubserver ansible]# ansible all --list-hosts
hosts (3):
web1
web2
db1
# 查看webservers组中所有的主机
[root@pubserver ansible]# ansible webservers --list-hosts
hosts (2):
web1
web2
ansible进行远程管理的两个方法:
无论哪种方式,都是通过模块加参数进行管理。
ansible 主机或组列表 -m 模块 -a "参数" # -a是可选的
[root@pubserver ansible]# ansible all -m ping
# 该命令检查是否可以管理远程主机。如果结果为绿色的SUCCESS,则表示成功。
# 如果是红色的UNREACHABLE,则检查网络是否可通,是否已经可以免密登陆
# 列出全部可用模块,按空格键向下翻页,按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退出
[root@pubserver ansible]# ansible-doc yum
# 在所有被管主机上创建目录/tmp/demo
[root@pubserver ansible]# ansible all -a "mkdir /tmp/demo"
# 查看we1的ip地址
[root@pubserver ansible]# ansible web1 -a "ip a s"
[root@pubserver ansible]# ansible web1 -a "ip a s | head" # 报错
# 查看web1的ip地址,只显示前10行
[root@pubserver ansible]# ansible web1 -m shell -a "ip a s | head"
# 在控制端创建脚本即可
[root@pubserver ansible]# vim test.sh
#!/bin/bash
for user in user{1..5}
do
useradd $user
echo '123456' | passwd --stdin $user
done
# 在webservers组的主机上执行脚本
[root@pubserver ansible]# ansible webservers -m script -a "test.sh"
可以创建文件、目录、链接等,还可以修改权限、属性等
常用的选项:
# 查看使用帮助
[root@pubserver ansible]# 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中把各参数的冒号换成=号
# 在webservers组的主机上创建/tmp/file.txt
[root@pubserver ansible]# ansible webservers -m file -a "path=/tmp/file.txt state=touch" # touch是指如果文件不存在,则创建;如果存在则改变它的时间戳
# 在webservers组的主机上创建/tmp/demo目录
[root@pubserver ansible]# ansible webservers -m file -a "path=/tmp/demo state=directory"
# 将webservers组的主机上/tmp/file.txt的属主改为sshd,属组改为adm,权限改为0777
[root@pubserver ansible]# ansible webservers -m file -a "path=/tmp/file.txt owner=sshd group=adm mode='0777'"
[root@pubserver ansible]# ansible webservers -a "ls -l /tmp/file.txt"
# 删除webservers组的主机上/tmp/file.txt
[root@pubserver ansible]# ansible webservers -m file -a "path=/tmp/file.txt state=absent" # absent英文缺席的、不存在的
# 删除webservers组的主机上/tmp/demo
[root@pubserver ansible]# ansible webservers -m file -a "path=/tmp/demo state=absent"
# 在webservers组的主机上创建/etc/hosts的软链接,目标是/tmp/hosts.txt
[root@pubserver ansible]# ansible webservers -m file -a "src=/etc/hosts dest=/tmp/hosts.txt state=link"
用于将文件从控制端拷贝到被控端
常用选项:
[root@pubserver ansible]# echo "AAA" > a3.txt
# 将a3.txt拷贝到webservers主机的/root/
[root@pubserver ansible]# ansible webservers -m copy -a "src=a3.txt dest=/root/"
# 在目标主机上创建/tmp/mytest.txt,内容是Hello World
[root@pubserver ansible]# ansible webservers -m copy -a "content='Hello World' dest=/tmp/mytest.txt"
与copy模块相反,copy是上传,fetch是下载
常用选项:
# 将webservers主机上的/etc/hostname下载到本地用户的家目录下
[root@pubserver ansible]# ansible webservers -m fetch -a "src=/etc/hostname dest=~/"
[root@pubserver ansible]# ls /root/web1/etc/ # web1是webservers组中的主机
hostname
[root@pubserver ansible]# ls /root/web2/etc/
hostname
用于确保存目标文件中有某一行内容
常用选项:
# webservers组中的主机,/etc/issue中一定要有一行Hello World。如果该行不存在,则默认添加到文件结尾
[root@pubserver ansible]# ansible webservers -m lineinfile -a "path=/etc/issue line='Hello World'"
# webservers组中的主机,把/etc/issue中有Hello的行,替换成chi le ma
[root@pubserver ansible]# ansible webservers -m lineinfile -a "path=/etc/issue line='chi le ma' regexp='Hello'"
lineinfile会替换一行,replace可以替换关键词
常用选项:
# 把webservers组中主机上/etc/issue文件中的chi,替换成he
[root@pubserver ansible]# ansible webservers -m replace -a "path=/etc/issue regexp='chi' replace='he'"
# 在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777
[root@pubserver ansible]# ansible webservers -m file -a "path=/tmp/mydemo owner=adm group=adm mode='0777' state=directory"
# 将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600
[root@pubserver ansible]# ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/mydemo owner=adm group=adm mode='0600'"
# 替换目标主机/tmp/mydemo/hosts文件中的db1为database1
[root@pubserver ansible]# ansible webservers -m replace -a "path=/tmp/mydemo/hosts regexp='db1' replace='database1'"
# 将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录。
[root@pubserver ansible]# ansible webservers -m fetch -a "src=/tmp/mydemo/hosts dest=."
实现linux用户管理
常用选项:
# 在webservers组中的主机上,创建zhangsan用户
[root@pubserver ansible]# ansible webservers -m user -a "name=zhangsan"
# 在webservers组中的主机上,创建lisi用户。设置其uid为1010,主组是adm,附加组是daemon和root,家目录是/home/lisi
[root@pubserver ansible]# ansible webservers -m user -a "name=lisi uid=1010 group=adm groups=daemon,root home=/home/lisi"
# 设置zhangsan的密码是123456
# {{}}是固定格式,表示执行命令。password_hash是函数,sha512是加密算法,则password_hash函数将会把123456通过sha512加密变成zhangsan的密码
[root@pubserver ansible]# ansible webservers -m user -a "name=zhangsan password={{'123456'|password_hash('sha512')}}"
# 删除zhangsan用户,不删除家目录
[root@pubserver ansible]# ansible webservers -m user -a "name=zhangsan state=absent"
# 删除lisi用户,同时删除家目录
[root@pubserver ansible]# ansible webservers -m user -a "name=lisi state=absent remove=yes"
创建、删除组
常用选项:
# 在webservers组中的主机上创建名为devops的组
[root@pubserver ansible]# ansible webservers -m group -a "name=devops"
# 在webservers组中的主机上删除名为devops的组
[root@pubserver ansible]# ansible webservers -m group -a "name=devops state=absent"