Ansible介绍
ansible是一个自动化运维工具,基于Python开发,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible中文文档:https://ansible-tran.readthedocs.io/en/latest/docs/intro.html#
Ansible特点
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
- 默认使用SSH协议对设备进行管理;
- 有大量常规运维操作模块,可实现日常绝大部分操作;
- 配置简单、功能强大、扩展性强;
- 支持API及自定义模块,可通过Python轻松扩展;
- 通过Playbooks来定制强大的配置、状态管理;
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
- 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台
Ansible架构
ansible架构图
1 2 3 4 5 6 7
| Ansible: ansible的核心程序 Core Modules: ansible自带的模块 Custom Modules: 核心模块功能不足时,用户可以添加自定义模块 Plugins: 通过插件来实现记录日志,发送邮件或其他功能 Playbooks: 剧本,YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能 Connectior Plugins: ansible基于连接插件连接到各个主机上,默认是使用ssh Host Inventory: 记录由Ansible管理的主机信息,包括端口、密码、ip等
|
ansible工作原理
ansible系统由控制主机和被管理主机组成,执行ansible的主机一般称为主控端,中控,master或堡垒机。主控端Python版本需要2.6或以上,如果被控端Python版本小于2.4需要安装python-simplejson 。被控端如开启SELinux需要安装libselinux-python。ansible不是服务,不会一直启动,只是需要的时候启动。
Ansible 执行任务前,首先与管理主机建立连接,创建$HOME/.ansible/tmp/临时文件夹/,并生成以模块名命名的python 文件,调用subprocess.Popen()方法执行python 脚本,返回任务执行结果,最终删除$HOME/.ansible/tmp/临时文件夹/。
1 2 3 4 5 6 7
| 执行过程 1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg 2. 加载自己对应的模块文件,如command 3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户。 4. 给文件+x执行 5. 执行并返回结果 6. 删除临时py文件,sleep 0退出
|
Ansible配置
安装Ansible
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| yum install ansible -y ansible --version
ansible 2.9.27 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /bin/ansible python version = 2.7.5 (default, Jun 20 2023, 11:36:40) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
|
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
vim /etc/ansible/ansible.cfg
[defaults]
host_key_checking = False log_path=/var/log/ansible.log module_name = command
|
Ansible中的参数可以通过Ansible的Playbook或环境变量来重新赋值,比如:export ANSIBLE_SUDO_USER=root
,参数名称必须是大写字母。
在运⾏Ansible命令时,命令将会按照以下顺序查找配置⽂件。
1 2 3 4
| ANSIBLE_CONFIG :⾸先,Ansible命令会检查ANSIBLE_开头的环境变量,及这个环境变量指向的配置⽂件。 ./ansible.cfg :其次,将会检查当前⽬录下的ansible.cf g配置⽂件。 ~/.ansible.cfg :再次,将会检查当前⽤户home⽬录下的.ansible.cf g配置⽂件。 /etc/ansible/ansible.cfg :最后,将会检查在⽤软件包管理⼯具安装Ansible时⾃动产⽣的配置⽂件。
|
inventory配置
inventory主文件
inventory文件⽤于定义ansible要管理的主机列表,可以定义单个主机和主机组。默认在/etc/ansible/hosts
目录下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| [webservers] foo.example.com bar.example.com:2202 www[01:50].example.com
[dbservers] one.example.com two.example.com db-[a:f].example.com
[webservers:vars] ansible_ssh_pass='root'
[blog:children] webservers dbservers
|
分文件定义变量
主机变量可以直接在主机名后面定义,组变量可以在[webservers:vars]
中定义。但是在 inventory 主文件中保存所有的变量并不是最佳的方式.还可以保存在独立的文件中,这些独立文件与 inventory 文件保持关联. 不同于 inventory 文件(INI 格式),这些独立文件的格式为 YAML。
假设 inventory 文件的路径为:/etc/ansible/hosts
,那么以下配置文件(YAML 格式)依次为 webservers
的组变量, dbservers
的组变量,foo.example.com
的主机变量:
1 2 3
| /etc/ansible/group_vars/webservers /etc/ansible/group_vars/dbservers /etc/ansible/host_vars/foo.example.com
|
以上是为一个组或者一个主机单独创建一个文件,还有更进一步的运用,你可以为一个主机,或一个组,创建一个目录,目录名就是主机名或组名.目录中的可以创建多个文件, 文件中的变量都会被读取为主机或组的变量。比如以下两个文件中的变量都可以作为 dbservers
组的组变量。
1 2
| /etc/ansible/group_vars/dbservers/db_settings /etc/ansible/group_vars/dbservers/cluster_settings
|
inventory参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| ansible_ssh_host: 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port: ssh端口号.如果不是默认的端口号,通过此变量设置.
ansible_ssh_user: 默认的 ssh 用户名
ansible_ssh_pass: ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass: sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe: sudo 命令路径(适用于1.8及以上版本)
ansible_connection: 与主机的连接类型.比如:local, ssh
ansible_ssh_private_key_file: ssh使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
ansible_shell_type: 目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'.
ansible_python_interpreter: 目标主机的Python路径.适用于系统中有多个Python的情况
|
Ansible任务执行
Ansible任务执行基本上可以分为ad-hoc和playbooks两种方式。
ad-hoc模式
使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句shell。
命令格式:ansible [主机名称] -m [模块名称] -a [具体命令]
执行状态:
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
playbooks模式
是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。后续会详细介绍。