Ansible批量部署执行

1 批量管理服务知识介绍

1.ansible是一个基于python开发的自动化运维工具
2.ansible是一个基于ssh协议实现远程管理的工具
3.ansible软件可以实现多种批量管理操作(批量系统配置、批量软件部署、批量文件拷贝)

2 批量管理服务特征介绍

1.ansible软件服务端:不需要启动任何服务,默认服务端不需要任何的配置
2.ansible软件客户端:没有客户端软件安装

3 absible软件安装部署

3.1 ansible软件自动化环境架构规划

管理主机m01
受控主机:其他

3.2 ansible软件自动化部署条件

建议基于ssh密钥方式建立远程链接
1.ssh密钥对创建(管理主机)

ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
-f  /root/.ssh/id_dsa		--指定私钥的存放路径
-N "" or -P  ""				--私钥文件密码设定

2.公钥文件分发

sshpass -p123 ssh-copy-id -i /root/.ssh/id_dsa.pub  "-o  StrictHostKeyChecking=no" 172.16.1.31
sshpass -p123  							--免交互式输入密码
-o  StrictHostKeyChecking=no   			--不检查

编写脚本批量分发并检查

[root@m01 scripts]# vim fenfa_key.sh
#!/bin/sh
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
if [ ! -f /root/.ssh/id_dsa ];then
ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
else
for n in 31 41 7
do
sshpass -p123 ssh-copy-id -i /root/.ssh/id_dsa.pub  "-o  StrictHostKeyChecking=no" 172.16.1.$n>/dev/null
 2>&1
ssh 172.16.1.$n hostname
done
fi

补充
shift的作用
若用户要求Shell在不知道变量个数的情况下,还能逐个处理参数,也就是在$1之后是$2,$2之后是$3。在未运行shift命令之前$1是可用的,当使用shift命令之后,原来的$2会变成$1,并且原有的 1 变 得 不 可 用 , 通 过 1变得不可用,通过 1#命令获得的参数个数也会少1。

#测试shift命令(x_shift.sh)
until [ $# -eq 0 ]
do
echo "第一个参数为: $1 参数个数为: $#"
shift
done
执行以上程序x_shift.sh:
$./x_shift.sh 1 2 3 4
结果显示如下:
第一个参数为: 1 参数个数为: 4
第一个参数为: 2 参数个数为: 3
第一个参数为: 3 参数个数为: 2
第一个参数为: 4 参数个数为: 1

shift命令一次移动参数的个数由其所带的参数指定。例如当shell程序处理完前九个命令行参数后,可以使用shift9命令把$10移到$1。

3.3 ansible软件下载安装

主控端软件安装

yum  -y   install  ansible

受控端软件安装(可选)

yum  -y  install  libselinux-python  <---解决selinux开启后selinux阻止

3.4 ansible软件受控主机添加配置

/etc/ansible/hosts     《===配置管理的主机
[dxy] 
172.16.1.31    ansible_user=root  ansible_password=123  <==可以指定账号和密码信息
172.16.1.41
172.16.1.7
ansible.cfg  	           《===ansible的配置文件

3.5 实践

[root@m01 ansible]# ansible dxy -m command -a "hostname"
172.16.1.41 | CHANGED | rc=0 >>
backup

172.16.1.7 | CHANGED | rc=0 >>
web01

172.16.1.31 | CHANGED | rc=0 >>
nfs01

3.6 命令参数

参数 含义
dxy 组名称
-m 指定模块信息
-a 利用模块中某些参数功能
-k 基于交互式输入密码

absible-doc -l 查看模块
ansible常用模块:command shell copy script file systemd yum mount

4 ansible应用

4.1 ansible软件模块

4.1.1 command模块

简介:
命令模块采用命令名,后跟空格分隔的参数列表。给定的命令将在所有选定的节点上执行。命令不会通过shell处理,因此$home之类的变量和“<”、“>”、“”、“;”和“&”之类的操作将不起作用。如果需要这些特性,请使用shell模块。
要创建更易于读取的命令任务,请使用args task关键字传递参数。
对于windows目标,请改用win_命令模块。

官方网站:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module

参数 作用
chdir 先切换到别的目录下在执行命令
creates 当文件存在时就不执行后边的命令
removes 当文件不存在时不执行后边的命令

chdir实例

[root@m01 ansible]# ansible 172.16.1.31 -m command -a "chdir=/tmp pwd"
172.16.1.31 | CHANGED | rc=0 >>
/tmp

creates实例

[root@m01 ansible]# ansible 172.16.1.31 -m command -a "creates=/tmp pwd"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp exists
[root@m01 ansible]# ansible 172.16.1.31 -m command -a "creates=/tmp1 pwd"
172.16.1.31 | CHANGED | rc=0 >>
/root

removes实例

[root@m01 ansible]# ansible 172.16.1.31 -m command -a "removes=/tmp hostname"                    
172.16.1.31 | CHANGED | rc=0 >>
nfs01
[root@m01 ansible]# ansible 172.16.1.31 -m command -a "removes=/tmp1 hostname"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp1 does not exist

4.1.2 shell模块

可以使用特殊符号,shell模块支持command模块的所有功能
chdir实例

[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "chdir=/tmp pwd"
172.16.1.31 | CHANGED | rc=0 >>

/tmp
creates实例

[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "creates=/tmp pwd"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp exists
[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "creates=/tmp1 pwd"
172.16.1.31 | CHANGED | rc=0 >>
/root

removes实例

[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "removes=/tmp hostname"                    
172.16.1.31 | CHANGED | rc=0 >>
nfs01
[root@m01 ansible]# ansible 172.16.1.31 -m shell -a "removes=/tmp1 hostname"
172.16.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp1 does not exist

4.1.3 script模块:专门运行脚本

简介:
Runs a local script on a remote node after transferring it

实例:
ansible 172.16.1.31 -m script  -a "/server/scripts/yum.sh"

4.2 文件类型的模块

4.2.1 copy---- Copy files to remote locations

synop
复制模块将文件从本地或远程计算机复制到远程计算机上的某个位置。
使用fetch模块将文件从远程位置复制到本地框。
如果在复制的文件中需要变量插值,请使用模板模块。在内容字段中使用变量将导致不可预测的输出。

对于windows目标,请改用win_copy模块sis

参数 含义
src 要复制文件本地的路径,如果是目录/结尾,复制的时候不包含目录
dest 应将文件复制到的远程绝对路径。如果src是一个目录,那么它也必须是一个目录。如果DEST是一个不存在的路径,如果要么以“//”结束,要么SRC是一个目录,则创建DEST。如果dest是相对路径,则起始目录由远程主机确定。如果SRC和DEST是文件,则未创建DEST的父目录,如果该任务不存在,则任务失败。
backup 创建一个包含时间戳信息的备份文件,以便在不正确地删除原始文件时可以将其取回。
owner 应该拥有该文件/目录的用户的名称,该名称将被馈送给chown。
group 设置文件所属组
mode 设置复制后的文件权限 例如:600 755 等等

src与dest实例

ansible 172.16.1.31 -m copy -a "src=1.txt dest=./"  
backup
[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=1.txt dest=./ backup=yes"      
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "backup_file": "./1.txt.22000.2019-11-01@17:08:50~", 
    "changed": true, 
    "checksum": "47f5487a006fd6ce0f74306c7c8594b219b72d08", 
    "dest": "./1.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "91dc86f0a5e0bede58197f3f22883180", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 188, 
    "src": "/root/.ansible/tmp/ansible-tmp-1572599329.88-195785710959257/source", 
    "state": "file", 
    "uid": 0
}
[root@m01 ~]# ansible 172.16.1.31 -m shell  -a "ls ./1.txt*"       
172.16.1.31 | CHANGED | rc=0 >>
./1.txt
./1.txt.22000.2019-11-01@17:08:50~

4.2.2 file模块

synopsis
设置文件、符号链接或目录的属性。
或者,删除文件、符号链接或目录。
许多其他模块支持与文件模块相同的选项,包括复制、模板和组装。

对于Windows目标,请改用Win_文件模块。

[root@m01 ~]# ansible 172.16.1.31 -m file -a "path=/tmp/1.txt owner=test group=test mode=600" 
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 1000, 
    "group": "test", 
    "mode": "0600", 
    "owner": "test", 
    "path": "/tmp/1.txt", 
    "secontext": "unconfined_u:object_r:user_tmp_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 1000
}
path是路径  相当于dest
state:用于指定创建
[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/tmp/1.txt state=file"
[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/tmp/dir state=directory"

4.2.3 yum模块

简介(synopsis)
使用yum包管理器安装、升级、降级、删除和列出包和组。

此模块仅适用于Python2如果需要Python 3支持,请参阅dnf模块。

参数 含义
name 需要安装软件的名称
state installed安装absent卸载
list 指定软件的名称查看是否可以安装,以及是否已经安装过了
ansible 172.16.1.31 -m yum -a "name=iftop state=removed"
ansible 172.16.1.31 -m yum -a "name=iftop state=installed"
ansible 172.16.1.31 -m yum -a "list=iftop"

4.2.4 系统模块—server

synopsis
控制远程主机上的服务支持的init系统包括bsd init、openrc、sysv、solaris smf、systemd和upstart。

对于Windows目标,请改用Win_服务模块。
参数 含义
name 指定管理的服务名称(管理的服务一定在chkconfig中可以看到)
state 对应的状态 reloaded restarted stopped started
enabled 服务是否开机自启动 yes no

4.2.5 系统模块—systemd

synopsis
控制远程主机上的系统服务。

参数 含义
name 指定管理的服务名称(管理的服务一定在chkconfig中可以看到)
state 对应的状态 reloaded restarted stopped started
enabled 服务是否开机自启动 yes no

4.2.6 cron模块—Manage cron.d and crontab entries

synopsis
使用此模块管理crontab和环境变量项。此模块允许您创建环境变量和命名的crontab条目、更新或删除它们。
当crontab作业被管理时:模块包含一行crontab条目“ansibe:”的描述,与传递给模块的“name”相对应,将来ansibe/module调用将使用该条目查找/检查状态。“name”参数应该是唯一的,更改“name”值将导致创建一个新的cron任务(或删除另一个任务)。
管理环境变量时,不添加注释行,但是,当模块需要查找/检查状态时,它使用“name”参数来查找环境变量定义行。
使用%等符号时,必须正确转义。

name :给定时任务定义名称
state=absent :删除一条规则
disabled=yes :注释定时任务
minute=0-59  or    *    or   */     分钟
hour=0-23 |*  */	时
day=1-31 | *  */	日
month   月 weekday  周     job=对应的命令    默认是*
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name=test01 minute=0 hour=0 job='/usr/sbin/sh  /server/scripts/test.sh >/dev/null 2>&1'"
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "test01"
    ]
}
[root@m01 ~]# ansible 172.16.1.31 -m command -a "crontab -l"
172.16.1.31 | CHANGED | rc=0 >>
##time update
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
###Pack and backup at 00:00 every day####
###00 00 * * * /usr/bin/sh /server/scripts/back.sh >/dev/null 2>&1
#Ansible: test01
0 0 * * * /usr/sbin/sh  /server/scripts/test.sh >/dev/null 2>&1
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name=test01 minute=0 hour=0 job='/usr/sbin/sh  /server/scripts/test.sh >/dev/null 2>&1' disabled=yes"  
172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "test01", 
        "None"
    ]
}
[root@m01 ~]# ansible 172.16.1.31 -m command -a "crontab -l"                                            172.16.1.31 | CHANGED | rc=0 >>
##time update
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
###Pack and backup at 00:00 every day####
###00 00 * * * /usr/bin/sh /server/scripts/back.sh >/dev/null 2>&1
#Ansible: test01
#0 0 * * * /usr/sbin/sh  /server/scripts/test.sh >/dev/null 2>&1
[root@m01 ~]# ansible 172.16.1.31 -m cron -a "name=test01 state=absent"                                 172.16.1.31 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "None"
    ]
}
[root@m01 ~]# ansible 172.16.1.31 -m command -a "crontab -l"           
172.16.1.31 | CHANGED | rc=0 >>
##time update
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
###Pack and backup at 00:00 every day####
###00 00 * * * /usr/bin/sh /server/scripts/back.sh >/dev/null 2>&1

4.3 ansible软件脚本

编写的规范:
https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
遵循pyyaml

4.3.1 用法说明

语法格式:

host:
 tasks:
 		--内容

实例:

- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum:
      name: httpd
      state: latest
  - name: write the apache config file
    template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service:
      name: httpd
      state: started
  handlers:
    - name: restart apache
      service:
        name: httpd
        state: restarted

4.3.3 空格的用法说明
对编写的内容进行分级时,需要有两个空格表示分级
软件安装步骤:

-	server端安装步骤:
第一步:
   第二步:
-	客户端安装步骤:

4.4 脚本实例:

4.4.1 编写安装nginx的脚本

[root@m01 ~]# vim 1.yml                 
- hosts: 172.16.1.7
  tasks:
    - name: instsll nginx
      yum: name=nginx state=installed
    - name: check install
      shell: rpm -qa|grep nginx
    - name: start nginx
      systemd: name=nginx state=started
    - name: check start
      shell: ss -lntup|grep nginx

4.4.2 测试模拟运行
[root@m01 ~]# ansible-playbook -C 1.yml ##调试
[root@m01 ~]# ansible-playbook 1.yml ##运行
测试安装成功

ansible同时安装多个服务实例

服务端自动安装配置启动服务,客户端自动挂载

[root@m01 yml]# cat nfs.yml
- hosts: 172.16.1.31
  vars:
    packe:
      - rpcbind
      - nfs-utils
  tasks:
    - name: yum install nfs rpcbind
      yum: name={{ packe }} state=present
    - name: copy nfs configure 
      copy: src=/server/ansible/conf/nfs/exports dest=/etc/
    - name: create /data directory
      file: dest=/data state=directory owner=nfsnobody group=nfsnobody
    - name:  start nfs rpcbind
      systemd: name={{ item }} state=started enabled=yes
      with_items:
        - rpcbind
        - nfs
- hosts: 172.16.1.7
  tasks:
    - name: yum  install nfs-utils
      yum: name=nfs-utils state=present
    - name: create file /www
      file: dest=/www state=directory
    - name: start  rpc
      systemd: name=rpcbind  state=started enabled=yes
    - name: mount
      mount: name=/www  src=172.16.1.31:/data fstype=nfs state=mounted

你可能感兴趣的:(linux服务介绍搭建,linux,运维,centos)