一、基础概述
1、ansible主要功能
批量执行远程命令,可以对N多台主机同时进行命令的执行。
批量配置软件服务,可以进行自动化的方式配置和管理服务。(可以将配置推送到远程机器)
实现软件开发功能,jumpserver底层使用 ansible 来实现的自动化管理。(可以嵌入到运维开发当中,完成平台的配置管理工作)
编排高级的IT任务,Ansible 的 Playbook 是一门编程语言,可以用来描绘一套 IT 架构。
2、ansible特点
容易学习∶无代理,不像salt既要学客户端与服务端,还需要学习客户端与服务端中间通讯协议(ansible就一个控制端,控制被控制端主机就完事了)
操作灵活∶Ansible有较多的模块,提供了丰富的功能、playbook则提供类似于编程语言的复杂功能
简单易用∶体现在 Ansible 一个命令可以完成很多事情
安全可靠∶因为 Ansible使用了SSH 协议进行通讯,既稳定也安全(TCP+SSH TCP实现了传输的稳定,如果丢包了重传,ssh实现了安全)
移植性高∶可以将写好的 playbook 拷贝至任意机器进行执行
幂等性∶一个任务执行1遍和执行n遍效果一样,不会因为重复执行带来意外情况
3、ansible基础架构
Ansible 架构中的控制节点、被控制节点、inventroy、ad-hoc、playbook、Connection Protocol是什么?
将主机逻辑划分为组,这就需要主机清单,去定义主机和主机组,可以定义单个主机,和主机组,这样就可以为主机,或者主机组执行不同的操作。(将主机按照逻辑功能划分,这些分组由主机清单实现)
执行什么类型的操作?执行的操作就两种,一种ad-hoc,一种playbook。ad-hoc是单条命令,playbook是编排工具,编排的是ad-hoc,ad-hoc不是shell命令,是python模块,运维ansible是python开发的。(playbook将多个ad-hoc组织在一个文件当中,一次执行多个动作)
执行模块那么怎么推送到被控端?那么需要通过网络推送过去,网络要保证安全和稳定,那么就要使用到tcp和ssh的结合,模块到被控端通过python解释器去翻译这个模块,最终调用本地的shell命令完成最终的执行。
二、Ansible安装与配置
1、rpm安装
yum install ansible -y
2、pip安装
yum install python3 python3-devel python3-pip -y
pip3 install --upgrade pip -i https://pypi.douban.com/simple/
pip3 install ansible -i
三、Ansible配置解读
1、ansible配置路径
/etc/ansible/ansible.cfg #主配置文件,配置ansible工作特性
/etc/ansible/hosts #配置主机清单文件 inventory
/etc/ansible/roles/ #存放ansible角色的目录
2、ansible主配置文件
#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 #检查对应服务器的host_key,建议取消
log_path = /var/log/ansible.log #ansible日志,建议启用
#roles_path = /etc/ansible/roles
[privilege_escalation] #如果是普通用户则需要配置提权
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
3、ansible配置优先级
# nearly all parameters can be overridden in ansible-playbook
# or with command line flags. ansible will read ANSIBLE_CONFIG,
# ansible.cfg in the current working directory, .ansible.cfg in
# the home directory or /etc/ansible/ansible.cfg, whichever it
# finds first
第一步读取:$ANSIBLE_CONFIG变量
第二步读取:当前项目目录下的ansible.cfg
第三步读取:当前用户家目录下的 .ansible.cfg
第四步读取: /etc/ansible/ansible.cfg
4、普通用户管理被控端
ansible使用zhangsan普通用户统一管理所有的被控端节点
1、控制端、被控端都需要有zhangsan用户
useradd zhangsan
echo '123'|passwd --stdin zhangsan
2、将控制端zhangsan用户的公钥推送到被控端zhangsan用户下,进行免密认证
su - zhangsan
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
ssh-copy-id ~/.ssh/id.pub zhangsan@IP
3、所有主机的zhangsan用户添加sudo权限
visudo
zhangsan ALL=(ALL) NOPASSWD: ALL
4、修改控制端/etc/ansible/ansible.cfg主配置文件,配置普通用户提权
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
四、Ansible Inventory
1、Inventory概述
Inventory文件主要用来填写被管理主机以及主机组信息;(逻辑组定义)
默认Inventory文件为/etc/ansible/hosts
也可以自定义一个文件,在执行ansible命令时使用-i选项指定Inventory文件位置
ansible默认的Inventory文件是一个静态文件,但是ansible还可以支持多个Inventory文件
/data/Inventory目录下有俩主机文件hosts和docker
修改ansible.cfg文件中的Inventory值,这里不再指向一个文件,而是指向一个目录
inventory = /data/Inventory/
2、Inventory 常用内置参数
ansible_ssh_host: 定义host ssh地址 ansible_ssh_host=10.132.42.1.117
ansible_ssh_port: 定义hots ssh端口 snsible_ssh_port=3009
ansible_ssh_user: 定义hosts ssh 认证用户 ansible_ssh_user=michael
ansible_ssh_pass: 定义hosts ssh认证密码 ansible_ssh_pass=root123
ansible_duso: 定义hosts sudo的用户 ansible_sudo=michael
ansible_sdo_pass: 定义hosts sudo密码 ansible_sudo_pass="12345"
ansible_sudo_exe: 定义hosts duso 路径 ansible_sudo_exe=/usr/bin/sudo密码
ansible_ssh_private_key_file: 定义hosts私钥 ansible_ssh_private_key_file=/root/key
ansible_shell_type: 定义hosts shell类型 ansible_shell_type=bash
ansible_python_interpreter: 定义hosts任务执行python的路径 ansible_python_interpreter=/usr/bin/python2.6
ansible_interpreter: 定义hosts其他语言解析器路径 ansible_interpreter=/usr/bin/ruby
3、Inventory密码连接方式
1、指定主机用户、密码
# 详细清单文件;
[webservers]
10.0.0.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
10.0.0.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
# 通过域名的简写方式;
[webservers]
web[1:2].oldxu.com ansible_ssh_pass='123456'
2、通过变量方式定义
[webservers:vars] #只定义webservers组中ip变量
ansible_ssh_pass='123456'
[all:vars] #定义配置文件中所有ip变量
ansible_ssh_pass='123456'
4、Inventory密钥连接方式
先免密,然后直接定义逻辑组即可完成通讯;
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8
修改主机清单为如下的内容即可完成通讯;
[webservers]
172.16.1.7
172.16.1.8
5、Inventory主机常用方式
1、单个定义
[webservers]
172.16.1.7
[dbservers]
172.16.1.8
2、嵌套主机组;(关键字:children)
[test:children]
webservers
dbservers
3、为主机定义名称
[webservers]
web01 ansible_ssh_host='172.16.1.7'
172.16.1.8
4、使用域名的方式:
[webservers]
web02.example.com
172.16.1.8
5、变量定义
[webservers]
172.16.1.7 ansible_ssh_pass='123456'
[webservers:vars]
ansible_ssh_pass='123456'
[all:vars]
ansible_ssh_pass='123456'
6、Inventory主机匹配方式
#指定操作所有组
ansible all -m ping
#通配符web*
ansible "web*" -m ping
#与:在webservers组,并且在dbservers中的主机
ansible "webservers:&dbservers" -m ping
#或:在webservers组,或者在dbservers中的主机
ansible "webservers:dbservers" -m ping
#非:在webservers组,但不在dbservers中的主机
ansible 'webservers:!dbservers' -m ping
#正则表达式
ansible "~(web|db).*" -m ping
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com