[Ansible]-01 基础介绍.
第一章 Ansible介绍
1.1 如何学习ansible?
1.看官方文档
2.帮助文档
3.别人写好的,注意甄别
4.不要自己发明创造
5.尽量少使用shell模块,当想使用shell模块的时候,停下来,想一想有没有专有的模块干这个事
6.遇到报错做好记录,截图或复制文本,方便排查
7.尽量使用专有的模块去干专业的事
1.2 ansible服务概念介绍
a 批量管理多台主机
b 提高运维工作效率
c 降低运维工作难度
1.3 ansible服务特点说明
01. 管理端不需要启动服务程序(no server)
02. 管理端不需要编写配置文件(/etc/ansible/ansible.cfg)
03. 受控端不需要安装软件程序(libselinux-python)
(如果被管理端selinux服务没有关闭 --- 影响ansible软件的管理,所以一般会将selinux关闭,
但是安装libselinux-python这个软件后,可以让selinux开启的状态也可以使用ansible程序)
04. 受控端不需要启动服务程序(no agent)
05. 服务程序管理操作模块众多(module)
06. 利用剧本编写来实现自动化(playbook)
第二章 Ansible安装部署
2.1 安装步骤:
步骤:[安装服务软件---编写主机清单---进行管理测试]
2.2 yum安装ansible
Ansible的安装部署十分简单,只需要yum安装就行:
yum install ansible –y //--- 需要依赖epel的yum源
/etc/ansible/ansible.cfg --- ansible服务配置文件,一般用不到
/etc/ansible/hosts --- 主机清单文件 定义可以管理的主机信息
/etc/ansible/roles --- 角色目录
2.3 编辑公钥分发远程主机列表
# vim /server/scripts/ip_list.txt
192.168.81.162:linux@123:22
192.168.81.163:linux@123:22
192.168.81.164:linux@123:22
192.168.81.165:linux@123:22
2.4 编辑分发公钥脚本
# vim /server/scripts/distribute_public_key.sh
#!/bin/bash
#make key:
rm -f /root/.ssh/id_dsa &>/dev/null
yum install -y sshpass
if [ $? == 0 ]
then
#免交互生成密钥对,-f指定存放路径,-P密钥加密的密码 -q减少信息输出
ssh-keygen -t dsa -f /root/.ssh/id_dsa -P "" -q
else
echo "intsall shhpass failed"
fi
#分发公钥:
for host in $(cat /server/scripts/ip_list.txt)
do
host_ip=$(echo $host|awk -F ":" '{print $1}')
host_pass=$(echo $host|awk -F ":" '{print $2}')
host_port=$(echo $host|awk -F ":" '{print $3}')
sshpass -p$host_pass ssh-copy-id -i /root/.ssh/id_dsa.pub $host_ip -o StrictHostKeyChecking=no -p$host_port &>/dev/null
if [ $? -eq 0 ]
then
echo "to $host_ip distribute_key "
echo "public key distribute sucess"
echo ""
else
echo "to $host_ip distribute_key"
echo "public key distribute failed"
echo ""
fi
done
2.5 远程主机无法管理问题分析
1,管理端没有分发好主机的公钥
2,被管理端远程服务没有开启:
解决:检测远程服务是否开启netstat –lntp |grep 22
3,被管理端进程出现僵死情况
/usr/sbin/sshd -D --- 负责建立远程连接
sshd: root@pts/0 --- 用于维护远程连接(windows--linux)
sshd: root@notty --- 用于维护远程连接(ansible--被管理端)
解决:杀掉sshd: root@notty进程,重新连接
第三章 Ansible主机清单
Ansible是不需要用到配置文件的,但是有主机清单需要我们配置维护
/etc/ansible/hosts 主机资产清单文件,用于定义被管理主机的认证信息, 例如 ssh 登录用户名、密码以及 key相关信息。
**1)分组配置主机信息**
[web]
172.16.1.7
172.16.1.8
172.16.1.9
[data]
172.16.1.31
172.16.1.41
操作过程:
[root@m01 ansible-playbook]# ansible data -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
172.16.1.41 | CHANGED | rc=0 >>
backup
[root@m01 ansible-playbook]# ansible web -a "hostname"
172.16.1.7 | CHANGED | rc=0 >>
web01
**2)主机名符号匹配配置**
[web]
172.16.1.[7:9]
[web]
web[01:03]
**3)跟上非标准远程端口**
[web]
web01:52113
172.16.1.7:52113
**4)主机使用特殊的变量**
[web]
172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456
[web]
web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456
**5)主机组名嵌入配置**
[rsync:children] --- 嵌入子组信息
rsync_server
rsync_client
[rsync_server]
172.16.1.41
[rsync_client]
172.16.1.31
172.16.1.7
[web:vars] --- 嵌入式变量信息
ansible_ssh_host=172.16.1.7
ansible_ssh_port=52113
ansible_ssh_user=root
ansible_ssh_pass=123456
[web]
web01
主机清单的官网配置方法:
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
参考博客:https://www.jianshu.com/p/f543bb27b0da
第四章 Ansible常用模块
4.1 如何学习模块
ansible官方网站:
https://docs.ansible.com/
模块的应用语法格式:6个部分,缺一不可
[命令] [主机组模块名] [指定模块参数] [模块名称] [指定利用模块执行的动作参数] [批量执行操作动作]
ansible 主机名称/主机组名称/主机地址信息/all -m(指定应用的模块信息) 模块名称 -a(指定动作信息) "执行什么动作"
4.2 ping
应用场景:测试主机和ansible之间的连通性
举例:对webserver主机组测试是否连通
ansible webserver -m ping
4.3 command 默认模块
应用场景:类似shell,但是只能执行简单的命令,复杂的命令和有些符号并不能识别,用的比较少
4.3.1 简单用法:
[root@m01:~]# ansible 192.168.81.162 -m command -a "hostname"
192.168.81.162 | SUCCESS | rc=0 >>
m02
4.3.2 扩展应用:
1) chdir Change into this directory before running the command.
在执行命令之前对目录进行切换
ansible 192.168.81.162 -m command -a "chdir=/tmp touch 1.txt"
2) creates If it already exists, this step won't be run.
如果文件存在了,不执行命令操作
#如果远端有/tmp目录下有hosts这个文件。就不会执行touch1.txt这个操作
ansible 192.168.81.162 -m command -a "creates=/tmp/hosts touch 1.txt"
3) removes If it already exists, this step will be run.
如果文件存在了, 这个步骤将执行
#如果远端存在/tmp/hosts这个文件,才会执行chdir=/tmp touch 1.txt这个操作
ansible 192.168.81.162 -m command -a "removes=/tmp/hosts chdir=/tmp touch 1.txt"
4) free_form(required)
The command module takes a free form command to run.
There is no parameter actually named 'free form'. See the examples!
使用command模块的时候,-a参数后面必须写上一个合法linux命令信息
4.3.3 注意事项:
有些符号信息无法识别: <", ">", "|", ";" and "&"
01.查看主机名,可以执行成功
[root@m01 ~]# ansible web -m command -a 'hostname'
192.168.81.164 | CHANGED | rc=0 >>
web02
192.168.81.163 | CHANGED | rc=0 >>
web01
02.使用awk拼接查看主机IP执行失败
[root@m01 ~]# ansible web -m command -a "ifconfig eth0|grep 10"
192.168.81.163 | FAILED | rc=255 >>
SIOCSIFADDR: 没有那个设备
eth0|grep: ERROR while getting interface flags: 没有那个设备non-zero return code
192.168.81.164 | FAILED | rc=255 >> SIOCSIFADDR: 没有那个设备
eth0|grep: ERROR while getting interface flags: 没有那个设备non-zero return code
4.4 shell 万能模块
万能模块,所有命令都可以执行,和本地执行效果一样,和command模块命令用法一致
command – Executes a command on a remote node 在一个远程主机上执行一个命令
4.41 批量执行脚本
在其他主机上创建一个脚本,内容为打印主机名
cat > /root/echo.sh << EOF
#!/bin/bash
echo "$(hostname)"
EOF
然后使用ansible的shell模块批量执行:
[root@m01 ~]# ansible all -m shell -a "/bin/bash /root/echo.sh"
192.168.81.165 | CHANGED | rc=0 >>
nfs
192.168.81.163 | CHANGED | rc=0 >>
web021
192.168.81.164 | CHANGED | rc=0 >>
web02
或者直接执行:
ansible all -m command -a "hostname"
4.42 chdir |creates |removes
用法同command模块
缺点:
不会记录执行的状态,每次都是执行,不方便重复利用
4.5 script模块 万能模块
功能:批量远程执行脚本信息
实践应用: 利用shell执行脚本
第一个步骤: 编写一个脚本
第二个步骤: 将脚本发送到远程主机
第三个步骤: 将脚本权限进行修改(添加执行权限)
第四个步骤: 运行ansible命令执行脚本
所以,用script模块执行脚本更加方便:
Script模块执行脚本:
编写脚本:
[root@m01 ~]# cat echo.sh
#!/bin/bash
echo $(hostname)
执行命令:
[root@m01 ~]# ansible all -m script -a "/root/echo.sh"
4.6 copy 拷贝模块
功能:
copy – Copies files to remote location //将数据信息进行批量分发[管理端-->被管理端] (推数据)
与之相反的是fetch(批量拉取数据) 管理端<--被管理端 (拉数据)
01.拷贝m01的hostsname文件到其他主机的/opt目录下
(如果opt不存在可以自动创建)
ansible all -m copy -a "src=/etc/hostname dest=/opt"
ansible all -m shell -a "ls -lh /opt"
02.在传输文件时修改文件属主和属组信息
ansible all -m copy -a "src=/etc/hostname dest=/opt owner=user1 group=group1"
03.在传输文件时修改文件的权限信息
ansible all -m copy -a "src=/etc/hostname dest=/opt owner=root group=root mode='666'"
04.创建文件并直接写入内容
ansible all -m copy -a "content='rsync_backup:123456' dest=/opt/rsyncd.pwd owner=user1 group=group1 mode=600"
等价于:
echo "rsync_backup:123456" > /opt/rsyncd.pwd
chown user1:group1 /opt/rsyncd.pwd
chmod 600 /opt/rsyncd.pwd
05.复制目录
src后面目录没有/: 将目录本身以及目录下面的内容都进行远程传输复制
创建测试目录
[root@m01 ~]# mkdir -p /data/{a,b,c}/{1,2,3}
[root@m01 ~]# tree /data/
/data/
├── a
│ ├── 1
│ ├── 2
│ └── 3
├── b
│ ├── 1
│ ├── 2
│ └── 3
└── c
├── 1
├── 2
└── 3
src后面目录没有/: 将目录本身以及目录下面的内容都进行远程传输复制:
ansible all -m copy -a "src=/data dest=/opt"
src后面目录有/,只将目录下面的内容都进行远程传输复制:
ansible all -m copy -a "src=/data/ dest=/opt"
06.backup备份文件
说明:在将本地文件拷贝至远程主机时,为防止远程主机的文件被误覆盖,在进行拷贝操作前,会在远程主机上生成一个原文件的备份文件时,防止数据丢失
ansible all -m copy -a "src=/etc/hostname dest=/opt backup=yes"
07.在目标主机本地执行copy操作
ansible all -m copy -a "src=/etc/hostname dest=/opt remote_src=yes"
08.参数说明:
src: 源文件
dest: 目标路径
backup: 文件如果有更改,复制之前先备份一下
content: 往文件里追加内容
group: 定义文件用户组
owner: 定义文件用户
mode: 定义文件权限
remote_src: 在目标主机本机执行复制命令
4.7 fetch拉取模块
ansible 192.168.81.162 –m fetch –a “src=/tmp/1.txt dest=/tmp”
[root@m01:~]# tree /tmp/
/tmp/
├── 192.168.81.162
│ └── tmp
│ └── fetch.txt
4.8 file 文件模块
01.创建文件夹
ansible all -m file -a "path=/opt/redis state=directory"
02.创建文件并更改属性
ansible all -m file -a "path=/opt/redis state=directory owner=nsthink group=nsthink mode='600'"
03.创建软硬链接
ansible all -m file -a "src=/opt/nsthink dest=/opt/michaelni state=link"
ansible all -m file -a "src=/opt/1.txt dest=/opt/redis/1.hard.txt state=hard"
04.删除文件夹
ansible all -m file -a "path=/opt/1.txt state=absent"
05.递归更改文件授权
ansible all -m file -a "path=/opt/data owner=user1 group=group1 recurse=yes"
参数说明:
path: 目标文件或文件夹
state: 目标状态
- directory 创建目录
- file 创建文件,检测创建的数据信息是否存在,绿色存在,红色不存在
- link 创建软链接
-absent: 删除文件或目录
-recurse: 递归修改
4.9 cron定时任务
作用:批量设置多个主机的定时任务信息
创建测试脚本
[root@m01 ~/script]# cat echo_hostname.sh
#!/bin/bash
echo "$(date +%M:%S) $(hostname)" >>/tmp/hostname.txt
传统定时任务:
* * * * * /bin/bash /opt/echo_hostname.sh
ansible使用cron模块创建定时任务并指定名称
ansible all -m cron -a 'name="echo_hostname" job="/bin/bash /opt/echo_hostname.sh"'
示例:
每两个小时同步时间
ansible all -m cron -a "name='time sync' minute=0 hour=2 job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1'"
修改指定名称的定时任务
ansible all -m cron -a 'name="echo_hostname" minute="*/5" job="/bin/bash /opt/echo_hostname.sh"'
暂停一条定时任务
ansible all -m cron -a 'name="echo_hostname" minute="*/5" job="/bin/bash /opt/echo_hostname.sh" disabled=yes'
打开一条注释的任务
ansible all -m cron -a 'name="echo_hostname" minute="*/5" job="/bin/bash /opt/echo_hostname.sh" disabled=no'
删除指定名称的定时任务
ansible all -m cron -a 'name="echo_hostname" state=absent'
4.10 group模块
01.创建用户组
ansible all -m group -a "name=www gid='666'"
参数说明:
name: 组名
gid: 指定gid
gid state:
- absent 删除组
- present 创建组
4.11 user模块
作用:实现批量创建用户
基本用法:
ansible all -m user -a "name=user1"
扩展用法:
01.创建用户指定uid,gid
ansible all -m user -a "name=www uid='666' group=www"
02.批量创建虚拟用户
ansible 172.16.1.31 -m user -a "name=rsync create_home=no shell=/sbin/nologin"
03.创建普通用户,允许登陆并设置密码为123456
官方文档:
https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#how-do-i-generate-encrypted-passwords-for-the-user-module
对密码进行加密:
[root@m01 ~]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', '123456') }}"
localhost | SUCCESS => {
"msg": "$6$123456$37mxvJGRzjWxgD3HYl.bKq4aUXrcYV8mk0pxmqg8ARv3t9ke5ZM/NBbwTkx1FDcnLhrOX3jQc6L/NKAohhQJn/"
}
编写剧本文件:
[root@m01 ~]# cat user.yaml
- hosts: all
tasks:
- name: create_user
user:
name: cookzhang
password: '$6$123456$37mxvJGRzjWxgD3HYl.bKq4aUXrcYV8mk0pxmqg8ARv3t9ke5ZM/NBbwTkx1FDcnLhrOX3jQc6L/NKAohhQJn/'
参数说明:
uid #指定用户的 uid
group #指定用户组名称
groups #指定附加组名称
password #给用户添加密码
shell #指定用户登录 shell
create_home #是否创建家目录
4.12 yum模块
01.安装一个软件
ansible all -m yum -a "name=iftop state=latest"
02.卸载一个软件
ansible all -m yum -a "name=iftop state=removed"
从指定URL的地址安装rpm包:
1.安装配置Nginx
yum install nginx -y
sed -i '38,87d' /etc/nginx/nginx.conf
cat >/etc/nginx/conf.d/yum.conf <<EOF
server {
listen 80;
server_name localhost;
location / {
root /data/yum;
charset utf-8,gbk;
autoindex on;
autoindex_localtime on;
autoindex_exact_size off;
}
}
EOF
mkdir /data/yum
chown -R nginx:nginx /data/yum
cd /data/yum
wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.10.0-1.el7.ngx.x86_64.rpm
nginx -t
systemctl restart nginx
curl 127.0.0.1
2.从管理机上安装软件
ansible all -m yum -a "name=http://192.168.81.161/nginx-1.10.0-1.el7.ngx.x86_64.rpm state=latest"
参数说明:
name 软件包名称
state 状态:
- latest 安装最新版
- present
- installed
- removed 卸载软件
- absent 卸载软件
4.13 systemd服务模块
作用:批量管理服务的运行状态
启动一个服务并设置开机自启动
ansible all -m systemd -a "name=nginx state=started enabled=yes"
停止一个服务
ansible all -m systemd -a "name=nginx state=stopped"
参数说明:
name
state
- started
- stopped
- enabled
4.14 service模块
service模块: 管理服务器的运行状态 停止 开启 重启
name: --- 指定管理的服务名称
state: --- 指定服务状态[started//启动|restarted //重启| stopped//停止]
enabled --- 指定服务是否开机自启动
示例:
ansible 172.16.1.31 -m service -a "name=nfs state=started enabled=yes"
4.15 mount模块
作用:批量进行挂载操作
shell命令挂载
mount -t nfs 192.168.81.165:/data /data
挂载一个目录并写入fstab
ansible web -m mount -a "src=192.168.81.165:/data path=/data fstype=nfs state=mounted"
只写入fstab但是不挂载
ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=present"
卸载已经挂载的目录并删除fstab条目
ansible web -m mount -a "path=/data state=absent"
卸载已经挂载的目录但是不删除fstab条目
ansible web -m mount -a "path=/data state=unmounted"
参数说明:
src 需要挂载的存储设备或文件信息
path指定目标挂载点目录
state:
- mounted #挂载并写入fstab [推荐]
- present #不立即挂载,先写入fstab,实际上开机自动挂载
- unmounted #卸载设备,但不删除fstab条目
- remounted #强制重新挂载
- absent #会实现立即卸载, 并且会删除fstab文件信息,禁止开机自动挂载
4.16 unarchive解压模块
01.解压远程服务器的压缩包到指定目录
将管理机的压缩包解压到目标主机指定目录
ansible all -m unarchive -a "src=/root/script/txt.tar.gz dest=/opt/"
将目标主机自己本机压缩包解压到目标主机指定目录
ansible all -m unarchive -a "src=/tmp/txt.tar.gz dest=/tmp/ remote_src=yes"
4.17 archive压缩模块
压缩文件到指定目录
ansible all -m archive -a "path=/opt/*.txt dest=/tmp/opt.tar.gz"
压缩文件到指定目录并指定格式
ansible all -m archive -a "path=/opt/*.txt dest=/tmp/opt.zip format=zip"
压缩多个文件到指定目录
ansible all -m archive -a "path=/opt/1.txt,/opt/3.txt dest=/tmp/txt.tar.gz"
4.18 setup 获取主机信息
01.直接执行获取主机信息
ansible web -m setup
02.只将主机某个信息打印出来
ansible web -m setup -a 'filter=ansible_default_ipv4'
4,19 template
文件类模块之:template
功能:先对.j2的模板文件进行渲染(即变量替换),然后把渲染后的文件复制到受管机指定的目录下。一般多用于程序配置文件的自动化配置。
src参数:指定服务端上的源文件路径。
dest参数:指定复制到受管机上的目标路径。
backup参数:如果有重名且不同内容的文件时,是否先备份再覆盖。可选值是yes、no,默认值是no,即直接强制覆盖。
owner、group、mode参数:指定创建的文件的属主、属组、权限。
4.20 查看帮助
ansible-doc –l //列出所有模块的简单介绍
ansible-doc –s 模块名 //指定一个模块的详细说明
ansible-doc 模块名 //查询模块在剧本中应用方法
ansible --help
ansible-doc user
第五章 Ansible输出信息颜色解释
绿色信息: 执行的效果和你期望的一样,状态和上次没有改变
黄色信息: 执行的效果和你期望的一样,并且状态发生了改变
红色信息: 报错信息
粉色信息: 警告信息,你所执行的命令或效果有专门的模块可以实现
蓝色信息: 输出执行过程等详细信息
第六章 实战演练-编写rsync&nfs
6.1 编写ansible个人推荐的流程
1.手动安装并整理命令
2.收集起来所有的配置文件
3.把shell命令翻译成ansible命令
6.2 编写Rsync服务端
第一步:手动安装并整理命令
#1.创建www组和www用户
groupadd -g 666 www
useradd -u 666 -g 666 -M -s /sbin/nologin
#2.创建数据目录并更改授权
mkdir /{data,backup} -p
chown -R www:www /{data,backup}
#3.安装rsync软件
yum install rsync -y
#4.编写rsync配置文件
cat >/etc/rsyncd.conf <<EOF
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to nsthink backup!
path = /backup
[data]
path = /data
EOF
#5.编写密码文件并更改权限为600
echo "rsync_backup:123456" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
#6.启动服务
systemctl start rsyncd
systemctl enable rsyncd
#7.检查服务
netstat -lntup|grep 873
第二步:收集配置文件
scp 192.168.81.165:/etc/rsyncd.conf /root/script/rsync
scp 192.168.81.165:/etc/rsync.passwd /root/script/rsync
第三步:把shell命令翻译成ansible命令
#1.创建www组和www用户
ansible backup -m group -a "name=www gid=666"
ansible backup -m user -a "name=www uid='666' group=www create_home=no shell=/sbin/nologin"
#2.创建数据目录并更改授权
ansible backup -m file -a "path=/data state=directory owner=www group=www mode='755'"
ansible backup -m file -a "path=/backup state=directory owner=www group=www mode='755'"
#3.安装rsync软件
ansible backup -m yum -a "name=rsync state=latest"
#4.复制配置文件和密码文件
ansible backup -m copy -a "src=/root/script/rsync/rsyncd.conf dest=/etc/"
ansible backup -m copy -a "src=/root/script/rsync/rsync.passwd dest=/etc/ mode='600'"
#6.启动服务
ansible backup -m systemd -a "name=rsyncd state=started enabled=yes"
6.3 实战演练-编写NFS
第一步:手动安装并整理命令
#1.创建www组和www用户
groupadd -g 666 www
useradd -u 666 -g 666 -M -s /sbin/nologin
#2.创建数据目录并更改授权
mkdir /data
chown www:www /data
#3.安装nfs软件
yum install nfs-untils -y
#4.编写nfs配置文件
echo "/data 192.168.81.0/24(rw,sync,all_squash,anonuid=666,anongid=666)" > /etc/exports
#5.启动服务 systemctl stsart nfs rpcbind
第二步:收集配置文件
scp 192.168.81.165:/etc/exports /root/script/nfs
第三步:把shell命令翻译成ansible命令
#1.创建www组和www用户
ansible nfs -m group -a "name=www gid=666"
ansible nfs -m user -a "name=www uid='666' group=www create_home=no shell=/sbin/nologin"
#2.创建数据目录并更改授权
ansible nfs -m file -a "path=/data state=directory owner=www group=www mode='755'"
#3.安装nfs软件
ansible nfs -m yum -a "name=nfs state=latest"
#4.编写nfs配置文件
ansible nfs -m copy -a "src=/root/script/nfs/exports dest=/etc/"
#5.启动服务
ansible nfs -m systemd -a "name=rpcbind state=started enabled=yes"
ansible nfs -m systemd -a "name=nfs state=started enabled=yes"
第四步:客户端编写
ansible web -m yum -a "name=nfs-utils state=latest"
ansible web -m mount -a "src=192.168.81.165:/data path=/data fstype=nfs state=mounted"