1.什么是Ansible?
Ansible 是一个配置管理和应用部署工具,即在管理主机上操作一些命令就能在节点主机上进行相应的动作。
2.Ansible的特点?
- no angents:被管控节点无需安装agent
- no server:无服务端,使用时直接调用命名
- modules in any languages:基于模块工作,可以使用任意语言开发模式
- 易读的语法:基于yaml语法编写playbook
- 基于推送模式:不同于puppet的拉取模式,直接由调用者控制变更在服务器上发生的时间
- 模块是幂等性的:定义的任务已存在则不会做任何事情,意味着在同一台服务器上多执行同一个playbook是安全的
3.Ansible中ansible.cfg配置文件 优先级
-
ANSIBLE_CFG
:首先,Ansible命令会先检查环境变量,及这个环境变量将指向的配置文件;(export ANSIBLE_CONFIG=xxxx配置文件
) -
./ansible.cfg
:其次,将会检查当前目录下的ansible.cfg配置文件; -
~/.ansible.cfg
:再次,将会检查当前用户home目录下的.ansible.cfg
配置文件; -
/etc/ansible/ansible.cfg
:最后,将会检查在安装Ansible时自动生产的配置文件
ansible配置文件的参数
inventory = /etc/ansible/hosts 这个参数表示资源清单inventory文件的位置
library = /usr/share/ansible 指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
forks = 5 并发连接数,默认为5
sudo_user = root 设置默认执行命令的用户
remote_port = 22 指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
host_key_checking = False 设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
timeout = 60 设置SSH连接的超时时间,单位为秒
log_path = /var/log/ansible.log 指定一个存储ansible日志的文件(默认不记录日志)
4.定义ansible inventory(主机列表)
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名。默认的inventory file为/etc/ansible/hosts。
inventory file可以有多个。
- 1.基于IP地址+密码的方式
[webservers]
172.16.1.7ansible_ssh_user='root'
ansible_ssh_pass='1'
172.16.1.8ansible_ssh_user='root'
ansible_ssh_pass='1'
- 2.基于密钥连接,需要先创建公钥和私钥,并下发公钥至被控端
[root@manager ~]ssh-copy-id -I ~/.ssh/id_rsa.pub root@172.16.1.7
[root@manager ~]ssh-copy-id -I ~/.ssh/id_rsa.pub root@172.16.1.8
[root@manager ~]cat hosts
[webservers]
172.16.1.7
172.16.1.8
- 3.主机组使用方式
[lbservers] #定义lbservers组
172.16.1.5
172.16.1.6
[webservers] #定义webservers组
172.16.1.7
172.16.1.8
[servers:children] #定义servers组包括两个子组
[lbservers,webservers]
lbservers
webserver
5.Ansible任务执行模式
- ad-hoc模式(点对点模块)
使用单个模块,支持批量执行单条命令,相当与在bash中执行一句shell命令 - playbook模式(剧本模式)
ansible主要的管理方式,通过多个task的集合完成一类功能,可以理解为多个ad-hoc的配置文件
ansible ad-Hoc 单条命令
command 执行命令 默认 不支持管道
shell 执行命令 支持管道
yum_reposity yum仓库配置
yum yum安装软件
copy 拷贝配置文件
service|systemd 启动服务
file 创建目录 创建文件 递归授权
mount 挂载
cron 定时任务
firewalld 防火墙
selinux
1.command
ansible webservers -a "ps axu|grep nginx" -i hosts 不支持管道(简单命令)
2.shell
ansible webservers -m shell -a "ps axu|grep nginx" - i hosts 支持管道
3.yum
name 服务名
state:
present 安装
absent 卸载
latest 最新
enablerepo 指定使用按个仓库
disablerepo 排除使用哪个仓库
- 1.安装最新的httpd服务
[root@manager project1] # ansible webservers -m yum
-a "name=httpd state=latest disablerepo=webtaticphp" -i hosts - 2.移除httpd服务
[root@manager project1]# ansible webservers -m yum
-a "name=httpd state=absent disablerepo=webtaticphp" -i host - 3.安装httpd指定从哪个仓库安装
[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
4.copy
src 本地路径,可以是相对,可以是绝对
dest 目标位置
owner 属主
group 属组
mode 权限
backup 备份
[root@manager project1]# ansible webservers -m copy
-a "src=./file/ansible.oldxu.com.conf
dest=/etc/nginx/conf.d/ansible.oldxu.com.conf
owner=root group=root mode=644" -i hosts
[root@manager project1]# ansible webservers -m copy
-a "src=./file/ansible.oldxu.com.conf
dest=/etc/nginx/conf.d/ansible.oldxu.com.conf
owner=root group=root mode=644 backup=yes" -i hosts
5.service|systemd
state
started:启动
stopped:停止
restarted:重启
reloaded:重载
enabled 是否开机自启
yes 是
no 否
[root@manager project1]# ansible webservers -m
systemd -a "name=nginx state=restarted enabled=yes"
-i hosts
6.file
创建/code/ansible
path 路径
state
touch 创建文件
directory 创建目录
owner 属主
group 属组
mode 权限
[root@manager project1]# ansible webservers -m file
-a "path=/code/ansible state=directory mode=755
owner=www group=www" -i hosts
7.user group
[root@manager project1]# ansible webservers -m
group -a "name=www gid=666 state=present" -i hosts
user
name 名称
uid uid
group 组名或gid
create_home 是否创建家目录
system 是否作为系统组
shell 指定登录shell
state
present 创建用户
adsent 删除用户不删除家目录
remove 移除用户并删除家目录
groups 添加附加组
password 创建密码
[root@manager project1]# ansible webservers -m user
-a "name=www uid=666 group=666 create_home=no
shell=/sbin/nologin state=present" -i hosts
8.mount
present 写入/etc/fstab
absent 卸载/etc/fstab
mounted 临时挂载
unmounted 卸载当前挂载
挂载过程中,如果目录不存在,则会创建该目录
[root@manager project1]# ansible webservers -m
mount -a "src=172.16.1.31:/data/zrlog
path=/test_zrlog fstype=nfs opts=defaults
state=mounted" -i hosts
9.cron
minute 分
hour 时
day 日
month 月
week 周
job 添加任务
[root@manager project1]# ansible webservers -m cron
-a 'name=test_job minute=00 hour=02 job="/bin/bash
/server/scripts/client_to_data_server.sh
&>/dev/null"' -i hosts
10.firewalld
开启防火墙
[root@manager project1]# ansible webservers -m
systemd -a "name=firewalld state=started" -i hosts
针对服务
[root@manager project1]# ansible webservers -m
firewalld -a "service=http state=enabled" -i hosts
针对端口
[root@manager project1]# ansible webservers -m
firewalld -a "port=9999/tcp state=enabled" -i hosts
针对source来源
ansible webservers -m firewalld -a "source=172.16.1.0/24
state=disabled permanent=no" -i hosts
11.selinux
[root@manager project1]# ansible webservers -m
selinux -a "state=disabled" -i hosts