ansible是一款批量自动化运维的工具,在一台主机上安装ansible就可以对其他主机进行批量化操作了。采用模块化设计,基于python、paramiko、pyyaml、jinja2。
使用ansible需要关注两个集合:主机集合,命令集合。 表明了对哪些主机进行什么样的操作。本质上是通过ssh连接到远程主机上然后执行对应的命令。
软件依赖管理:使用python2.6或者python2.7,使用paramiko、pyyaml、jinja2、httplib2、six这几个模块。被托管的主机需要安装ssh,如果开启selinux则需要安装libselinux-python
一、结构规划:
管理主机:”192.168.4.10
被托管主机:4.11(web1)、4.12(web2)、4.13(db1)、4.14(db2)、4.15(cache)
二、安装ansible:(只在管理主机上安装)
修改/etc/hosts将上述ip以及对应的主机名添加到文件中
配置具有ansible的yum源
yum -y install ansible
ansible --version #查看对应版本
三、配置:
ansible中需要重点关注的就是主机集合以及命令集合
主机的集合需要放在文件当中,在ansible的配置文件中引用这个文件
ansible可以在不同的目录下自定义配置文件,因此需要了解ansible配置文件的搜索顺序
这个配置文件的搜索顺序决定了ansible的执行的顺序
1、环境变量ANSIBLE_CONFIG
2、当前目录下的./ansible.cfg #这一条意味着,ansible配置文件可以有无数个
3、用户家目录下的~/ansible.cfg
4、默认配置文件/etc/ansible/ansible.cfg
修改配置文件:
# 也可以在任意目录下自定义配置文件,只需要在这个目录下执行ansible命令就可以了
vim /etc/ansible/ansible.cfg
inventory = /etc/ansible/hosts #这个文件就是主机集合文件,14行
host_key_checking = False #执行命令时不需要输入yes,61行
remote_user = root #ansible是通过ssh执行的,这个参数决定了使用ssh执行时的用户,97行
定义主机集合文件:
vim /etc/ansible/hosts
[web] #组名,分组是为了方便管理
web1
web2
[db]
db1
db2
[other]
cache
四、ansible命令:(基础)
ansible 组名(主机名) -m 模块名 -a 模块参数
ansible web --list-hosts #查看组中对应的主机
ansible all -m ping [-k] #批量检测主机,-k表示交互式的输入密码
五、部署证书:
ansible的本质是通过ssh在远程主机上执行命令的,因此需要输入密码
为了方便管理和操作,因此需要部署证书,实现免密登陆
cd /root/.ssh
ssh-keygen -t rsa -b 2048 -N "" -f key
# -t指明加密方式是rsa,-b表示秘钥长度,-N指明了密码为"",-f指定了秘钥文件的名字
# 发送公钥
for i in web1 web2 db1 db2 cache
do
ssh-copy-id -i key.pub $i #-i指明了需要发送公钥的名字
done
ssh -i 私钥名字 ip #使用指定的私钥登陆目的主机
ansible在ssh远程主机时,默认找/root/.ssh/id_rsa这个私钥文件
上述过程生成的私钥文件的文件名是key,因此需要改变ansible寻找的私钥文件
rm -fr /root/.ansible/cp/* #清空ansible缓存
# 在主机集合文件中,定义访问哪些主机,需要哪个私钥
vim /etc/ansible/hosts
#为一台主机指定私钥
[web] #组名,分组是为了方便管理
web[1:2] #web1,web2的简写
[db]
db1
db2 ansible_ssh_port = 222 #指定ssh端口号,如果是22可以不写
# 为所有主机指定私钥
[all:vars] #all代表所有主机,是一个关键字;vars也是一个关键字,表示一个变量
ansible_ssh_private_key_file = /root/.ssh/key
# 为自定义组指定私钥
[app:children] #app是自定义的组名,children表示这个组是子组
web #组名,要在这个文件中定义
db #组名,要在这个文件中定义
[app:vars]
ansible_ssh_private_key_file = /root/.ssh/key
六、自定义ansible配置:
ansible可以在不同的目录下自定义配置文件
在意在任意目录下创建ansible.cfg文件,以及hosts文件
在ansible.cfg中配置inventory 对应的值就可以了
七、动态主机:
inventory可以分为静态和动态
静态的inventory是指hosts文件中定义的主机
动态的inventory事指通过外部脚本获取主机列表,然后将json返回给ansible
八、ansible常用模块:
# ansible命令格式
ansible 组名(主机名) -m 模块名 -a 模块参数
1、ansible-doc和ping模块:
# 查看帮助文档
ansible-doc -l #列出所有模块
ansible-doc 模块名 #查看对应模块的文档,参数前是"="的为必选项,为"-"的是可选选项
ansible 组名(主机名) -m ping #测试连通性
2、command模块:
# linux命令模块
ansible 组名(主机名) -m command -a '具体的linux命令'
# 注意具体的linux命令使用的是单引号'',表示在远程解析
# 如果使用的是双引号"",则表示在本地解析
# command模块是直接执行命令,不是通过bash执行的
# 因此有很多bash的属性无法使用
# 例如:管道 | ,重定向 > 等
3、shell模块:
# 用法和command模块基本相同,但是shell模块是通过/bin/sh(/bin/bash)执行命令的
# 但是不能执行交互式的命令
例:
ansible web -m shell -a 'cd /tmp'
ansible web -m shell -a 'touch abc'
# 由于ansible是ssh执行的,每次ssh都在/root/,因此abc文件在/root/目录下
# 想要在/tmp目录下创建文件需要使用chdir=/tmp 指定工作目录
ansible web -m shell -a 'chdir=/tmp touch abc'
4、script模块:
# 用于执行本地编写的脚本,本质上是拷贝到远程主机上,然后再执行
例:
vim work.sh
#!/bin/bash
id sda1 > /dev/null
if [ $? != 0 ]; then
useradd sda1
echo 123456 | passwd --stdin sda1
fi
ansible web1,db2 -m script -a work.sh
5、yum模块:
# 用于管理软件,被托管主机上要配置好对应的yum源
例:
ansible db -m yum -a 'name="mariadb-server" state=installed'
# name表示对应的软件包名
# state表示执行的动作,installed安装,removed删除
6、service模块:
# 对服务的相关操作
# name:对应的服务名
# enabled:是否开机自启动
# sleep:重启服务的时候stop和start之间间隔多少秒
# state:执行的动作,started、stopped、estarted、reloaded
例:
ansible web -m service -a 'name="sshd" enabled="yes" state="startted"'
7、copy模块:
# 复制文件到远程主机上
# src:本地文件路径,注意/tmp 和 /tmp/的区别,必选项
# dest:远程主机的路径,必选项
# backup:覆盖钱先备份原有文件,是否包含时间 yes/no
# force:若目标主机包含该文件,但是内容不相同时,若force=yes(默认)则强制覆盖,若force=no,则目标主机不存在该文件时才进行复制
例:
ansible all -m copy -a 'src=/etc/yum.repos.d/ dest=/etc/yum.repos.d/'
#注意目录的写法,是/etc/yum.repos.d/还是/etc/yum.repos.d
8、lineinfile模块:
# 类似于sed的一种编辑模块
# 找到匹配行的时候清空这一行的内容,然后从重写内容
# path:目标文件
# regexp:正则表达式,匹配到某一行
# line:需要重写的内容
例:
ansible db -m lineinfile -a 'path=/etc/my.cnf regexp="mixed$" line="binlog-format=row"'
9、replace模块:
# 和lineinfile类似,但是不是重写整行的内容,而是重写匹配到的内容
# path:目标文件
# regexp:正则表达式,匹配到某个位置
# replace:需要重写的内容
例:
ansible db -m replace -a 'path=/etc/my.cnf regexp="row" replace="mixed"'
10、setup模块:
# 用于获取主机的信息
例:
ansible db1 -m setup #查看db1主机所有信息,json格式
ansible db1 -m setup -a 'filter=ansible_hostname' #使用filter进行过滤
九、提权:
在ansible.cfg中配置的远程用户是root,如果想要使用普通用户去执行命令则需要提权
vim ansible.cfg
[defaults]
inventory = /etc/ansible/hosts #可以自定义
remote_user = sda1
host_key_checking = False #执行命令时不需要输入yes
[privilege_escalation] #提权
become = yes #需要切换用户
become_method = sudo #使用sudo切换,还可以是su
become_user = root #切换成什么用户
become_ask_pass = no #不询问切换密码
在被托管主机上需要为sda1用户提权
visudo
sda1 ALL=(ALL) NOPASSWD:ALL
写总结的第七十六天!!!