Ansible-基础

第一章 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

      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[1:3].oldboy.com 代表三台主机

2.主机支持基于非标准的 ssh 端口,例如 web1.oldboy.com:6666

3.主机支持指定变量,可对个别主机的特殊配置,如登陆用户,密码

4.主机组支持指定变量[group_name:vars],同时支持嵌套组[game:children]

 3.1 指定主机组相关配置

[root@m01 ~]# cat /etc/ansible/hosts

#主机组

[web]

192.168.81.163

192.168.81.164

[nfs]

192.168.81.165

#针对某个组的变量

[web:vars]

ansible_port=222

#针对所有组的变量

[all:vars]

ansible_password='123456'

第四章 Ansible常用模块

 4.1 如何学习模块

ansible官方网站:

模块的应用语法格式: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(批量拉取数据) 管理端ß被管理端  (拉数据)

  1. 01.  m01hostsname文件到其他主机的/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=user1 group=group1 mode='755'"

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 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模块

安装一个软件

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 安装最新版

- 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: - absent #卸载并删除fstab条目

- 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 查看帮助

ansible-doc –l //列出所有模块的简单介绍

ansible-doc –s 模块名  //指定一个模块的详细说明

ansible-doc 模块名  //查询模块在剧本中应用方法

ansible --help

ansible-doc user

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

绿色信息: 执行的效果和你期望的一样,状态和上次没有改变

黄色信息: 执行的效果和你期望的一样,并且状态发生了改变

红色信息: 报错信息

粉色信息: 警告信息,你所执行的命令或效果有专门的模块可以实现

蓝色信息: 输出执行过程等详细信息

第6章 编写NFS和Rsync服务

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

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

猜你喜欢

转载自www.cnblogs.com/nsthink-666/p/12735187.html