[ansiible]-ansible-常用模块

第1章 如何学习Ansible?

1.看官方文档
2.帮助文档
3.别人写好的,注意甄别
4.不要自己发明创造
5.尽量少使用shell模块,当想使用shell模块的时候,停下来,想一想有没有专有的模块干这个事
6.遇到报错做好记录,截图或复制文本,方便排查
7.尽量使用专有的模块去干专业的事

第2章 Ansible安装部署

Ansible的安装部署十分简单,只需要yum安装就行

yum install ansible -y

第3章 Ansible主机清单

/etc/ansible/hosts 主机资产清单文件,用于定义被管理主机的认证信息, 例如 ssh 登录用户名、密码以及 key相关信息。

1.主机支持主机名通配以及正则表达式,例如 web[1:3].oldboy.com 代表三台主机
2.主机支持基于非标准的 ssh 端口,例如 web1.oldboy.com:6666
3.主机支持指定变量,可对个别主机的特殊配置,如登陆用户,密码
4.主机组支持指定变量[group_name:vars],同时支持嵌套组[game:children]

1.指定主机组相关配置

[root@m01 ~]# cat /etc/ansible/hosts    
#主机组
[web]
172.16.1.7 
172.16.1.8 
[nfs]
172.16.1.31

#针对某个组的变量
[web:vars]
ansible_port=222

#针对所有组的变量
[all:vars]
ansible_password='123456'

第4章 Ansible常用模块

0.如何学习模块

ansible官方网站:

https://docs.ansible.com/

模块的应用语法格式:
ansible 主机名称/主机组名称/主机地址信息/all -m(指定应用的模块信息) 模块名称 -a(指定动作信息) "执行什么动作"

1.ping

应用场景:
测试主机和ansible之间的连通性
举例:
对webserver主机组测试是否连通

ansible webserver -m ping

2.command 简单模块

应用场景:
类似shell,但是只能执行简单的命令,复杂的命令和有些符号并不能识别,用的比较少
01.查看主机名,可以执行成功

[root@m01 ~]# ansible web -m command -a 'hostname'
172.16.1.8 | CHANGED | rc=0 >>
web02
172.16.1.7 | CHANGED | rc=0 >>
web01

02.使用awk拼接查看主机IP执行失败

[root@m01 ~]# ansible web -m command -a "ifconfig eth0|grep 10"
172.16.1.7 | FAILED | rc=255 >>
SIOCSIFADDR: 没有那个设备
eth0|grep: ERROR while getting interface flags: 没有那个设备non-zero return code
172.16.1.8 | FAILED | rc=255 >>
SIOCSIFADDR: 没有那个设备
eth0|grep: ERROR while getting interface flags: 没有那个设备non-zero return code

3.shell 万能模块

万能模块,所有命令都可以执行,和本地执行效果一样
01.使用管道查询IP地址

[root@m01 ~]# ansible web -m shell -a "ifconfig eth0|grep 10.0.0" 
172.16.1.8 | CHANGED | rc=0 >>
        inet 10.0.0.8  netmask 255.255.255.0  broadcast 10.0.0.255
172.16.1.7 | CHANGED | rc=0 >>
        inet 10.0.0.7  netmask 255.255.255.0  broadcast 10.0.0.255

02.批量执行脚本
在其他主机上创建一个脚本,内容为打印主机名

cat > /root/echo.sh << EOF 
#!/bin/bash
echo "$(hostname)"
EOF

然后使用ansible的shell模块批量执行

[root@m01 ~]# ansible all -m shell -a "/bin/bash /root/echo.sh"
172.16.1.31 | CHANGED | rc=0 >>
nfs
172.16.1.8 | CHANGED | rc=0 >>
web02
172.16.1.7 | CHANGED | rc=0 >>
web01

缺点:

不会记录执行的状态,每次都是执行,不方便重复利用

4.copy 拷贝模块

01.拷贝m01的hostsname文件到其他主机的/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=zhangya group=zhangya"

03.在传输文件时修改文件的权限信息

ansible all -m copy -a "src=/etc/hostname dest=/opt owner=zhangya group=zhangya mode='644'"

04.创建文件并直接写入内容

ansible all -m copy -a "content='rsync_backup:123456' dest=/opt/rsyncd.pwd owner=zhangya group=zhangya mode=600"

等价于

echo "rsync_backup:123456" > /opt/rsyncd.pwd
chown zhangya:zhangya /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

传输命令

ansible all -m copy -a "src=/data dest=/opt"

src后面目录有/: 只将目录下面的内容都进行远程传输复制

ansible all -m copy -a "src=/data/ dest=/opt"

06backup备份文件

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: 在目标主机本机执行复制命令

5.file 文件模块

01.创建文件夹

ansible all -m file -a "path=/opt/oldzhang state=directory"

02.创建文件并更改属性

ansible all -m file -a "path=/opt/oldzhang state=directory owner=zhangya group=zhangya mode='755'"

03.创建软链接

ansible all -m file -a "src=/opt/oldzhang dest=/opt/oldya state=link"

04.删除文件夹

ansible all -m file -a "path=/opt/oldya state=absent"

05.递归更改文件授权

ansible all -m file -a "path=/opt/data owner=zhangya group=zhangya recurse=yes"

参数说明:

path:		目标文件或文件夹
state:	目标状态
- directory		创建目录
- file			  创建文件
- link 				创建软链接
absent:	删除文件或目录
recurse: 递归修改

6.script模块

编写脚本:

[root@m01 ~]# cat echo.sh 
#!/bin/bash
touch $(hostname).txt

执行命令:

[root@m01 ~]# ansible all -vvv -m script -a "/root/echo.sh"

7.cron定时任务

01.创建测试脚本

[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="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'

删除指定名称为Node的定时任务

ansible all -m cron -a 'name="None" state=absent'   

删除指定名称的定时任务

ansible all -m cron -a 'name="echo_hostname" state=absent'   

8.group模块

01.创建用户组

ansible all -m group -a "name=www gid='666'"

参数说明:

name:		组名
gid:	  指定gid
state:	
- absent	删除组
- present 创建组

9.user模块

01.创建用户指定uid,gid,不创建家目录也不允许登陆

ansible all -m user -a "name=www uid='666' group=www create_home=no shell=/sbin/nologin"

02.创建普通用户,允许登陆并设置密码为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 #是否创建家目录

10.yum模块

安装一个软件

ansible all -m yum -a "name=iftop state=latest"

卸载一个软件

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://10.0.0.61/nginx-1.10.0-1.el7.ngx.x86_64.rpm state=latest"

参数说明:

name				软件包名称
state				状态
- latest		安装最新版
- removed 	卸载软件

11.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

12.mount模块

shell命令挂载

mount -t nfs 172.17.1.31:/data /data

挂载一个目录并写入fstab

ansible web -m mount -a "src=172.16.1.31:/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							NFS服务器远程挂载地址
path						本地挂载目录
state:
- absent				#卸载并删除fstab条目 
- mounted				#挂载并写入fstab
- present				#不挂载,只写入fstab
- unmounted			#卸载设备,但不删除fstab条目
- remounted		  #强制重新挂载

13.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"

14.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"

15.setup 获取主机信息

01.直接执行获取主机信息

ansible web -m setup

02.只将主机某个信息打印出来

ansible web -m setup -a 'filter=ansible_default_ipv4'

16.查看帮助

ansible --help
ansible-doc user

第5章 Ansible输出信息颜色解释

绿色信息: 执行的效果和你期望的一样,状态和上次没有改变
黄色信息: 执行的效果和你期望的一样,并且状态发生了改变
红色信息: 报错信息
粉色信息: 警告信息,你所执行的命令或效果有专门的模块可以实现
蓝色信息: 输出执行过程等详细信息

第6章 编写NFS和Rsync服务

1.编写ansible个人推荐的流程

1.手动安装并整理命令
2.收集起来所有的配置文件
3.把shell命令翻译成ansible命令

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 oldboyedu 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 10.0.0.31:/etc/rsyncd.conf /root/script/rsync
scp 10.0.0.31:/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" 

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 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)" > /etc/exports 

#5.启动服务
systemctl stsart nfs rpcbind

第二步:收集配置文件

scp 10.0.0.31:/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=172.16.1.31:/data path=/data fstype=nfs state=mounted"
posted @ 2020-03-27 08:18  #!/bin/bash  阅读(482)  评论(0编辑  收藏  举报