目录
Ansible的起源
Ansible的发展史
Ansible的功能
Ansible的特性
Ansible的架构
Ansible的注意事项
Ansible入门
Ansible的安装
Ansible配置文件
配置文件解析
inventory主机配置清单
Ansible相关工具
Ansible的常用模块
Command模块
shell模块
Script模块
Copy模块
Fetch模块
File模块
Yum和Apt模块
service模块
User模块
Group模块
Setup模块
Playbook
playbook介绍
三种常见的数据格式
playbook核心组件
Hosts组件
remote_user组件
task列表和action组件
Ansible的起源
Ansible的发展史
ansible的名称来源于科幻小说《安德的游戏》中跨越时空的即时通讯工具,可以在相距数光年的距离,远程实时控制前线舰队战斗。
于2012年3月9日发布0.0.1版,2015年10月17日,Red Hat宣布以1.5亿美元收购
Ansible的功能
批量执行远程命令,可以对远程的多台主机同时进行命令的执行
批量安装和配置软件服务,可以对远程多台主机进行自动化方式配置和管理各 种服务
编排高级的企业复杂的IT架构任务,Ansible的Playbook和role可以轻松实现大型 的IT复杂架构
提供自动化运维工具的开发API,有很多运维工具,如jumpserver就是基于 ansible实现自动化管理
Ansible的特性
基于Python语言实现
模块化:调用特定模块完成特定任务,支持自定义模块,可使用任意编程语言 编写模块
部署简单:基于python和ssh,agentless,无需代理不依赖PKI(无需ssl)
安全,基于OpenSSH
幂等性:一个任务执行一遍和执行n遍效果一样,不因重复执行带来意外情况, 此特性非绝对
支持playbook编排任务, YAML格式,编排任务,支持丰富的数据结构 较强大的多层解决方案role
Ansible的架构
组合INVENTORY、API、MODULES、PLUGINS,为ansible命令工具,其为核心执行工具
INVENTORY: Ansible管理主机的清单,一般默认路径为 /etc/ansible/hosts
MODULES: Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
PLUGINS: 模块功能的补充,如连接类型插件,循环插件,变量插件,过滤插 件等
API: 供第三方程序调用的应用程序编程接口
Ansible的注意事项
执行ansible的主机一般称为管理端,主控端,中控,master或堡垒机
主控端Python版本需要2.6及以上
被控端Python版本小于2.4,需要安装python-simplejson
被控端如开启SELinux,需要安装libselinux-python
windows不能作为主控端
Ansible入门
Ansible的安装
官方文档
https: docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-ansible-on-specific-operating-systems
3.1.1下载
下载地址:https: releases.ansible.com/ansible/
pip下载: https: pypi.org/project/ansible/
包安装:要先安装epel源
yum install -y ansible
查看ansible版本
yum info ansible
pip安装
yum install -y python-pip
pip install --upgrade pip -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com # 可以忽略
pip install ansible --upgrade -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
确认安装
ansible --version
Ansible配置文件
/etc/ansible/ansible.cfg ansible主配置文件,配置ansible工作特性
/etc/ansible/hosts 主机清单文件,注意:不是/etc/hosts文件
/etc/ansible/roles 角色存放目录
配置文件解析
#host_key_checking = False 推荐取消注释,实现第一次连接自动信任目标主机
inventory主机配置清单
默认inventory_file为/etc/ansible/hosts
inventory_file 可以有多个,也可以通过Dynamic Inventory动态生成
建议生产环境中,在每个项目的目录下创建独立的hosts文件
# Inventory参数说明
ansible_ssh_host # 将要连接的远程主机名,与想要设定的主机别名 不同时,可以通过此变量设置
ansible_ssh_port # 远程主机ssh端口,如果不是默认端口号,可以 通过此变量设置,如:ip:port(xxx.xxx.xxx.xxx:2222)
ansible_ssh_user
ansible_ssh_pass
行 ask-pass 参数或 ssh密钥形式) ansible_sudo_pass
sudo-pass 参数)
ansible_sudo_exe
ansible_connection
paramiko.
ansible_ssh_provate_key_file ansible_shell_type
为 csh 或 fish ansible_python_interpreter 个python环境,或路径不是/usr/bin/python情况
# 默认ssh用户名
# ssh密码(不推荐,此方法不安全,可以使用命令
# sudo密码(不推荐, 建议使用命令行 ask- # sudo命令路径(适用于1.8及以上版本)
# 与主机连接类型,如: local,ssh 或 # ssh使用的私钥,适用于多个密钥
# 目标系统shell类型,默认使用 sh ,可以设置 # 目标主机python路径,适用情况:系统中存在多
Ansible相关工具
/usr/bin/ansible 主程序,命令行执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具s
Ansible的常用模块
Command模块
功能:在远程主机执行命令,此为默认模块,可忽略 “-m” 选项
此命令不支持 $VARNAME<>|;&等,可以用shell模块实现
此命令不具有幂等性
shell模块
功能:和command类似
支持各种符号,如 $VARNAME<>|;&等
不具有幂等性
示例:
ansible websrvs -m shell -a 'echo $HOSTNAME'
ansible all -m shell -a
注意事项:调用bash执行复杂命令,shell模块也可能会调用失败
解决办法:将复杂命令写入脚本,copy至远程服务器,执行完成后,返回执行
Script模块
功能:再远程主机上运行ansible服务器上的脚本(无需执行权限)
不具有幂等性
ansible websrvs -m script -a /tmp/test.sh
Copy模块
功能:从ansible服务器主控端复制文件到远程主机
注意:src=file 如果没有指明路径,则为当前目录或当前目录下的files目录下的 file文件
# 如果目标存在,默认为覆盖,可以指定为备份
$ ansible websrvs -m copy -a "src=/root/test1.sh dest=/tmp/test2.sh owner=admin mode=600 backup=yes"
# 指定内容,直接生成目标
$ ansible websrvs -m copy -a "content='test line1\ntest line2\n' dest=/tmp/test.txt"
# 复制/etc目录自身,注意/etc后面不带/
$ ansible websrvs -m copy -a "src=/etc dest=/backup"
# 复制/etc下文件,不包括/etc自身,注意/etc后面带/
$ ansible websrvs -m copy -a "src=/etc/ dest=/backup"
Fetch模块
功能:从远程主机提取文件至ansible主控端,与copy相反,暂不支持目录
$ ansible websrvs -m fetch -a "src=/root/test.sh dest=/data/scripts"
$ ansible websrvs -m fetch -a "src=/etc/redhat-release dest=/data/os"
File模块
功能:设置文件属性,创建软链接等
# 创建空文件
$ ansible all -m file -a 'path=/data/test.txt state=touch'
$ ansible all -m file -a 'path=/data/test.txt state=absent'
$ ansible all -m file -a 'path=/root/test.sh owner=admin mode=755'
# 创建目录
$ ansible all -m file -a 'path=/data/mysql state=directory'
# 创建软链接
$ ansible all -m file -a 'src=/data/testfile dest=/data/testfile-link state=link'
# 递归修改目录属性,但不递归至子目录
$ ansible all -m file -a 'path=/data/mysql state=directory owner=mysql group=mysql'= chown
# 递归修改目录及子目录属性
$ ansible all -m file -a 'path=/data/mysql state=directory owner=mysql group=mysql recurse=yes' = chown -R
Yum和Apt模块
功能:yum管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其他版本;
apt模块管理Debian相关版本的软件包
# 安装软件包
$ ansible websrvs -m yum -a 'name=httpd state=present'
# 启用epel源安装软件包
$ ansible websrvs -m yum -a 'name=nginx state=present enablerepo=epel'
# 升级除kernel和foo开头外的所有包
$ ansible websrvs -m yum -a 'name=* state=lastest exclude=kernel*,foo*'
# 删除(卸载)
$ ansible websrvs -m yum -a 'name=httpd state=absent'
# 查看包
$ ansible websrvs -m yum -a 'list=tree'
service模块
功能:管理服务
# 启动服务,并设置开机启动
$ ansible all -m service -a 'name=httpd state=started enabled=yes'
# 停止服务
$ ansible all -m service -a 'name=httpd state=stopped'
# 重载服务
$ ansible all -m service -a 'name=httpd state=reloaded'
# 重启服务
$ ansible all -m service -a 'name=httpd state=restarted'
User模块
# 创建用户
$ ansible all -m user -a 'name=user1 comment="test user" uid=2000 home=/app/user1 group=root'
$ ansible all -m user -a 'name=nginx comment=nginx uid=1000
group=nginx groups="root,daemon" shell=/sbin/nologin system=yes
create_home=no home=/data/nginx non_unique=yes'
# 删除用户及其家目录
$ ansible all -m user -a 'name=nginx state=absent remove=yes'
Group模块
功能:管理用户组
# 创建组
$ ansible websrvs -m group -a 'name=nginx gid=1000 system=yes'
# 删除组
$ ansible websrvs -m group -a 'name=nginx state=absent'
Setup模块
功能:setup模块用来收集主机系统信息,这些facts信息可以直接以变量形式使用,但如果主机较多,会影响执行速度,可以使用gather_facts: no禁止ansible收集信息
$ ansible all -m setup
$ ansible all -m setup -a "filter=ansible_nodename"
$ ansible all -m setup -a "filter=ansible_hostname"
$ ansible all -m setup -a "filter=ansible_domain"
$ ansible all -m setup -a "filter=ansible_memtotal_mb"
$ ansible all -m setup -a "filter=ansible_memory_mb"
$ ansible all -m setup -a "filter=ansible_memfree_mb"
$ ansible all -m setup -a "filter=ansible_os_family"
$ ansible all -m setup -a "filter=ansible_distribution_major_version"
$ ansible all -m setup -a "filter=ansible_distribution_version" $ ansible all -m setup -a "filter=ansible_processor_vcpus"
# 获取所有IP地址
$ ansible all -m setup -a "filter=ansible_all_ipv4_addtrsses"
$ ansible all -m setup -a "filter=ansible_architecture"
$ ansible all -m setup -a "filter=ansible_uptime_seconds"
$ ansible all -m setup -a "filter=ansible_processor*"
$ ansible all -m setup -a "filter=ansible_env"
Playbook
playbook介绍
playbook剧本是由一个或多个“play”组成的列表 play的主要功能在于将预定义的一组主机,装扮成事先过ansible中的task定义好的角色
task是调用ansible的一个模块,将多个play组织再一个playbook中,即可以联合 起来,按事先编排好的机制执行预定义的动作
playbook文件采用YAML语言编写
三种常见的数据格式
XML:Extensible Markup Language,可扩展标记语言,可用于数据交换和配置
JSON:JavaScript Object Notation,JavaScript对象标记法,主要用来数据交换或配置,不支持注释
YAML:YAML Ain't Markup Language,YAML不是一种标记语言,主要用来配置,大小写敏感,不支持tab
可以用工具相互转换,参考网站:
https: www.json2yaml.com/
https: www.bejson.com/json/json2yaml/
playbook核心组件
一个playbook中由多个组件组成,其中所用到的常见组件类型如下: Hosts:执行的远程主机列表
Tasks:任务集,由多个task远程组成的列表,每个task都是一个字典,一个完整 的代码块功能需最少元素包括name和task,一个name只能有一个task
Variables:内置变量或自定义变量在playbook中调用 Templates:模板,可替换模板文件中的变量并实现一些简单逻辑文件 Hnadlers和notify结合使用,由特定条件触发的操作,满足条件方可执行
Tags:标签,指定某条任务执行,用于选择运行playbook中的部分代码。ansible 具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试器 确实没有发生变化的时候,依然会非常的长,此时,如果确信其没有变化,就 可以通过tags跳过这些代码片段
Hosts组件
playbook中的每个play的目的都是为了让特定主机以某个指定用户身份执行任务
hosts主要用于指定要执行的任务主机,须事先定义在主机清单中
示例:
- hosts: websrvs
- hosts: 192.168.0.21
- hosts: websrvs:appsrvs # 两个组的并集
- hosts: websrvs:&appsrvs # 两个组的交集
- hosts: websrvs:!appsrvs # 在websrvs组中,但不在appsrvs中
remote_user组件
可用于Host和Task中,也可以通过指定其通过sudo方式在远程主机上执行任
务,其可用于play全局或某个任务中 可以在sudo时使用sudo_user指定sudo时切换的用户,默认为root
示例:
- hosts: websrvs
remote_user: root
tasks:
- name: test connection
ping:
remote_user: admin
sudo: yes
sudo_user: yuan
# become: yes
# become_user: yuan
task列表和action组件
play主体部分是task list,task list有一个或多个task,每个task按次序逐个在hosts 中指定的所有主机上执行,即在所有主机上执行完一个task后,再执行下一个 task
task的目的是使用指定的参数执行模块,再模块参数中可以使用变量。模块执行 为幂等的,意味着多次执行是安全的,其结果一致
每个task都应该有其name,用于playbook执行结果输出,建议其内容能够清晰描 述任务执行步骤,如果没有提供name,则action的结果将用于输出
task两种格式:
action: module arguments #示例: ac
示例1:
- hosts: websrvs
remote_user: root
gather_facts: no # 不收集系统信息,提高执行效率
tasks:
- name: test network connection
ping:
- name: excute command
command: wall "hello world!"
Playbook命令
ansible-playbook <filename.yaml> [options] 常见选项:
--syntax-check -C, --check
作,dry run
--list-hosts
--list-tags
--list-tasks
--limit 主机列表
-i INVENTORY
语法检查,可缩写为--syntax,相当于bash -n 模拟执行,只检测可能会发生的变化,但不真正执行操
列出运行任务的主机 列出tag
列出task 只针对主机列表中的特定主机执行
指定主机清单文件,通常一个项对应一个主机清单文件
--start-at-task START_AT_TASK 从指定的task开始执行任务,而不是从开
头开始,START_AT_TASK 为任务名称
-v, -vv, -vvv 显示具体执行过程,详细程度根据-v数量变化