ansible

Posted bkydxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible相关的知识,希望对你有一定的参考价值。

ansible批量部署

1       批量管理服务知识介绍

1.ansible是一个基于python开发的自动化运维工具

2.ansible是一个基于ssh协议实现远程管理的工具

3.ansible软件可以实现多种批量管理操作(批量系统配置、批量软件部署、批量文件拷贝)

2       批量管理服务特征介绍

1.ansible软件服务端:不需要启动任何服务,默认服务端不需要任何的配置

2.ansible软件客户端:没有客户端软件安装

3       absible软件安装部署

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

管理主机m01

受控主机:其他

3.2         b ansible软件自动化部署条件

建议基于ssh密钥方式建立远程链接

1.ssh密钥对创建(管理主机)

影响免交互创建密钥对的因素

a.需要指定私钥的存放路径

-f  /root/.ssh/id_dsa

b.需要进行私钥文件密码设定

-N/-P

-N ""    /  -P  ""

2.公钥文件分发

3.检查

影响免交互分发的因素

1.需要输入yes确认

-o  StrictHostKeyChecking=no    ---不检查

2.需要输入密码

sshpass -p123 

sshpass -p123 ssh-copy-id -i /root/.ssh/id_dsa.pub  "-o  StrictHostKeyChecking=no" 172.16.1.31

编写脚本批量分发并检查                                                 

[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。

#测试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  查看模块

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>”的描述,与传递给模块的“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     1.-用法说明,表示列表显示的内容

   水果信息:

      - 苹果

      - 香蕉

4.3.2     : 用法说明key:value键值对的方式

姓名: lisi

年龄: 20

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的主要内容,如果未能解决你的问题,请参考以下文章

Ansibleansible安装,用户级执行ansible命令,清单构建,配置文件详解

Ansibleansible安装,用户级执行ansible命令,清单构建,配置文件详解

AnsibleAnsible控制windows插件安装及运行error与解决方法

ansible控制windows 2019

Ansible 自动化常用实例

初识Ansible