1.Ansible基本概述
Ansible是一个IT自动化的配置管理工具,自动化主要体现在Ansible集成了丰富模块,丰富的功能组件,
可以通过一个命令行完成一系列的操作。进而能减少我们重复性的工作和维护成本,以提高工作的效率。
2.Ansible的功能
1)批量执行远程命令,可以对N多台主机同时进行命令的执行
2)批量配置软件服务,可以进行自动化的方式配置和管理服务。
3)实现软件开发功能,jumpserver底层使用ansble来实现的自动化管理0
4)编排高级的IT任务,Ansible的playbook是一门编程语言,可以用来描绘一套IT架构。
3.Ansible的特点
1.容易学习,无代理模式,不像saltstack既要学服务端又要学习客户端,还要学习服务端与客户端之间的通讯协议
2.操作灵活,体现在Ansible有较多的模块,提供了丰富的功能,playbook则提供了类似于编程语言的复杂功能
3.简单易用,体现在Ansible —个命令可以完成很多事情
4.安全可靠,因为Ansible使用了SSH协议进行通汛,既稳定又安全
5.可移植性高,可以将写好的playbook拷贝至任意机器进行执行
4.Ansible 基础架构
控制端 被控端 inventory ad-hoc playbook 连接协议
5.Ansible的安全配置
2.1.Ansible安装
外网地址 | 内网地址 | 角色 |
---|---|---|
10.0.0.61 | 172.16.1.61 | Ansible控制端 |
10.0.0.7 | 172.16.1.7 | Ansible被控端 |
10.0.0.8 | 172.16.1.8 | Ansible被控端 |
1.先安装epel源(提供最新的ansible)
[root@cheng ~]#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2.安装Ansible
1.通过yum进行安装
[root@manager ~]# yum install ansible -y
2.查看ansible的版本
[root@manager ~]# ansible --version
ansible 2.8.5
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Jun 20 2019, 20:27:34) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
3.ansible的配置文件,配置文件可以随意放,但有查找顺序
$ANSIBLE_CONFIG
ansible.cfg #当前目录下面查找
.ansible.cfg #当前用户的家目录下查找
/etc/ansible/ansible.cfg
[root@m01 ~]# cat /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口
host_key_checking = False #跳过检查主机指纹
log_path = /var/log/ansible.log #ansible日志
[privilege_escalation] #如果是普通用户则需要配置提权
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
4.ansible 优先级验证
[root@manager ~]# export
ANSIBLE_CONFIG="/tmp/ansible.cfg"
[root@manager ~]# touch /tmp/ansible.cfg
[root@manager ~]# mkdir /project1
[root@manager ~]# cd /project1/
[root@manager project1]# touch ansible.cfg
[root@manager project2]# ansible --version
ansible 2.8.5
config file = /project1/ansible.cfg
[root@manager /]# mkdir /project2
[root@manager /]# cd /project2/
[root@manager project2]# touch ansible.cfg
[root@manager project1]# ansible --version
ansible 2.8.5
config file = /project2/ansible.cfg
[root@manager tmp]# touch ~/.ansible.cfg
[root@manager tmp]# ansible --version
ansible 2.8.5
config file = /root/.ansible.cfg
6.Ansible Ineventory主机清单
1.场景一:基于ip+密码连接
[root@manager project1]# cat hosts
#方式一、主机+端口+密码
[webservers]
172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
172.16.1.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
#方式二、主机+端口+密码
[webservers]
web[1:2].cheng ansible_ssh_pass='123456'
#方式三、主机+端口+密码
[webservers]
web[1:2].cheng
[webservers:vars]
ansible_ssh_pass='123456'
2.场景二:基于密钥连接,需要先创建公钥和私钥,并下发公钥至被控端
1.先创建公钥和私钥
[root@manager project1]# ssh-keygen -C [email protected]
2.下发公钥至被控端
[root@manager ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub
[email protected]
[root@manager ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub
[email protected]
#方式一、主机+端口+密钥
[root@manager ~]# cat hosts
[webservers]
172.16.1.7
172.16.1.8
#方式二、别名+主机+端口+密钥
[webservers]
web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=22
web02 ansible_ssh_host=172.16.1.8 ansible_ssh_port=22
3.场景三:主机组使用方式
[lbservers] #定义lbservers组
172.16.1.5
172.16.1.6
[webservers] #定义webserver组
172.16.1.7
172.16.1.8
[servers:children] #定义servers组包括两个子组
[lbservers,webserver]
lbservers
webserver
[root@manager project1]# ansible webservers --list-hosts -i hosts
hosts (2):
172.16.1.7
172.16.1.8
PS:如果控制端和被控制端第一次通讯,需要先添加指纹信息,那如果机器特别多少的情况下怎么办?
仅需开启ansible中的 host_key_checking = False
7.Ansible Ad-Hoc
1.常用模块
command #执行命令 默认 不支持管道
shell #执行命令 支持管道
yum_reposity #yum仓库配置
yum #yum安装软件
get_url #和linux的wget一致
copy #拷贝配置文件
service|systemd #启动服务
user #属主
group #属组
file #创建目录 创建文件 递归授权
mount #挂载
cron #定时任务
firewalld #防火墙
selinux #selinux
2.使用过程中需要先了解ansible-doc帮助手册
[root@manager project1]# ansible-doc -l # 查看所有模块说明
[root@manager project1]# ansible-doc copy # 表示指定模块方法
[root@manager project1]# ansible-doc -s copy # 表示指定模块参数
3.command默认执行bash命令模块,模块不支持重定向或管道
ansible webservers -a "ps axu|grep nginx" -i hosts #不支持管道(简单命令)
4.shell模块,如果需要一些管道操作,则使用shell
ansible webservers -m shell -a "ps axu|grep nginx" -i hosts #支持管道
5.yum安装软件模块
yum:
state:
present 安装
absent 卸载
latest 最新
enablerepo #指定使用按个仓库
disablerepo #排除使用哪个仓库
1.安装最新的httpd服务
[root@manager project1]# ansible webservers -m yum -a "name=httpd state=latest disablerepo=webtatic-php" -i hosts
2.移除httpd服务
[root@manager project1]# ansible webservers -m yum -a "name=httpd state=absent disablerepo=webtatic-php" -i hosts
3.安装httpd指定从按个仓库安装
- name: install the latest version of Apache from
the testing repo
[root@manager project1]# ansible webservers -m yum -a "name=httpd state=latest enablerepo=testing" -i hosts
4.通过URL方式进行安装
[root@manager project1]# ansible webservers -m yum -a "name=https://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-agent-3.0.0-1.el7.x86_64.rpm state=present disablerepo=webtatic-php" -i hosts
- name: install nginx rpm from a local file (软件包必须在被控端主机)
5.在本地做软件升级操作
[root@manager project1]# ansible webservers -m yum -a "name=/root/zabbix-agent-4.0.0-2.el7.x86_64.rpm state=present disablerepo=webtatic-php" -i hosts
6.copy文件拷贝模块
copy:
src #本地路径,可以是相对,可以是绝对
dest #目标位置
owner #属主
group #属组
mode #权限
backup #备份
1.拷贝文件至被控节点【前提必须在控制端准备好对应的文件】
[root@manager project1]# ansible webservers -m copy -a "src=./file/ansible.cheng.com.conf dest=/etc/nginx/conf.d/ansible.cheng.com.conf owner=root group=root mode=644" -i hosts
2.对远端已有文件进行备份,按照时间信息备份【控制端可作修改】
[root@manager project1]# ansible webservers -m copy -a "src=./file/ansible.cheng.com.conf dest=/etc/nginx/conf.d/ansible.cheng.com.conf owner=root group=root mode=644 backup=yes" -i hosts
3.向被控端主机写入数据,并且会覆盖远端文件内原有数据信息
[root@manager project1]# ansible webservers -m copy -a "content='hello word' dest=/tmp/test.html" -i hosts
7.ansible管理服务的启动与停止,使用service、systemd
state:
started #启动
stopped #停止
restarted #重启
reloaded #重载
enabled #是否开机自启
yes #是
no #否
1.启动nginx服务并加入开机自启
[root@manager project1]# ansible webservers -m systemd -a "name=nginx state=restarted enabled=yes" -i hosts
2.停止http服务
[root@manager project1]# ansible webservers -m systemd -a "name=httpd state=stopped" -i hosts
8.file文件创建模块
1.创建 /code/ansible
path: #指定远程主机目录或文件
recurse: #递归授权 yes|no
state: #状态
directory #在远端创建目录
touch #在远端创建文件
link #创建链接文件
absent #表示删除文件或目录
mode #设置文件或目录权限
owner #设置文件或目录属主
group #设置文件或目录属组
2.准备站点
[root@manager project1]# ansible webservers -m file -a "path=/code/ansible state=directory mode=755 owner=www group=www" -i hosts
3.准备站点代码【前提在控制端准备index.html文件】
[root@manager project1]# ansible webservers -m copy -a "src=./file/index.html dest=/code/ansible/index.html owner=www group=www mode=644" -i hosts
9.group组模块、user模块
#group 整数int 小数 flot dasdsa str 真|假 bool
#user
name #名称
uid #uid
group #组名或gid
create_home #是否创建家目录
system #是否作为系统组
shell #指定登录shell
state
present
absent
remove
groups
append
password #给用户添加密码(记得单引号
1.创建gid为666的www组
[root@manager project1]# ansible webservers -m group -a "name=www gid=666 state=present" -i hosts
2.程序使用 www 666 666 /sbin/nologin 不创建家目录/home
[root@manager project1]# ansible webservers -m user -a "name=www uid=666 group=666 create_home=no shell=/sbin/nologin state=present" -i hosts
3.正常用户 xiang 1000 1000 /bin/bash /home/xiang
[root@manager project1]# ansible webservers -m user -a "name=xiang" -i hosts
4.移除用户xiang,并删除家目录所有内容
[root@manager project1]# ansible webservers -m user -a "name=xiang state=absent remove=yes" -i hosts
5.创建 other用户.有两个附加组root bin,创建家目录,指定登录shell,设定密码123
5.1将明文密码进行hash加密,然后进行用户创建
[root@manager project1]# ansible all -i localhost, -m debug -a "msg={{ '123'| password_hash('sha512', 'mysecretsalt') }}"
localhost | SUCCESS => {
"msg": "$6$mysecretsalt$gIIYs0Xgc7sSQkH.zKaz8/AfaMomYzR1QZYtccwmJcUt8VpLq4D055UCCX4MlwgePOP80ZRwhppvBF72RIAVi/"
}
5.2创建
[root@manager project1]# ansible webservers -m user -a 'name=other groups='root,bin' create_home=yes shell=/bin/bash password="$6$mysecretsalt$gIIYs0Xgc7sSQkH.zKaz8/AfaMomYzR1QZYtccwmJcUt8VpLq4D055UCCX4MlwgePOP80ZRwhppvBF72RIAVi/"' -i hosts
10.mount挂载模块
1.提前准备好nfs服务端【web进行测试】
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data/zrlog 172.16.1.0/24
/data/zh 172.16.1.0/24
/data/edu 172.16.1.0/24
2.用管理端操作被控端,让被控端挂载nfs存储数据
state:
present #写入/etc/fstab【开机挂载,仅将挂载配置写入/etc/fstab】
absent #卸载/etc/fstab【卸载设备,会清理/etc/fstab写入的配置】
mounted #临时挂载【挂载设备,并将配置写入/etc/fstab】
unmounted #卸载当前挂载【卸载设备,不会清除/etc/fstab写入的配置】
3.挂载过程中,如果目录不存在,则会创建该目录
[root@manager project1]# ansible webservers -m mount -a "src=172.16.1.31:/data/word path=/test_wordpress fstype=nfs opts=defaults state=mounted" -i hosts
4.卸载当前挂载的
[root@manager project1]# ansible webservers -m mount -a "src=172.16.1.31:/data/word path=/test_wordpress fstype=nfs opts=defaults state=unmounted" -i hosts
5.卸载/etc/fstab
[root@manager project1]# ansible webservers -m mount -a "src=172.16.1.31:/data/word path=/test_wordpress fstype=nfs opts=defaults state=absent" -i hosts
11.crond定时任务模块
minute #分
hour #时
day #日
month #月
week #周
job #写具体执行的任务【执行+脚本路径】
1.使用ansible添加一条定时任务
[root@manager project1]# ansible webservers -m cron -a 'name=test_jop minute=00 hour=02 job="/bin/bash /server/scripts/client_data_server.sh && >/dev/null/"' -i hosts
[root@web01 ~]# crontab -l
#Ansible: test_jop
00 02 * * * /bin/bash /server/scripts/client_data_server.sh && >/dev/null/
2.使用ansible添加每分钟执行的定时任务
[root@manager project1]# ansible webservers -m cron -a 'name=test job="/bin/bash /server/scripts/test.sh &> /dev/null"' -i hosts
[root@web01 ~]# crontab -l
#Ansible: test
* * * * * /bin/bash /server/scripts/test.sh &> /dev/null
3.删除test定时任务
[root@manager project1]# ansible webservers -m cron -a 'name=test job="/bin/bash /server/scripts/test.sh &> /dev/null" state=absent' -i hosts
12.Firewalld模块
firewalld:
service #指定开放或关闭的服务名称
port #指定开放或关闭的端口
masquerade #开启地址伪装
immediate #临时生效
permanent #是否添加永久生效
state #开启或是关闭
zone #指定配置某个区域
rich_rule #配置富规则
source #指定来源IP
1.启动firewalld防火墙
[root@manager project1]# ansible webservers -m systemd -a "name=firewalld state=started" -i hosts
2.开放http服务
[root@manager project1]# ansible webservers -m firewalld -a "service=http state=enabled" -i hosts
3.开放8888端口
[root@manager project1]# ansible webservers -m firewalld -a "port=8888/tcp state=enabled" -i hosts
4.只允许172.16.1.31网段
[root@manager project1]# ansible webservers -m firewalld -a "source=172.16.1.31/32 zone=trusted state=enabled permanent=no" -i hosts
ansible webservers -m firewalld -a 'rich_rule="rule family=ipv4 source address=10.0.0.1/32 service name=http accept" state=enabled' -i hosts
5.使用端口方式 2222
[root@manager project1]# ansible webservers -m firewalld -a 'rich_rule="rule family=ipv4 source address=10.0.0.1/32 port port="2222" protocol=tcp accept" state=enabled' -i hosts
13.selinux模块
1.关闭selinux
[root@manager project1]# ansible webservers -m selinux -a "state=disabled" -i hosts
2.官方语法:
- name: Disable SELinux
selinux:
state: disabled
14.get_url文件下载模块
url #文件在网络上的具体位置
dest #下载到被控端的哪个目录下
checksum #校验(md5 sha256)
1.通过get_url下载文件或者软件
[root@manager project1]# ansible webservers -m get_url -a "url=https://mirrors.tuna.tsinghua.edu.cn/centos/8.0.1905/BaseOS/x86_64/os/Packages/dejavu-serif-fonts-2.35-6.el8.noarch.rpm dest=/tmp mode=777" -i hosts
2.下载一个文件前先进行md5校验,通过则下载,不通过则失败
[root@manager project1]# wget https://mirrors.tuna.tsinghua.edu.cn/centos/8.0.1905/BaseOS/x86_64/os/Packages/ed-1.14.2-4.el8.x86_64.rpm
[root@manager project1]# md5sum ed-1.14.2-4.el8.x86_64.rpm
[root@manager project1]# ansible webservers -m get_url -a "url=https://mirrors.tuna.tsinghua.edu.cn/centos/8.0.1905/BaseOS/x86_64/os/Packages/ed-1.14.2-4.el8.x86_64.rpm dest=/tmp mode=777 checksum=md5:7f0d0501be51652645704f3f551cbdba" -i hosts
15.yum_repository模块
yum_repository模块可以管理远程主机上的yum仓库。
模块参数
参数 | 说明 |
---|---|
name | 必须参数,用于指定要操作的唯一的仓库ID,也就是".repo"配置文件中每个仓库对应的"中括号"内的仓库ID |
baseurl | 设置yum仓库的baseurl |
description | 设置仓库的注释信息,也就是".repo"配置文件中每个仓库对应的"name字段"对应的内容。 |
file | 设置仓库的配置文件名称,即设置".repo"配置文件的文件名前缀,在不使用此参数的情况下,默认以name参数的仓库ID作为".repo"配置文件的文件名前缀,同一个'.repo'配置文件中可以存在多个yum源 |
enabled | 设置是否激活对应的yum源,此参数默认值为yes,表示启用对应的yum源,设置为no表示不启用对应的yum源。 |
gpgcheck | 设置是否开启rpm包验证功能,默认值为no,表示不启用包验证,设置为yes表示开启包验证功能。 |
gpgcakey | 当gpgcheck参数设置为yes时,需要使用此参数指定验证包所需的公钥 |
state | 默认值为present,当值设置为absent时,表示删除对应的yum源 |
1.自定义下载源并设置仓库的名称【在被控主机上设置ID为aliEpel的yum源,
仓库配置文件路径为/etc/yum.repos.d/aliEpel.repo】
[root@manager project1]# ansible webservers -m yum_repository -a 'name=aliEpel description="alibaba EPEL" baseurl=http://mirrors.aliyun.com/epel/7/$basearch' -i hosts
172.16.1.8 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "aliEpel",
"state": "present"
}
172.16.1.7 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "aliEpel",
"state": "present"
}
2.检验下载的阿里源
[root@manager project1]# ansible webservers -a "ls /etc/yum.repos.d/" -i hosts
172.16.1.8 | CHANGED | rc=0 >>
aliEpel.repo
CentOS-Base.repo
epel.repo
nginx.repo
php.repo
172.16.1.7 | CHANGED | rc=0 >>
aliEpel.repo
CentOS-Base.repo
epel.repo
nginx.repo
php.repo
3.删除/etc/yum.repos.d文件中的aliEpel源
[root@manager project1]# ansible webservers -m yum_repository -a "name=aliEpel file=aliEpel state=absent" -i hosts
172.16.1.7 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "aliEpel",
"state": "absent"
}
172.16.1.8 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "aliEpel",
"state": "absent"
}