Ansible管理工具
什么是Ansible?
ansible是轻量级自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能 ansible基于ssh来和远程主机通讯的,所以不需要在远程主机上安装client/agentsAnsible特点:
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作
- 默认使用SSH协议对设备进行管理
- 有大量常规运维操作模块,可实现日常绝大部分操作
- 配置简单、功能强大、扩展性强
- 支持API及自定义模块,可通过Python轻松扩展
- 通过Playbooks来定制强大的配置、状态管理
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可
- 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台
Ansible基本架构
Ansible:Ansible核心程序
Host Inventory:记录由Ansible管理的主机信息(默认是在Ansible的hosts配置文件中定义被管理主机),包括端口、密码、ip等
Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能
Core Modules:核心模块,主要操作是通过调用核心模块来完成管理任务
Custom Modules:自定义模块,完成核心模块无法完成的功能,支持多种语言
Connection Plugins:连接插件,Ansible和Host通信使用
一、安装配置ansible
注意:ansible版本和python版本的兼容性
配置文件目录:/etc/ansible
执行文件目录:/usr/bin
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible
Help文档目录:/usr/share/doc/ansible-X.X.X
Man文档目录:/usr/share/man/man1
1.安装依赖包和ansible
CentOS安装
yum -y install epel-release
yum -y install ansible
Ubuntu安装
apt -y install ansible
我们可以通过ansible --version命令查看版本和配置文件路径,默认都是/etc/ansible路径下
root@test:~# ansible --version
ansible 2.10.8
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 3.10.6 (main, Mar 10 2023, 10:55:28) [GCC 11.3.0]
ubuntu安装可能存在默认没有配置文件需要我们手动下载
wget https://raw.githubusercontent.com/ansible/ansible/stable-2.9/examples/ansible.cfg -O /ect/ansible/ansible.cfg
我们需要修改一下配置项
vim /etc/ansible/ansible.cfg
------------------------------
[default]
inventory = /etc/ansible/hosts
host_key_checking = False
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
2.配置主机清单:
vim /etc/hosts
-------------------
[webserver]
192.168.31.101
192.168.31.102 ansible_ssh_port=1022 ansible_user=root
[dbserver]
192.168.31.103
3.配置无密码登陆
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa root@192.168.31.101
ssh-copy-id -i /root/.ssh/id_rsa root@192.168.31.102
ssh-copy-id -i /root/.ssh/id_rsa root@192.168.31.103
二、Ansible命令使用
ansible常用模块命令格式
基础命令选项
-h:来查看帮助,下面我们列出一些比较常用的选项,并解释其含义:
-a:MODULE_ARGS#模块的参数,如果执行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”等等
-k:–ask-pass:#ask for SSH password,登录密码,提示输入SSH密码而不是假设基于密钥的验证
–ask-su-pass:#ask for su password,su切换密码
-K:–ask-sudo-pass#ask for sudo password,提示密码使用sudo,sudo表示提权操作
–ask-vault-pass#ask for vault password,假设我们设定了加密的密码,则用该选项进行访问
-B:SECONDS#后台运行超时时间
-C:#模拟运行环境并进行预运行,可以进行查错测试
-c:CONNECTION#连接类型使用
-f:FORKS#并行任务数,默认为5
-i:INVENTORY#指定主机清单的路径,默认为/etc/ansible/hosts
–list-hosts:#查看有哪些主机组
-m:MODULE_NAME#执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
-o:压缩输出,尝试将所有结果在一行输出,一般针对收集工具使用
-S:用su命令
-R:SU_USER#指定 su 的用户,默认为 root 用户
-s:用sudo命令
-U:SUDO_USER#指定 sudo 到哪个用户,默认为 root 用
-T:TIMEOUT#指定 ssh 默认超时时间,默认为10s,也可在配置文件中修改
-u:REMOTE_USER#远程用户,默认为 root 用户
-v:查看详细信息,同时支持-vvv,-vvvv可查看更详细信息
查看模块:ansible-doc -l
查看具体模块的信息:ansbile-doc -s command
ansible常用模块
注意:除了raw模块和script模块,其他模块都要依赖于目标服务器安装Python环境,否则无法正常使用!!!
1.command模块
用于在被管理主机上运行命令
ansible webserver -m command -a 'date'
2.cron模块
用于在被管理主机上管理计划任务
persent:添加
absent:移除,其使用的语法跟我们的crontab文件中的语法一致,同时,可以指定以下选项:
day:日应该运行的工作( 1-31, , /2, )
hour:小时 ( 0-23, , /2, )
minute:分钟( 0-59, , /2, )
month:月( 1-12, *, /2, )
weekday:周 ( 0-6 for Sunday-Saturday, )
job:指明运行的命令是什么
name:定时任务描述
ansible dbserver -m cron -a 'name="host reboot" minute="30" hour="22" job="/usr/sbin/reboot"'
3.user模块
用于创建用户
ansible all -m user -a 'name="test"'
4.group模块
用于创建组
ansible all -m group -a 'name=test'
5.copy模块
用于复制本地文件到管理的服务器
ansible all -m copy -a 'src=/etc/fstab dest=/home/fstab.test owner=root mode=744'
6.file模块
用于修改文件属性
ansible all -m file -a 'owner=test group=test mode=644 path=/home/fstab.test'
7.ping模块
用于ping测试
ansible all -m ping
8.service模块
用于设置修改服务状态
ansible webserver -m service -a 'enabled=true name=httpd state=started'
9.shell模块
shell模块可以在远程主机上调用shell解释器运行命令
ansible dbserver -m shell -a 'echo 123456 | passwd --stdin zhangsan'
10.script模块
用于将本地脚本复制到被管理主机进行运行
ansible webserver -m script -a '/root/ping.sh'
11.yum模块
用于yum安装软件
ansible webserver -m yum -a 'name=httpd state=present'
12.setupt模块
该模块主要用于收集信息,是通过调用facts组件来实现的
比如查看内存:
ansible webserver -m setup -a 'filter="*mem*"'
13.fetch 模块
该模块用于从远程某主机获取(复制)文件到本地
ansible webserver -m fetch -a 'src=/data/hello dest=/data'
三、playbook的使用
playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活,主要可以用来多机部署,你可以把它理解成一种脚本,可以一次性运行一系列操作
playbook格式
playbook采用的是yaml语言
语法说明
- YAML 的配置文件后缀为.yml
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- #表示注释,从这个字符一直到行尾,都会被解析器忽略
核心元素
hosts:指定要执行指定任务的主机
remote_user:指定执行任务的时候使用的用户
tasks:任务集,一个脚本文件有一个或者多个task,所有主机完成一个task后,再开始下一个task
variables:内置变量或自定义变量,用于playbook中调用
templates:模板
handlers和notify
handlers和notify配合使用,由特定条件触发的操作,满足条件则执行,否则不执行
tags:标签
例如:指定服务器yum安装nginx
shell脚本:
#!/bin/bash
yum -y install openssl openssl-devel pcre-devel curl-devel freetype-devel
yum -y install nginx
cp /tmp/nginx.conf /etc/nginx/
mkdir -p /var/www/html
cp /tmp/index.conf /var/www/html/
systemctl start nginx && systemctl enable nginx
playbook脚本:
---
- hosts: web_server
remote_user: root
tasks:
- name: "安装依赖包"
shell: yum -y install openssl openssl-devel pcre-devel curl-devel freetype-devel
- name: "yum install nginx"
yum:
name: nginx
- name: "复制配置文件"
copy:
src: /tmp/nginx.conf
dest: /etc/nginx/
- name: "创建网页存放目录"
file:
dest: /var/www/html
state: directory
- name: "复制网页文件"
copy: src=/tmp/index.html dest=/var/www/html/
- name: "启动nginx,并设置开机启动"
service: name=nginx state=started enable=yes
playbook安装实例
1.使用playbook远程安装httpd
vim installhttpd.yaml
--------------------------------
---
- hosts: webserver
remote_user: root
tasks:
- name: install Apache
yum:
name: httpd
state: installed
- lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen '
line: 'Listen 8080'
- replace:
path: /etc/httpd/conf/httpd.conf
regexp: '^#(ServerName).*'
replace: '\1 localhost'
- service:
name: httpd
enabled: yes
state: restarted
- name: Create wwwroot directory
file:
dest: /var/www/html
state: directory
- copy:
src: /root/index.html
dest: /var/www/html/index.html
运行playbook直接远程管理安装
ansible-playbook installhttpd.yaml
2.使用playbook远程安装nginx
vim installnginx.yaml
----------------------------
---
tasks:
- name: add repo
yum_repository:
name: nginx
description: nginx repo
baseurl: http://nginx.org/packages/centos/7/$basearch/
gpgcheck: no
enabled: 1
- name: install centos plungins
shell: yum -y install zlib zlib-devel openssl openssl-devel pcre-devel wget gcc gcc++ autoconf automake
- name: Install nginx
yum:
name: nginx
state: installed
- name: Copy nginx configuration file
copy:
src: /root/nginx.conf
dest: /etc/nginx/nginx.conf
- name: Create wwwroot directory
file:
dest: /var/www/nginx
state: directory
- name: Create test page index.html
shell: echo "<h1>Congratulations on the successful installation of Nginx!!!</h1>" > /var/www/nginx/index.html
- name: Start nginx
service:
name: nginx
state: started
运行playbook直接远程管理安装
ansible-playbook installnginx.yaml