什么是ansible
自动化运维工具,也称机器管理工具。
可以实现批量管理成百上千的多台主机。
是应用级别的跨主机编排工具。
ansible特性
1)无客户端agent的存在,不需要在被控制的节点上安装客户端应用。
2)通过ssh协议与被控制节点通信
3)基于模块工作的,可以通过模块实现在被控制节点上执行相应的命令操作
4)很多模块具有幂等性,即可实现多次模块操作的状态,如果没有发生改变,则不会重复执行
ansible命令格式
bash
ansible 组名 -m 模块名 -a '模块参数'
定义组名:在/etc/ansible/hosts
模块:默认使用command模块
查看模块
bash
列出当前ansible的所有模块
ansible-doc -l
查看指定模块的信息
ansibe-doc -s 模块名
ansible 的常用模块
模块名 | 作用 | 指定参数 |
---|---|---|
cimmand | 在远程主机执行 Linux命令,但不支持管道符、重定向等特殊符号,是 ansible的默认模块 | chdir、creates、removes |
shell | 在远程主机执行 Linux命令,支持管道符、重定向等特殊符号 | chdir、creates、removes |
cron | 在远程主机设置 crontab计划任务 | minute(分)、hour(时)、day(日)、month(月)、weekday(周)、jod(指定执行的内容)、name(任务的名称)、 state=present(添加状态)|absent(删除状态) |
user | 在远程主机设管理用户账户 | name、uid、group、groups、shell、create_home、remove、state=present|absent |
group | 在远程主机设管理组账户 | name、gid、state=present|absent |
copy | 将 ansible控制节点的文件/目录/内容复制到远程主机 | src(指定源文件的路径)、dest(指定目标路径)、content(指定复制的内容)、mode(设置文件权限)、owner(设置文件名和组名)、group(设置文件名和组名) |
file | 在远程主机管理文件/目录 | path(指定文件路径)、mode(指定权限)、owner(设置文件名和组名)、group(设置文件名和组名)、state=absent(删除文件)|touch(创建空文件)|directory(空目录)|link(创建软连接) src(指定软链接的源路径,path指定软链接文件理解) |
hostname | 在远程主机设置主机名 | name |
ping | 检测与远程主机的连通性 | |
yum|apt | 在远程主机使用 yum|apt-get管理软件包 | name、state=present|absent|latest |
service|systemd | 在远程主机使用systemctl管理服务状态 | name、state=started(启动)|stopped(停止)|restarted(重启)|reloaded(重载)、enabled(开机启动)=yes|no|true|false |
script | 在远程主机执行ansible主机上的 shell脚本 | |
mount | 在远程主机执行挂载、解挂操作 | src、path、fstype、state=mounted|unmounted|absent、opts |
archive | 在远程主机压缩文件/目录 | path、dest、format、remove |
unarchive | 将 ansible主机上的或远程主机上的压缩包解压缩到远程主机的指定位置 | copy(remote_src)、src、dest |
replace | 在远程主机修改通过正则表达式匹配的文件内容 | path、regexp、replace、after、before、backup |
setup | 查询远程主机的系统信息(facts信息) | filter |
ansible管理多台主机
incentory主机清单管理
主机清单配置文件 /etc/ansible/hosts
格式:
bash
[组名]
主机IP[:ssh端口] #默认是 22 端口
主机名[:ssh端口]
主机IP[0:255] #设置连续的主机列表范围[0-255]
主机名[a:z]
ansible_port= 端口号
ansible_user= 用户名
ansible_password= 密码 #设置主机变量
[组名:vars] #设置组变量
ansible_port=
ansible_user=
ansible_password=
[大组名:children] #设置嵌套组
组名1
组名2
组名3
playbook剧本
bash
vim XXX.yaml XXX.yml
--- #代表yaml文件开始
- name: #设置play的名称
hosts: #指定执行此play的远程主机组
remote_user: #指定执行此play的用户,不指定默认root
gather_facts: #设置是否收集facts信息 yes|no|true|false
task: #指定此play的任务列表
- name: #定义任务的名称
模块名: 模块参数 #定义任务要使用的模块和参数(键值对格式)
- name:
模块名: 模块参数
ignore_errors: true #忽略此任务的失败
- name:
模块名: 模块参数
notify: '任务名' #定义此任务执行结果为changed状态时要触发的handler任务
- name:
模块名:模块参数
when: #定义条件表达式(== != > >= < <=),条件成立时执行此task任务,否则不执行此任务
- name:
模块名:模块参数={{item}}
with_items #定义循环列表
- name:
模块名:模块参数
tags: #定义任务的标签,ansible-playbook --tags="标签"可实现仅执行拥有指定标签的任务(拥有always标签的任务总是执行)
-标签1
-标签2
handlers:
- name: 任务名
模块名: 模块参数
playbook选项
bash
//运行playbook
ansible-playbook test1.yaml
//补充参数:
-k(--ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
ansible-playbook test1.yaml --syntax-check #检查yaml文件的语法是否正确
ansible-playbook test1.yaml --list-task #检查tasks任务
ansible-playbook test1.yaml --list-hosts #检查生效的主机
ansible-playbook test1.yaml --start-at-task='install httpd' #指定从某个task开始运行
task任务的模块语法格式
横向格式:
bash
模块名:参数1=值 参数2={{ 变量名 }} ......
纵向格式:
bash
模块名:
参数1:值
参数2:"{{ 变量名 }}"
......
with_items 和 vars的语法格式
横向格式
bash
值为纯量类型时:
with_items:[值1,值2,......]
vars:
变量名:[值1,值2,......]
值为对象类型(键值对字段)时:
with_items:
-{key1:值1,key2:值2}
-{key1:值3,key2:值4}
......
纵向格式
bash
-name:
with_items:
-值1
-值2
......
vars:
变量名:
-值1
-值2
......
tasks:
-names:
模块名:
with_items:"{{变量名}}"
值为对象类型(键值对字段时):
with_items:
-key1:值1
key2:值2
-key1:值3
key2:值4
......
vars:
变量名:
-key1:值1
key2:值2
-key1:值3
key2:值4
......
多台主机编译安装nginx
1.免交互
bash
1.下载ssh的服务
yum -y install sshpass.x86_64
2.配置密钥对验证
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
sshpass -p '123' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.116.22
sshpass -p '123' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.116.23
2.在管理端配置ansible
bash
yum install -y epel-release //先安装 epel 源
yum install -y ansible
在webservers组里设置源码编译安装nginx
bash
vim /etc/ansible/hosts
确定另外两台被管理的主机环境
3.添加剧本,源码编译安装nginx
bash
---
- name:third play for install nginx with source
gather_facts:false
hosts:webservers
remote_user:root
tasks:
#关闭防火墙和selinux
- name: disabled firewalld
service: name=firewalld state=stopped enabled=no
- name: disable selinux
command: '/sbin/setenforce 0'
ignore_errors: yes
- name: disabled selinux forever
replace: path=/etc/selinux/config regexp=enforcing replace=disabled after=loaded
#安装依赖包
- name: mount cdrom
mount: src=/dev/sr0 path=/mnt fstype=iso9660 state=mounted
- name: install pkgs
yum: name=pcre-devel,zlib-devel,openssl-devel,gcc,gcc-c++,make state=latest
#创建运行用户
- name: create nginx user
user: name=nginx create_home=no shell=/sbin/nologin
#解压软件包并安装
- name: unarchive nginx package
unarchive: copy=yes src=/etc/ansible/playbook/nginx-1.24.0.tar.gz dest=/opt/
- name: install nginx with source
shell: chdir=/opt/nginx-1.24.0/ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install
#创建软链接并启动服务
- name: create link file for nginx
file: state=link src=/usr/local/nginx/sbin/nginx path=/usr/local/sbin/nginx
- name: create nginx service file
copy: src=/lib/systemd/system/nginx.service dest=/lib/systemd/system/nginx.service
- name: start nginx
service: name=nginx state=started enabled=yes
运行playbook
bash
ansible-playbook demo.yaml
template配置模板模块
1.先准备一个XXX.j2配置模板文件,在模板文件中使用{{变量名}} 格式引用主机变量、组变量、facts信息字段或vars字段自定义的变量的值
2.编辑playbook文件,在文件中的tasks任务中定义template模块配置(template:src=XXX.j2文件路径 dest=远程主机文件路径)