0
点赞
收藏
分享

微信扫一扫

五月学习之Ansible 基础概述

一、基础概述

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是什么?

五月学习之Ansible 基础概述_配置文件

将主机逻辑划分为组,这就需要主机清单,去定义主机和主机组,可以定义单个主机,和主机组,这样就可以为主机,或者主机组执行不同的操作。(将主机按照逻辑功能划分,这些分组由主机清单实现)

执行什么类型的操作?执行的操作就两种,一种ad-hoc,一种playbook。ad-hoc是单条命令,playbook是编排工具,编排的是ad-hoc,ad-hoc不是shell命令,是python模块,运维ansible是python开发的。(playbook将多个ad-hoc组织在一个文件当中,一次执行多个动作)

执行模块那么怎么推送到被控端?那么需要通过网络推送过去,网络要保证安全和稳定,那么就要使用到tcp和ssh的结合,模块到被控端通过python解释器去翻译这个模块,最终调用本地的shell命令完成最终的执行。

五月学习之Ansible 基础概述_Ansible_02

二、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

举报

相关推荐

0 条评论