Ansible自动化运维逆袭之路
** 什么是Ansible?**
ansible是一款基于python语言开发的自动化运维工具,主要功能有:
1. 批量执行远程命令,可以对远程的多台主机同时进行命令的执行
2. 批量安装和配置软件服务,可以对远程的多台主机进行自动化的方法配置和管理各种服务
3. 编排高级的企业级复杂的IT架构任务,ansible的playbook和role可以轻松实现大型IT架构任务
4. 提供自动化运维工具的开发API接口,例如:jumpserver工具等就是基于ansible实现自动化管理。
特点:
1. 基于python语言实现
2. 模块化: 调用特定的模块完成特定的任务,支持自定义模块
3. 部署简单
4. 幂等性:支持多次执行
5. 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
ansible工作原理以及架构
Ansible 典型的工作方式是通过一个脚本文件(基于 YAML 格式构建的)去控制远端操作系统按照特定的顺序执行相关任务,我们称这个文件为 playbook;
架构图

INVENTORY: Ansible管理主机的清单/etc/ansible/hosts
MODULES: Ansible执行命令的功能模块,多为内置模块使用
PLUGINSl:模块功能的补充,如链接类型插件等
API:供第三方程序调用的应用程序编程接口
ansible之YUM安装
安装
yum -y install ansible(机器有源的情况下使用)
检验安装是否成功
ansible --version
ansible之rpm包形式安装

Ansible相关文件
主配置文件
修改/etc/ansible/ansible.cfg
host_key_checking = False 修改为True
配置文件中其余地方则不需要修改
主配置文件修改
host_key_checking = False
inventory主机清单文件
默认的主机清单文件为/etc/ansible/hosts,在实际的运维工作中也可以自行创建一个hosts文件,不影响使用
inventory 常用参数
ansible_ssh_host 将要连接的远程主机名
ansible_ssh_port ssh端口号,如果不为默认端口,可用此配置
ansible_ssh_user 默认色ssh用户名
ansible_ssh_pass ssh密码
ansible_sudo_pass sudo密码
例
[webserver]
host1 ansible_ssh_user='root' ansible_ssh_pass='666666' ansible_ssh_port='2222'
host2 ansible_ssh_user='root' ansible_ssh_pass='666666' ansible_ssh_port='2222'
host3 ansible_ssh_user='root' ansible_ssh_pass='666666' ansible_ssh_port='2222'
host4 ansible_ssh_user='root' ansible_ssh_pass='666666' ansible_ssh_port='2222'
Ansible实现管理的主要方式
ansible Ad-Hoc(点对点模式) 利用ansible命令执行操作
Role(角色) 编写playbook剧本执行操作
模块使用帮助手册
ansibe-doc -l 列出可用模块
asnible-doc -s 显示知道模块的playbook片段
常用参数
1、-i 当采用自定义hosts文件时,则在执行ansible任务时需要添加-i参数
2、-m 指定使用的模块
3、-k 执行ansible任务时提示输入被控主机密码
4、-v/-vvv 显示ansible的执行过程,-vvv比-v更详细
5、-C 测试yaml文件不执行
6、-e 当在独立的yml文件中定义了变量时,在执行时采用-e 变量名:变量值来操作
7、--list 显示主机列表
8、-T 执行命令的超时时间
9、-u 执行远程执行的用户
10、-b 代替旧版的sudo切换
11、ansible-doc --help Ansible查看帮助,等价于linux的man命令
12、ansible-doc -s 模块名 查看指定模块的帮助语法 -l 查看所有模块的帮助语法
13、ansible-galaxy init xxx 快速创建一个角色适用于编写role任务时使用
常用模块
1、command模块
功能: 在远程主机执行命令,此为默认模块,不具有幂等性
ansible -i hosts all -m command -a "systemctl start nginx"
2、shell模块
功能: 执行shell命令。支持各种符号
ansible -i hosts -m shell -a "echo $HOSTNAME"
3、script模块
功能: 在远程主机上执行ansible服务器上的脚本(无需执行权限)
ansible -i hosts -m script -a /export/test.sh
4、copy模块
功能: 从ansible服务器复制文件到远程主机
可以在使用copy模块时使用owner、mode、backup。当目标文件存在时,先指定备份
ansible -i hosts -m copy -a "src=原文件路径 dest=目标文件路径 owner=属主 mode=xxx backup=yes"
5、file模块
功能: 设置文件属性,创建文件或目录、软链接等
ansible -i hosts -m file -a 'path=要创建的文件或目录 state=touch(directory)' 创建文件或目录
ansible -i hosts -m file -a 'src=原文件路径 path=软链接文件路径 state=link' 创建软链接
ansible -i hosts -m file -a "path=目录 state=directory owner=xx group=xx" 递归修改目录属性,但不递归至子目录
ansible -i hosts -m file -a "path=目录 state=directory owner=xx group=xx recurse=yes" 递归修改目录属性,同时递归至子目录
6、unarchive模块
功能: 解包解压缩
用法:
将ansible服务器上的压缩包传到远程机后解压至特定目录(remote_src: 当为yes时代表文件在远程主机上,为no时代表文件在ansible主机上)
ansible -i hosts -m unarchive -a 'src=压缩包原路径 dest=压缩包解压的目标路径 remote_src=no'
将远程主机上的某个压缩包解压到指定路径下
ansible -i hosts -m unarchive -a 'src=压缩包原路径 dest=压缩包解压的目标路径 remote_src=yes'
7、lineinfile模块
功能1: 在配置文件中循环添加n行配置文件
用法:
- name: add hosts
lineinfile:
path: /xx/xx
line: "{{ item }}"
insertafter: 'AFTER THIS FILE'
state: present
with_items:
- 'xxx'
- 'xxx'
功能2: 检查配置文件中是否有对应的文件内容,如果有则进行替换,没有则不进行操作
用法:
---
- name: Ensure /etc/hosts.allow has the correct sshd entry
hosts: all
become: yes
tasks:
- name: Ensure the correct sshd entry is present in /etc/hosts.allow
lineinfile:
path: /etc/hosts.allow
regexp: '^sshd:10\.192\.10\.0/255\.255\.255\.0:allow'
line: 'sshd:10.192.10.0/255.255.255.128:allow'
backrefs: yes
参数详解:
backrefs:
当backrefs为no时,如果regex没有匹配到行,则添加一行,如果Regx匹配到行,则修改该行
当backrefs为yes时,如果regex没有匹配到行,则保持原文件不变,如果regex匹配到行,则修改该行
backrefs默认为no,所以上面那个示例中,我们没有配置backrefs,而默认没有匹配,则修改。
backup:
是否备份原文件,默认为no
8、cron模块
功能: 定时任务模块
用法:
ansible -i hosts all -m cron -a 'name="synctime" job="/usr/sbin/ntpdate 1.2.3.4" minute=*/10'
ansible -i hosts all -m cron -a 'name="synctime" state=absent'
9、setup模块
功能: 获取服务器相关信息
用法:
ansible -i host all -m setup -a "filter=xxxx"
ansible_all_ipv4_addresses:仅显示ipv4的信息。
ansible_devices:仅显示磁盘设备信息。
ansible_distribution:显示是什么系统,例:centos,suse等。
ansible_distribution_major_version:显示是系统主版本。
ansible_distribution_version:仅显示系统版本。
ansible_machine:显示系统类型,例:32位,还是64位。
ansible_eth0:仅显示eth0的信息。
ansible_hostname:仅显示主机名。
ansible_kernel:仅显示内核版本。
ansible_lvm:显示lvm相关信息。
ansible_memtotal_mb:显示系统总内存。
ansible_memfree_mb:显示可用系统内存。
ansible_memory_mb:详细显示内存情况。
ansible_swaptotal_mb:显示总的swap内存。
ansible_swapfree_mb:显示swap内存的可用内存。
ansible_mounts:显示系统磁盘挂载情况。
ansible_processor:显示cpu个数(具体显示每个cpu的型号)。