官网
https://www.ansible.com
- Ansible特点:
- 基于Python语言开发
- 轻量级批量管理工具
- 不需要在客户端(被管理主机)安装Agent
- 模块化设计,支持自定义模块,自定义模块可用任何语言编写
- 基于PyYAML模块支持Playbook,可以通过Playbook完成可重复的复杂工作
- 支持jinjia2模版
- 核心组件
- Ansible
- Host Inventory(清单文件)
- Playbooks
- Core Modules
- Custom Modules
- Plugins Email,Logging,Other
- Connection Plugins (远程链接插件)
实验环境准备
- 虚拟机2台,1台作为ansible主机,2台为被管理主机
系统初始化
#关闭selinux、
#临时关闭
setenforce 0
#永久关闭,重启生效
sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
#关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
在管理主机中添加hosts解析
echo "192.168.10.210 host1" >> /etc/hosts
配置ssh免密认证
ssh-keygen
#使用脚本批量拷贝私钥文件
#!/bin/bash
for i in host1 host2
do
ssh-copy-id $i
echo "$i copy successlly"
done
配置阿里云源
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
-i.bak \
/etc/yum.repos.d/*.repo
dnf makecache
dnf repolist
安装Ansible
dnf install ansible-core -y
定义Ansible清单文件
- 生成主主配置文件
#备份原文件
mv /etc/ansible/ansible.cfg /etc/ansible/ansible.cfg.bak
#生成新的配置文件
ansible-config init --disabled > /etc/ansible/ansible.cfg
- 添加要管理的主机
#vi/etc/ansible/hosts
[webserver]
host1
host2
- 列出指定组内的主机
ansible webserver --list
查看ansible可用模块
ansible-doc -l
Ansible命令参数
- Ansible命令返回值的颜色表示:
- 绿色:命令执行成功,且未对远程主机进行修改
- 黄色:命令执行成功,并对远程主机进行了相应的修改
- 红色:命令执行失败,或者执行异常、报错
- 粉色:命令执行后发出的告警信息,以及建议(可以忽略)
- Ansible执行命令的方式
- ad-doc:临时命令
- Playbook:将命令写入文件中
Ansible命令格式介绍
- 常用命令格式:ansible 组名/主机 【-m 模块名】 【-a 模块参数】
Ansible常用模块介绍
command模块
- command为默认模块,用于远程执行命令
- 使用command模块在远程主机执行命令时,不会经过远程主机的shell进行处理,在使用command模块时,如果需要执行的命令中包含< ,>,|, ; , & 这些符号时,这些符号的功能也会失效
- 常用参数:
- chdir:执行前会先进入到指定目录
- creates:如果远程主机中不存在指定文件,则执行,如果存在,则不执行
- removes:如果远程主机存在指定文件,则执行,如果不存在,则不执行
模块测试
- 使用ping模块,测试与远程主机的连通性
ansible webserver -m ping
- command模块
#查询模块可用参数
ansible-doc -s command
#查询远程主机指定目录下的文件
ansible webserver -m command -a "chdir=/home ls"
- creates
#如果当前目录下没有user.txt这个文件,则创建它,如果有则不执行创建命令
ansible webserver -m command -a "creates=/home/user.txt touch /home/user.txt"
- removes
#如果远程主机home目录下存在user.txt文件,则将该文件移动至远程主机的root目录下
ansible webserver -m command -a "removes=/home/user.txt mv /home/user.txt /root/"
command模块缺点
- 使用command模块时,如果需要执行的命令中包含< > | ; & 这些符号时,这些符号的功能会失效
#使用符号拼接时会报错
ansible webserver -m command -a "df -h > /root/waring.txt"
shell模块
- 与command模块类似,区别在于shell模块可以通过/bin/bash程序处理命令
ansible webserver -m shell -a "df -h > /root/waring.txt"
script模块
- script模块用于远程执行脚本,脚本存放在本地,不需要拷贝到远程主机
- 搭建本地yum仓库源
#!/bin/bash
[ ! -d /etc/yum.repos.d/bak ] && mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/* /etc/yum.repos.d/bak >/dev/null 2>&1
mount -t iso9660 /dev/cdrom /mnt/cdrom
version=$(cat /etc/redhat-release|sed -r 's/.* ([0-9]+)\..*/\1/')
if [ "$version" > "7" ];then
echo "[local-AppStream]
name=local_AppStream
baseurl=file:///mnt/cdrom/AppStream
enabled=1
gpgcheck=0
[local-BaseOS]
name=local_BaseOS
baseurl=file:///mnt/cdrom/BaseOS
enabled=1
gpgcheck=0" > /etc/yum.repos.d/local.repo
elif [ "$version" <= "7" ];then
echo "[local]
name=local
baseurl=file:///mnt/cdrom/
enabled=1
gpgcheck=0" > /etc/.yum.repos.d/local.repo
fi
sleep 3
yum clean all
yum makecache
yum repolist
- 查看远程主机的仓库源
ansible webserver -m shell -a "cat /etc/yum.repos.d/local.repo"
yum模块
- 用于在远程主机上通过yum源管理软件包
- 常用参数
name 指定需要管理的软件包名字
state
-- installed 安装软件包
-- latest 安装yum中最新版本的软件包
-- removed 删除对应软件包
- 安装Apache服务
ansible webserver -m yum -a "name=httpd"
- 启动服务
#不加-m指定模块,默认使用command模块
ansible webserver -a "systemctl start httpd"
copy模块
- 将本地文件拷贝至远程主机
- 核心参数
- src -- 源文件地址
- dst -- 目的地址
ansible webserver -m copy -a "src=/root/kl.sh dest=/mnt"
- 拷贝文件时,如果远程主机已经有同名文件,但是内容不同,可以使用force参数选择是否覆盖
#yes为覆盖,no为不覆盖
ansible webserver -m copy -a "src=/root/kl.sh dest=/mnt/kl.sh force=yes"
- 拷贝文件时,如果远程主机已经有同名文件,但是内容不同,可以使用backup参数选择是否先备份远程主机上的文件,再拷贝主机的文件到远程主机上
ansible webserver -m copy -a "src=/root/kl.sh dest=/mnt/kl.sh backup=yes"
- owner指定文件拷贝到远程主机后所属的用户,group指定文件拷贝到远程主机后所属的用户组
- mode指定 文件拷贝到远程主机后的权限,比如:mode=0644
ansible webserver -m copy -a "src=/root/kl.sh dest=/mnt/kl.sh owner=admin group=admin mode=0644"
Ansible剧本Playbook
- 类似脚本,用于配置,部署和管理被控制节点
- 我们只需要把模块按照顺序编排在playbook剧本中,ansible就会按照剧本一步一步的执行
- playbook需要遵循YAML语法格式编写,文件名以.yaml或者yml作为后缀
playbook核心参数
- hosts -- 执行的远程主机列表
- tasks -- 任务集
- variables -- 自定义变量
- tempaltes --模板
- handles和noify结合使用,由特定个条件触发操作,满足条件则执行,否则不执行过
- tags标签,指定某条任务 执行,用于选择运行playbook中的部分代码
- remote_user -- 设置远程登录的用户
例:
---
- hosts: webserver
remote_user: root
tasks:
- name: ping host
ping:
- name: mkdir mom
shell:
cmd: mkdir /mom
- 执行yml文件
ansible-playbook ping.yml
- 使用playbook安装nginx
---
- hosts: webserver
remote_user: root
tasks:
- name: copy-nginx
copy: src=/root/nginx-1.22.1.tar.gz dest=/mnt
- name: install Depend
yum: name=pcre,pcre-devel,zlib,zlib-devel,gcc*
- name: tar-nginx
shell: tar -xf /mnt/nginx-1.22.1.tar.gz -C /mnt
- name: install-nginx
shell: cd /mnt/nginx-1.22.1 && ./configure --prefix=/usr/local/nginx && make && make install
- name: Copy-index.html
copy: src=/root/index.html dest=/usr/local/nginx/html
- name: start nginx
shell: cp /usr/local/nginx/sbin/nginx /usr/sbin && nginx -c /usr/local/nginx/conf/nginx.conf
- 检查 yml文件语法是否正确,
ansible-playbook --syntax-check nginx_install.yml