Linux自动化运维ansible--简介和基本

ansible

作者:Michael DeHaan( Cobbler 与 Func 作者)
ansible 的名称来自科幻小说《安德的游戏》中跨越时空的即时通信工具,使用它可以在相距数光年的距离,远程实时控制前线的舰队战斗

  • 自动化运维管理平台
  • ansible最大的问题就是略慢
  • 官方文档:https://docs.ansible.com/

ansible 主要功能

  • 批量执行远程命令,可以对远程的多台主机同时进行命令的执行
  • 批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务
  • 编排高级的企业级复杂的IT架构任务, Ansible的Playbook和role可以轻松实现大型的IT复杂架构
  • 提供自动化运维工具的开发API, 有很多运维工具,如jumpserver就是基于 ansible 实现自动化管理功能

ansible主要内容

重点

  1. 模块
  2. playbook
  3. 角色

特色

  • 自动化管理
  • ansible不需要装客户端软件
  • ansible安全简单
  • 幂等性执行效果一致
  • 大量模块,大部分支持幂等性
  • 使用ansible替代脚本
  • 通过角色实现复杂环境部署
  • 支持Linux及windows甚至网络设备

ansible组成

  • 主机清单 对主机进行分组
  • 模块 实现不同功能
  • 插件 实现补充功能
  • 接口 第三方程序调用

Ansible安装

  • ansible为EPEL源软件
  • yum 安装
yum info ansible --enablerepo=*
## 利用epel源安装
yum -y install ansible --enablerepo=*
  • 查看版本
ansible -version
  • 查看部署的文件
rpm -ql ansible
  • 查看主程序位置
which ansible

ansible运行须知

  • ansible 不是一个长期运行的程序
  • ansible 利用ssh与其他服务器进行交互
  • ansible 没有对应的service,即没有私有端口

ansible实现批量管理的前提

  • 安装后两大步
  1. 实现主控机对被控机免密登录,
  2. 添加主机host列表,

实现相互间免密登录

  • 基于key验证
  • 加入信任主机清单

编脚本实现所有机器免密

  • 主机可以免密登录其他主机但是别的主机不能免密登录回来
  • -P ’ ’ ,单引号内填写被控机密码,此处为空
rpm -q sshpass &> /dev/null || yum -y install sshpass  
[ -f /root/.ssh/id_rsa ] || ssh-keygen -f /root/.ssh/id_rsa  -P ''
export SSHPASS=centos
for IP in {
     180..200};do
    sshpass -e ssh-copy-id -o StrictHostKeyChecking=no 10.0.0.$IP 
done
  • 判断sshpass是否已安装,没安装就装一下
  • 判断.ssh内的私钥文件是否存在,不存在就使用ssh-keygen创建一下
  • 对指定的IP或者IP段的主机拷贝本机公钥

ssh-copy-id命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上
实现ssh免密登录可参见:
Linux实现ssh基于key验证的免密登录
Linux编写shell脚本批量实现服务器基于key验证ssh免密登录
Linux编写Shell脚本利用expect实现免问答ssh登录服务器

首次连接自动应答

  • 以下两种方式都可以实现首次ssh连接被控机的密钥求真提问,
  • 建议使用修改ansible配置文件的办法

改ssh配置文件自动回答yes选项

vim /etc/ssh/ssh_config
## 取消注释并修改值为no
#   StrictHostKeyChecking ask
StrictHostKeyChecking no

改ansible配置文件也支持自动回答yes (推荐)

vim StrictHostKeyChecking ask
# uncomment this to disable SSH key host checking
host_key_checking = False

添加主机清单文件

  • 一个主机可以属于多个组
vim /etc/ansible/hosts
cat /etc/ansible/hosts
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the '#' character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups
[sunserver]
10.0.0.189
10.0.0.192
10.0.0.194
[dbserver]
10.0.0.[110:120]
[dnsserver]
dns[1:4].sun.co


### 以下为各种示例
# Ex 1: Ungrouped hosts, specify before any group headers.
## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10

# Ex 2: A collection of hosts belonging to the 'webservers' group


## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

# If you have multiple hosts following a pattern you can specify
# them like this:

## www[001:006].example.com

# Ex 3: A collection of database servers in the 'dbservers' group
## [dbservers]
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57

# Here's another example of host ranges, this time there are no
# leading 0s:
## db-[99:101]-node.example.com
  • 检查主机情况
    ansible all -m ping
[root@C8-186 ~]# vim /etc/ansible/ansible.cfg 
[root@C8-186 ~]# ansible all -m ping
10.0.0.192 | SUCCESS => {
     
    "ansible_facts": {
     
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
10.0.0.194 | SUCCESS => {
     
    "ansible_facts": {
     
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
10.0.0.190 | UNREACHABLE! => {
     
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 10.0.0.190 port 22: No route to host",
    "unreachable": true
}
10.0.0.193 | UNREACHABLE! => {
     
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 10.0.0.193 port 22: No route to host",
    "unreachable": true
}

ansible主机清单文件

  • 被控主机的名单
  • 生产建议在每个项目目录下创建项目独立的hosts文件

主机清单文件格式

  • inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中
  • 如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明
  • 如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机
  • 范例
[sunhost]
10.0.0.188 ansible_connection=local #指定本地连接,无需ssh配置
#ansible_connection=ssh 需要StrictHostKeyChecking no
10.0.0.177 ansible_connection=ssh ansible_ssh_port=2222 ansible_ssh_user=sun
ansible_ssh_password=sunhost
10.0.0.166 ansible_connection=ssh ansible_ssh_user=root
ansible_ssh_password=123456
#执行ansible命令时显示别名,如web01
[websrvs]
web01 ansible_ssh_host=10.0.0.101
web02 ansible_ssh_host=10.0.0.102
[websrvs:vars]
ansible_ssh_password=sunhost
some_host ansible_ssh_port=2222 ansible_ssh_user=manager
aws_host ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
freebsd_host ansible_python_interpreter=/usr/local/bin/python
ruby_module_host ansible_ruby_interpreter=/usr/bin/ruby.1.9.3

ansible 主配置文件

  • Ansible 的配置文件可以放在多个不同地方,优先级从高到低顺序如下
ANSIBLE_CONFIG #环境变量
./ansible.cfg #当前目录下的ansible.cfg
~/.ansible.cfg #当前用户家目录下的.ansible.cfg
/etc/ansible/ansible.cfg #系统默认配置文件
  • Ansible 的默认配置文件/etc/ansible/ansible.cfg ,
  • 其中大部分的配置内容无需进行修改
[defaults]
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp = $HOME/.ansible/tmp #本机的临时命令执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo 用户
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass = True
#remote_port = 22
## 建议取消下面行的注释,实现第一次连接自动信任目标主机
host_key_checking = False #检查对应服务器的host_key,
#log_path=/var/log/ansible.log #日志文件,建议启用
#module_name = command #默认模块,可以修改为shell模块
[privilege_escalation] #普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

ansible相关工具

  • /usr/bin/ansible 主程序,临时命令执行工具
  • /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man
  • /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
  • /usr/bin/ansible-pull 远程执行命令的工具
  • /usr/bin/ansible-vault 文件加密工具
  • /usr/bin/ansible-console 基于Console界面与用户交互的执行工具
  • /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台

利用ansible实现管理的主要方式:

  • Ansible Ad-Hoc 即利用ansible命令,主要用于临时命令使用场景
    Ansible Ad-Hoc 的执行方式的主要工具就是 ansible命令
  • Ansible playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程

ansible帮助

ansible-doc [options] [module...]
-l, --list #列出可用模块
-s, --snippet #显示指定模块的playbook片段
  • 示例
#列出所有模块
ansible-doc -l
#查看指定模块帮助用法
ansible-doc ping
#查看指定模块帮助用法
ansible-doc -s ping

你可能感兴趣的:(自动化运维,linux,运维,服务器,ansible,自动化运维)