Ansible自动化工具的实践 1.Ansible介绍与安装 介绍ansible Ansible目前是运维自动化工具中最简单(2021),已经被红帽收购(2015)。 使用ansible可以轻松对服务器进行初始化配置,安全基线配置,
Ansible自动化工具的实践
1.Ansible介绍与安装
介绍ansible
- Ansible目前是运维自动化工具中最简单(2021),已经被红帽收购(2015)。
- 使用ansible可以轻松对服务器进行初始化配置,安全基线配置,更新等操作。
- 它是基于SSH远程会话协议,不需要客户端程序。
- Ansible专用术语
- Control node 控制节点(控制端)
- Managed node 受控节点(被控制的)
- Inventory 主机清单(受控节点的列表,即是ip或域名或主机名)
- Modules 模块(特定的功能代码)
- Task 任务(在受控节点上执行的操作)
- Playbook 剧本(通过YAML语言编写的重复执行的任务列表)
- Roles 角色(从Ansible 1.2版本开始引入的新特性,做复杂的剧本任务,会有yaml例子文件)
Centos7下安装ansible
yum install epel-release -yyum install ansible -y
查看版本
[root@master ~]# ansible --versionansible 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 = /usr/bin/ansible
python version = 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
2.设置主机清单
Ansible服务的主配置文件
优先级 文件位置高 ./ansible.cfg
中 ~/.ansible.cfg
低 /etc/ansible/ansible.cfg #默认存在
受控主机的列表
- cat /etc/ansible/hosts
192.168.31.161 #centos7-game-01
[test02] #平台、环境
192.168.31.162 #centos6-game-01
初步配置
- 默认是使用公钥方式连接受控主机
- 关闭SSH协议的指纹验证和使用root用户连接
host_key_checking = False #关闭SSH协议的指纹验证
remote_port = 22 ##可以自定义受控主机ssh端口
remote_user = root ##使用root用户连接
显示出受管主机的信息
# ansible-inventory --graph@all:
|--@test01:
| |--192.168.31.161
|--@test02:
| |--192.168.31.162
|--@ungrouped:
3.运行临时命令
使用ansible-doc -l 命令列出所有的模块信息
[root@master ~]# ansible-doc -lfortios_router_community_list Configure community lists in Fortinet's FortiOS and FortiGate
azure_rm_devtestlab_info Get Azure DevTest Lab facts
ecs_taskdefinition register a task definition in ecs
avi_alertscriptconfig Module for setup of AlertScriptConfig Avi RESTful Object
tower_receive Receive assets from Ansible Tower
netapp_e_iscsi_target NetApp E-Series manage iSCSI target configuration
azure_rm_acs Manage an Azure Container Service(ACS) instance
fortios_log_syslogd2_filter Filters for remote system server in Fortinet's FortiOS and FortiGate
junos_rpc Runs an arbitrary RPC over NetConf on an Juniper JUNOS device
na_elementsw_vlan NetApp Element Software Manage VLAN
pn_ospf CLI command to add/remove ospf protocol to a vRouter
pn_snmp_vacm CLI command to create/modify/delete snmp-vacm
cp_mgmt_service_sctp Manages service-sctp objects on Check Point over Web Services API
onyx_ospf Manage OSPF protocol on Mellanox ONYX network devices
icx_command Run arbitrary commands on remote Ruckus ICX 7000 series switches
常用模块
- 模块名称 模块作用
- ping 检查受管节点主机网络是否能够联通。
- yum 安装、更新及卸载软件包。
- yum_repository 管理主机的软件仓库配置文件。
- template 复制模板文件到受管节点主机。
- copy 新建、修改及复制文件。
- user 创建、修改及删除用户。
- group 创建、修改及删除用户组。
- service 启动、关闭及查看服务状态。
- get_url 从网络中下载文件。
- file 设置文件权限及创建快捷方式。
- cron 添加、修改及删除计划任务。
- command 直接执行用户指定的命令。
- shell 直接执行用户指定的命令(支持特殊字符)。
- debug 输出调试或报错信息。
- mount 挂载硬盘设备文件。
- filesystem 格式化硬盘设备文件。
- lineinfile 通过正则表达式修改文件内容。
- setup 收集受管节点主机上的系统及变量信息。
- firewalld 添加、修改及删除防火墙策略。
- lvg 管理主机的物理卷及卷组设备。
- lvol 管理主机的逻辑卷设备。
ansible命令常用的语法
- ansible 受管主机节点 -m 模块名称 [-a 模块参数]
- ansible命令常用参数
- 参数 作用
-i 指定主机清单文件
-m 指定要使用的模块名
-M 指定要使用的模块路径
-S 使用su命令
-T 设置SSH协议连接超时时间
-a 设置传递给模块的参数
—version 查看版本信息
-h 帮助信息
- 示例:简单ping受控主机
# ansible test01 -m ping ##按平台或环境
# ansible 192.168.31.161 -m ping ##按ip单个机器
- 示例2:远程执行命令
4.剧本文件实战
- Ansible服务的剧本(playbook)文件采用YAML语言编写
- 剧本文件的结构由4部分组成:
- target:用于定义要执行剧本的主机范围。
- variable:用于定义剧本执行时要用到的变量。
- task:用于定义将在远程主机上执行的任务列表。
- handler:用于定义执行完成后需要调用的后续任务。
cat >> /etc/ansible/yaml/packages.yml <<EOF
---
- name: 安装软件包
hosts: test01,test02
tasks:
- name: one
yum:
name: vim
state: latest
EOF
# ansible-playbook /etc/ansible/yaml/packages.yml
ok和changed表示执行及修改成功
5.创建及使用角色
- 加载系统内置角色
- 查看角色以及目录
# /usr/share/ansible/roles
- rhel-system-roles.timesync, (unknown version)
- 角色相关的yaml例子剧本
cat /etc/ansible/yaml/timesync.yml
---
- hosts: "{{ targets }}"
vars:
timesync_ntp_servers:
- hostname: 2.pool.ntp.org
pool: yes
iburst: yes
roles:
- rhel-system-roles.timesync
vi /etc/ansible/yaml/timesync.yml #修改去掉角色部分
---
- hosts: "{{ targets }}"
vars:
timesync_ntp_servers:
- hostname: 2.pool.ntp.org
pool: yes
iburst: yes
ansible-playbook /etc/ansible/yaml/timesync.yml
- 从外部获取角色(第三方角色)
- Ansible Galaxy 官网首页:https://galaxy.ansible.com
- 创建新的角色apache
# ansible-galaxy init apache
- Role apache was created successfully
# Ansible角色目录结构及含义
# ll apache/
目录 含义
defaults 包含角色变量的默认值(优先级低)。
files 包含角色执行tasks任务时做引用的静态文件。
handlers 包含角色的处理程序定义。
meta 包含角色的作者、许可证、频台和依赖关系等信息。
README.md
tasks 包含角色所执行的任务。
templates 包含角色任务所使用的Jinja2模板。
tests 包含用于测试角色的剧本文件。
vars 包含角色变量的默认值(优先级高)。
- 使用新的角色
---
- name: 调用自建角色
hosts: all
roles:
- apache
EOF
# ansible-playbook /etc/ansible/yaml/roles.yml
小结下:复杂的操作还是远程执行脚本比较好
6.简单使用
1.批量远程命令执行# ansible all -m shell -a "yum install vim -y"
2.批量远程脚本执行
mkdir /etc/ansible/script/
cat > /etc/ansible/script/nginx-install.sh << EOF
echo "开始安装nginx" > /tmp/nginx-install.log
echo "安装nginx成功" >> /tmp/nginx-install.log
EOF
# ansible all -m script -a "/etc/ansible/script/nginx-install.sh"
3.批量分发文件
mkdir /etc/ansible/file
cat > /etc/ansible/file/copy-test-txt.yml << EOF
---
- name: 拷贝本地文件到受控机器上
hosts: all
tasks:
- name:
copy:
src: /etc/ansible/file/test.txt
dest: /root/a/test.txt
owner: root
group: root
mode: 0644
EOF
ansible-playbook /etc/ansible/file/copy-test-txt.yml