目录
一、ansible
ansible简介
1.ansible可以同时管理Redbat系的Linux,Debian系的Linux,以及Window主机。管理节点只在执行脚本是与远程主机连接,没有特别的同步机制,所以断电等异常一般不会影响ansible。
2.ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
- 1.连接插件connection plugins:负责和被监控端实现通信;
- 2.host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
- 3.各种模块核心模块、command模块、自定义模块;
- 4.借助于插件完成记录日志邮件等功能;
- 5.playbook:剧本执行多个任务时,非必须可以让节点一次性运行多个任务
3.ansible的框架:老连接其它主机默认使用ssh协议,默认端口号22
二、ansible环境安装部署
部署环境
管理端(master):192.168.91.10
被管理端(webserver):192.168.91.20
被管理端(mysql):192.168.91.30
部署步骤
1.配置yum源
[root@ansible ~]# vi /etc/yum.repos.d/local.repo
[local]
name=local
#baseurl=file:///mnt
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
gpgcheck=0
enabled=1
2.安装eqel源
[root@ansible ~]# yum -y install epel-release
[root@ansible ~]# yum -y install ansible
3.查看ansible版本
[root@ansible ~]# ansible --version
4.安装tree,并以树状结构展示文件
[root@ansible ~]# yum -y install tree
[root@ansible ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg ##ansible的配置文件
├── hosts ##ansible的主仓库,用于存储需要管理的远程主机的相关信息
└── roles ##角色
5.配置主机清单
[root@ansible ~]# cd /etc/ansible
[root@ansible ~]# vi hosts
[webserver]
192.168.91.20
[mysql]
192.168.91.30
6.配置密钥对验证
[root@ansible ~]# ssh-keygen -t rsa
[root@ansible ~]# ssh-copy-id root@192.168.91.20
[root@ansible ~]# ssh-copy-id root@192.168.91.30
7.免交互代理
[root@ansible ~]# ssh-agent bash
[root@ansible ~]# ssh-add
三、ansible命令行模块
- 命令格式
ansible [主机] [-m 模块] [-a args]
ansible-doc -l ##列出所有已安装的模块,注:按q退出
ansible-doc -s yum ##-s列出yum模块描述信息和操作动作
command模块
command模块可以帮助我们在远程主机上执行命令
##指定ip执行date
[root@ansible ~]# ansible 192.168.91.20 -m command -a 'date'
##指定分类执行date
[root@ansible ~]# ansible webserver -m command -a 'date'
[root@ansible ~]# ansible mysql -m command -a 'date'
##所有hosts主机执行date命令
[root@ansible ~]# ansible all -m conmmand -a 'date'
##如果不加-m模块,则默认运行command模块
[root@ansible ~]# ansible all -a 'ls/'
cron模块
两种状态(state):present表示添加(可以省略),absent表示移除。
##查看cron模块信息
[root@ansible ~]# ansible-doc -s cron
##创建定时计划任务
[root@ansible ~]# ansible webserver -m cron -a 'minute'="*/1" job="/usr/bin/echo heihei >> /opt/test.txt" name="text cron job"
##查看定时计划任务
[root@ansible ~]# ansible webserver -a 'crontab -l'
192.168.10.20 | CHANGED | rc=0 >>
#Ansible: test cron
*/1 * * * * /usr/bin/echo heihei cron >> /opt/test.txt
##移除计划任务,假如该任务计划没有取名字,name=None即可
[root@ansible ~]# ansible apache -m cron -a 'name="test cron" state=absent'
user模块
user 模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作。
user模块是请求的是useradd,userdel,usermod三个指令
##查看user模块信息
[root@ansible ~]# ansible-doc -s user
##创建用户test01
[root@ansible ~]# ansible mysql -m user -a 'name="test01"'
##查看mysql上是否创建了test01用户
[root@ansible ~]# ansible mysql -m command -a 'tail /etc/passwd'
##删除用户test01
[root@ansible ~]# ansible mysql -m user -a 'name="test01" state=absent'
group模块
group 模块可以帮助我们管理远程主机上的组
group模块请求的是useradd,userdel,usermod三个指令
##查看group模块信息
[root@ansible ~]# ansible-doc -s group
##创建用户组
[root@ansible ~]# ansible mysql -m group -a 'name=mysql gid=306 system=yes'
##查看apache节点上是否生成apache这个组
[root@ansible ~]# ansible mysql -a 'tail /etc/group'
[root@ansible ~]# ansible mysql -m user -a 'name=test01 uid=306 system=yes group=mysql'
[root@ansible ~]# ansible mysql -a 'tail /etc/passwd'
##查看mysql上是否创建了test01用户
[root@ansible ~]# ansible mysql -a 'id test01'
192.168.10.20 | CHANGED | rc=0 >>
uid=306(test01) gid=306(mysql) 组=306(mysql)
copy模块
copy 模块的作用就是拷贝文件
常用参数:
参数 | 作用 |
---|---|
srcansible | 端源文件或目录,空文件夹不复制 |
content | 用来替代src 用于将指定的文件内容复制到远程文件 |
dest | 客户端目标目录或文件,需要绝对路径 |
back_up | 复制之前备份远程节点上的原始文件 |
directory_code | 用于复制文件夹,新建文件会被复制,旧文件不会被复制 |
follow | 支持link文件复制 |
force | 覆盖远程主机不一致的内容 |
group | 设定远程主机文件夹的组名 |
mode | 文件夹权限 |
owner | 设定远程主机文件夹的用户名 |
##查看copy模块信息
[root@ansible ~]# ansible-doc -s copy
[root@ansible ~]# ansible mysql -m copy -a 'src=/stc/fstab dest=/opt/fstab.back owner=root mode=640'
[root@ansible ~]# ansible mysql -a 'ls -l /opt'
ansible mysql -a 'cat /opt/fstab.back'
##将hello heihei!写入/opt/fstab.back
[root@ansible ~]# ansible mysql -m copy -a 'content="hello heihei!" dest=/opt/fstab.back'
[root@ansible ~]# ansible mysql -a 'cat /opt/fstab.back'
192.168.10.20 | CHANGED | rc=0 >>
hello heihei!
file模块
file 模块可以帮助我们完成一些对文件的基本操作。比如,创建文件或目录、删除文件或目录、修改文件权限等。
##查看file模块信息
[root@ansible ~]# ansible-doc -s file
##创建一个mysql用户
[root@ansible ~]# ansible mysql -m user -a 'name=mysql system=yes'
##创建一个apache的组
##设置文件的属主属组权限等
[root@ansible ~]# ansible mysql -m group -a 'name=mysql system=yes'
[root@ansible ~]# ansible mysql -m file -a 'owner=mysql group=mysql mode=644 path=/opt/fstab.bak'
##设置/opt/1.txt为/opt/2.txt的链接文件
[root@ansible ~]# ansible mysql -m file -a 'path=/fstab.link src=/opt/fstal.back state=link'
##删除mysql节点上的一个文件
[root@ansible ~]# ansible mysql -m file -a 'path=/opt/fstal.back state=absent'
##在mysql节点上创建一个文件
[root@ansible ~]# ansible mysql -m file -a 'path=/opt/1.txt state=touch'
##在mysql节点上创建一个目录
[root@ansible ~]# ansible mysql -m file -a 'path=/opt/temp state=directory mode=755'
##ping模块
测试主机之间的连通性
[root@ansible ~]# ansible all -m ping
192.168.10.20 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.10.30 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
yum模块
yum 模块可以帮助我们在远程主机上通过 yum 源管理软件包。
常用参数
参数 | 作用 |
---|---|
name参数 | 必须参数,用于指定需要管理的软件包,比如 nginx。 |
state参数 | 用于指定软件包的状态 ,默认值为。present,表示确保软件包已经安装,除了。present,其他可用值有 installed、latest、absent、removed,其中 installed 与present 等效,latest 表示安装 yum 中最新的版本,absent 和 removed 等效,表示删除对应的软件包。 |
disable_gpg_check参数 | 用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。在对应的 yum 源没有开启 gpg 验证的情况下,需要将此参数的值设置为 yes,否则会报错而无法进行安装。 |
enablerepo参数 | 用于指定安装软件包时临时启用的 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。 |
disablerepo参数 | 用于指定安装软件包时临时禁用的 yum 源。某些场景下需要此参数,比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。 |
注:enablerepo 参数和 disablerepo 参数可以同时使用。
##查看yum模块信息
[root@ansible ~]# ansible-doc -s yum
##yum安装apache
[root@ansible ~]# ansible apache -m yum -a 'name=httpd'
##yum卸载apache
[root@ansible ~]# ansible apache -m yum -a 'name=httpd state=absent'
service模块
##查看service模块信息
[root@ansible ~]# ansible-doc -s service
##查看apache节点上apache的运行状态
[root@ansible ~]# ansible mysql -a 'systemctl status httpd'
##启动apache服务,并设置开机自启
[root@ansible ~]# ansible mysql -m service -a 'name=httpd enabled=true state=started'
##关闭防火墙
[root@ansible ~]# ansible mysql -m service -a 'name=firewalld disabled=true state=stopped'
shell模块
chdir:指定工作目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中
creates:指定一个文件,当指定的文件存在时,就不执行对应的命令
removes:使用此参数指定一个文件,当指定的文件不存在时,就不执行对应命令
##查看shell模块信息
[root@ansible ~]# ansible-doc -s shell
##在apache节点上/opt/tshare目录下创建一个内容是heihei的文件
[root@ansible ~]# ansible mysql -m shell -a 'chdir=/opt/share echo heihei > heihei.txt'
[root@ansible ~]# ansible mysql -m shell -a 'chdir=/opt/share cat heihei.txt'
192.168.10.20 | CHANGED | rc=0 >>
heihei
script模块
script 模块可以帮助我们在远程主机上执行 ansible 管理主机上的脚本,也就是说,脚本一直存在于 ansible 管理主机本地,不需要手动拷贝到远程主机后再执行。
##查看script模块信息
[root@ansible ~]# ansible-doc -s script
##在ansible管理端创建脚本
[root@ansible ~]# vi test.sh
#!/bin/bash
echo "this is test script" > /opt/script.txt
##添加权限
[root@ansible ~]# chmod +x test.sh
##在mysql主机上执行脚本
[root@ansible ~]# ansible mysql -m script -a 'test.sh'
##查看mysql主机上的script.txt文件
[root@ansible ~]# ansible mysql -a 'cat /opt/script.txt'
192.168.10.20 | CHANGED | rc=0 >>
this is test script
setup模块
setup 模块用于收集远程主机的一些基本信息。
filter参数:用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息。
##查看setup模块信息
[root@ansible ~]# ansible-doc -s setup
##获取mysql组主机的facts信息
[root@ansible ~]# ansible mysql -m setup
##用filter参数进行筛选,获取mysql节点的ipv4地址
[root@ansible ~]# ansible mysql -m setup -a 'filter=ansible_all_ipv4_addresses'
192.168.10.20 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.122.1",
"192.168.10.20"
],
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
四、ansible组件——inventory变量参数
ansible默认的主机清单是/etc/ansible/hosts文件
主机清单可以手动设置,也可以通过Dynamic Inventory动态生成
一般主机名使用FQDN(FQDN:(Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称。)
vi /etc/ansible/hosts
[webserver]#方括号设置组名
www1.example.org #定义被监控主机,这边可以是主机名也可以是IP地址,主机名需要修改/etc/hosts文件
www2.example.org:2222#冒号后定义远程连接端口,默认是ssh的22端口
- 如果是名称类似的主机,可以使用列表的方式标识各个主机
[webserver]
www[01:50].example.org ansible_ssh_user=root ansible_ssh_pass=123456
[dbbservers]
db-[a:f].example.org 1/支持匹配a b c ... f
lnventory中变量
(1)主机变量
,[webserver]
www1.magedu.com http_port=80 maxRequestsChild=808www2.magedu.com http_port=8080 maxRequestsChild=909
(2)组变量
[servers:vars]
ntp_server=ntp.example.orgnfs_server=nfs.example.org
(3)组嵌套
[apache]
http1.example.org
http2.example.org
[nginx]
Nngx1.example.org
ngx2.example.org
[webservers:children]
apache
nginx
inventory变量参数
参数 说明
- 1.ansible_ssh_host 将要连接的远程主机名,与你想要设定的主机的别名不同的话,可以通过此变量设置
- 2.ansible_ssh_port ssh端口号,如果不是默认的端口号,通过此变量设置
- 3.ansible_ssh_user 默认的ssh用户名
- 4.ansible_ssh_pass ssh密码(这种方式并不安全,我们强烈建议使用–ask-pass或SSH密钥)
- 5.ansible_ssh_private_key_file ssh使用的私钥文件,适用于有多个密钥,而你不想使用SSH代理的情况
- 6.ansible_ssh_common_args 此设置附加到sftp,scp和ssh的缺省命令行
- 7.ansible_sftp_extra_args 此设置附加到默认sftp命令行
- 8.ansible_scp_extra_args 此设置附加到默认scp命令行
- 9.ansible_ssh_extra_args 此设置附加到默认ssh命令行
- 10.ansible_ssh_pipelining 确定是否使用SSH管道。这可以覆盖ansible.cfg中的设置
- 11.ansible_shell_type 目标系统的ssh类型,默认情况下,命令的执行使用’sh’语法,可设置为’csh’或’fish’
- 12.ansible_python_interpreter 目标主机的python路径,适用于的情况:系统中有多个python。或者命令路径不是/usr/bin/python
- 13.ansible__interpreter 这里的可以是ruby或perl或者其他语言的解释器,作用和-
- 14.ansible_python_interpreter类似
- 15.ansible_shell_executable 这将设置ansible控制器将在目标机器上使用的shell,覆盖ansible.cfg中的配置,默认为/bin/sh