• Ansible 自动化学习笔记(精简)


    Ansible 是新出现的自动化运维工具,基于Python开发,集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能,ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.

    Ansible 简单管理

    下面的小实验,我们将采用以下的IP地址规划,请自行配置好.

    [实验环境]
    
    [状态]    [主机列表]        [python版本]
    
    控制机 192.168.1.10        Python2.6/2.7
    
    被控机 192.168.1.20        Python2.4
    被控机 192.168.1.30        Python2.4
    

    为了避免 Ansible 下发指令时输入目标主机密码,通过证书签名达到 SSH 无密码是一个好的方案,推荐使用 ssh-keygenssh-copy-id 来实现快速证书的生成及公钥下发.

    1.在控制主机创建密钥,执行 ssh-keygen -t rsa ,有询问直接按回车键即可,将在 /root/.ssh 下生成一对密钥,其中 id_rsa 为私钥,id_rsa.pub 为公钥,代码如下:

    [root@localhost ~]# ssh-keygen -t rsa
    [root@localhost ~]# ls -lh .ssh/*
    -rw-------. 1 root root  408 May 18 20:10 .ssh/authorized_keys
    -rw-------. 1 root root 1.7K May 18 20:19 .ssh/id_rsa
    -rw-r--r--. 1 root root  408 May 18 20:19 .ssh/id_rsa.pub
    

    2.下发密钥就是控制主机把公钥id_rsa.pub下发到被管节点上用户下.ssh目录,并重命名成 authorized_keys 且权限值为 400,接下来推荐常用的密钥拷贝工具 ssh-copy-id把公钥文件id_rsa.pub公钥拷贝到被管节点,命令格式如下:

    [root@localhost ~]# ssh-copy-id root@192.168.1.20
    [root@localhost ~]# ssh-copy-id root@192.168.1.30
    

    3.RHEL7.0安装Ansible后发现找不到ansible.cfg,配置文件的路径,我们需要手动将它的配置文件拷贝到/etc/目录下去.

    [root@localhost ~]# cd /usr/src/ansible-2.5.0/examples
    [root@localhost exampless]# mkdir /etc/ansible
    [root@localhost exampless]# cp -a ansible.cfg hosts /etc/ansible
    

    4.编辑Ansible,写入被控主机IP地址,如果要写入一组IP我们可以加中括号 webserver代表的含义就是,执行下面一组IP的操作,admin 组则代表指定一个范围.

    [root@localhost ~]# vim /etc/ansible/hosts
     
    192.168.1.20      #写入单个IP地址
    192.168.1.30
    
    [webserver]       #指定一个组
    192.168.1.20
    192.168.1.30
    
    [admin]           #指定一个范围
    192.168.1.[1:100]
    

    5.修改Ansible主配置文件,修改两处位置即可,分别是禁用每次执行命令检查ssh,和开启日志记录功能,取消两处的注释即可.

    [root@localhost ~]# vim /etc/ansible/ansible.cfg
    
    61 # uncomment this to disable SSH key host checking
    62 host_key_checking = False        #禁用每次执行命令检查ssh,取消注释
    
    100 # logging is off by default unless this path is defined
    101 # if so defined, consider logrotate
    102 log_path = /var/log/ansible.log  #开启日志记录功能,取消注释
    

    6.此时Ansible控制主机就配置完毕了,我们来执行以下命令,看一下它的连通性吧,一般我们Ping一下看到pong说明成功啦.

    [root@localhost ~]# ansible all -m ping
    
    192.168.1.20 | SUCCESS => {     #说明成功
        "changed": false, 
        "ping": "pong"
    }
    192.168.1.30 | SUCCESS => {     #说明成功
        "changed": false, 
        "ping": "pong"
    }
    
    [root@localhost ~]# ansible webserver -m ping
    
    192.168.1.20 | SUCCESS => {     #说明成功
        "changed": false, 
        "ping": "pong"
    }
    192.168.1.30 | SUCCESS => {     #说明成功
        "changed": false, 
        "ping": "pong"
    }
    

    当管理主机较多时,可以使用以下脚本,批量下发密钥对

    #!/usr/bin/expect
    
    set timeout 10
    set hostname [lindex $argv 0]
    set username [lindex $argv 1]
    set password [lindex $argv 2]
    
    spawn ssh-copy-id $username@$hostname
    
    expect {
                "Are you sure you want to continue connecting (yes/no)?" {
                send "yes
    "
                expect "*password:"
                send "$password
    "
                }
    
                "*password:" {
                send "$password
    "
                }
                "Now try logging into the machine" {
                }
            }
    expect eof
    
    #!/bin/bash
    
    USER=root
    PASSWD=1233
    
    # yum install -y expect
    
    for HOST in 192.168.1.{1..10}
    do
            echo "------------------>" $HOST "-----------------------------"
    /usr/bin/expect -c "
    spawn ssh-copy-id $USER@$HOST;
    expect {
                "Are you sure you want to continue connecting (yes/no)?" {
                send "yes
    "
                expect "*password:"
                send "$PASSWD
    "
                }
    
                "*password:" {
                send "$PASSWD
    "
                }
                "Now try logging into the machine" {
                }
            }
    expect eof
    "
    done
    

    主机清单与端口

    ◆主机和组◆

    我们可以通过配置/etc/ansible/hosts这个文件来定义主机和主机组,例如下面的代码.

    [root@localhost ~]# cat -n /etc/ansible/hosts
    
    1 192.168.1.10 ansible_ssh_pass='123123'
    2 192.168.1.20 ansible_ssh_pass='123123'
    3 
    4 [docker]
    5 172.168.1.10[1:9]
    
    6 [docker:vars]
    7 ansible_ssh_pass='123123'
    
    
    8 [web_server]
    9  192.168.10.10
    10 192.168.10.20
    11 192.168.10.30
    
    

    上图的参数解析:
    ● 第1-2行:定义了两台主机,并且使用内置变量给予了SSH登陆密码.
    ● 第4-5行:定义了一个docker组,且组内有101-109这9台机器的定义.
    ● 第6-7行:定义为上面的docker组统一赋值一个密码.
    ● 第8-11行:定义了一个web_server组,其中有三台主机.

    这就是,常用的组的定义与声明部分啦.

    ◆端口与别名◆

    ssh默认的端口是22 (此时的Ansible主机配置文件可以省略),但是如果某些主机的ssh运行在自定义的端口上,Ansible使用Paramiko进行ssh连接时不会使用你ssh配置文件中列出的端口,但是如果修改ansible使用openssh进行ssh连接时将会使用:

    1.在Client客户端上ssh开启2个端口连接,下面一段话随意加入到指定配置文件里即可.

    [root@Client ~]# vim /etc/ssh/sshd_config
    Port 10086
    Port 22
    
    [root@Client ~]# systemctl restart sshd
    

    2.在Ansible服务端的配置,配置主机清单列表同时指定一个主机端口即可.

    [root@Ansible ~]# vim /etc/ansible/hosts
    
    [web_server]
    192.168.10.10:10086
    192.168.10.20:10086
    
    [web_server:vars]
    ansible_ssh_pass='123123'
    

    ◆使用主机变量◆

    这里介绍 Ansible Invento 的内置的一些参数,这些参数我们在实际工作中也会经常使用到.

    内置参数 参数说明
    ansible_ssh_host 指定被管理的主机的真实IP
    ansible_ssh_port 指定连接到被管理主机的ssh端口号,默认是22
    ansible_ssh_user ssh连接时默认使用的用户名
    ansible_ssh_pass ssh连接时的密码
    ansible_sudo_pass 使用sudo连接用户时的密码
    ansible_sudo_exec 如果sudo命令不在默认路径,需要指定sudo命令路径
    ansible_ssh_private_key_file 秘钥文件路径,秘钥文件如果不想使用ssh-agent管理时可以使用此选项
    ansible_shell_type 目标系统的shell的类型,默认sh
    ansible_connection SSH 连接的类型:local,ssh,paramiko
    ansible_python_interpreter 用来指定python解释器的路径

    上面的实例也可以配置直接使用用户名和密码进行连接

    [root@localhost ~]# vim /etc/ansible/hosts
    
    [web_server]
    192.168.10.10 ansible_ssh_port=10086 ansible_ssh_user=root ansible_ssh_pass='123123'
    
    [docker_server]
    192.168.10.10
    192.168.10.20
    
    [docker_server:vars]
    ansible_ssh_port=10086
    ansible_ssh_user=root
    ansible_ssh_pass='123123'
    

    常用Ad-Hoc模块

    ◆Shell◆

    shell 模块可以帮助我们在远程主机上执行命令,它与 command 模块不同之处是 shell 模块在远程主机中执行命令时,会运行远程主机上的 /bin/sh 程序处理,也就是说它不是直接执行命令,而是交给了bash来托管执行,这样一来我们的管道符也就被支持了,笔者还是常用shell这个模块的,因为方便.

    下面来看它的几个常用参数:

    命 令 参 数 参 数 解 释
    free_form 必要参数,默认会使用,无需手动添加
    chdir 指定一个目录,在执行命令前首先会切换到指定目录中去
    creates 当指定的文件存在时,就不执行对应命令,起到判断的作用
    removes 与creates参数相反,当指定的文件不存在时,就不执行对应命令
    executable 默认系统会使用bash这个shell执行,如果要切换shell则使用这个选项

    shell 模块中 chdir、creates、removes参数的作用与 command 模块中的作用都是相同的,这里为了节约篇幅只举一个小例子,改变一下它的默认路径.

    [root@localhost ~]# ansible all -m shell -a "chdir=/boot ls"
    

    紧接着我们看一下executable这个参数来指定一个默认shell,由于这里没有其他shell我们就用bash来演示一下吧.

    [root@localhost ~]# ansible all -m shell -a "executable=/bin/bash uname -r"
    [root@localhost ~]# ansible all -m shell -a "executable=/bin/bash uname -r" -o
    

    ◆Script◆

    script 模块可以帮助我们在远程主机上执行我们编写的管理主机的脚本,也就是说,脚本一直存在于你的管理主机本地,无需手动拷贝到远程主机,你当然也可以使用copy模块将你的脚本拷贝到远程主机,然后执行/bin/bash调用脚本执行,但是这样就太麻烦了,幸好Ansible为我们提供了script管理模块.

    下面来看它的几个常用参数:

    命 令 参 数 参 数 解 释
    free_form 必要参数,默认会使用,无需手动添加
    chdir 指定一个目录,在执行命令前首先会切换到指定目录中去
    creates 当指定的文件存在时,就不执行对应命令,起到判断的作用
    removes 与creates参数相反,当指定的文件不存在时,就不执行对应命令

    我们来编写一个打印系统日期的脚本,然后在使用script模块执行,看一下远程主机的执行情况,这里需要注意的是/root/data.sh是本地路径下脚本的保存位置.

    [root@localhost ~]# cat data.sh 
    #!/bin/bash
    
    date
    
    [root@localhost ~]# ansible all -m script -a "/root/data.sh"
    

    接下来,我们通过使用creates关键字,先判断/etc/passwd是否存在,如果存在则不执行data.sh这个脚本,否则执行.

    [root@localhost ~]# ansible all -m script -a "creates=/etc/passwd /root/data.sh"
    [root@localhost ~]# ansible all -m script -a "removes=/etc/passwd /root/data.sh"
    

    ◆File◆

    file 模块可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限、修以及软硬链接的创建,文件操作File在实际环境中应用还是很广泛的.

    下面来看它的几个常用参数:

    命 令 参 数 参 数 解 释
    path 必选参数,用于指定文件或者目录的路径,使用dest或name也可以
    state 用于指定一个文件的状态,比如state=directory代表针对目录操作
    src 被链接源文件路径/只应用于state=link,只用于软连接或硬链接
    dest 被链接到的路径/只应用于state=link,只用于软连接或硬链接
    force 强制创建软连接/本选项只有两个属性 yes或no
    owner 指定文件/目录的属主,也就是所有者
    group 指定文件/目录的属组,也就是所属组
    mode 指定文件/目录的权限,也就是chmod设置的权限
    recurse 递归设置目录的属性,相当于chmod -R操作
    directory 文件状态:如果目录不存在则创建
    file 文件状态:即使目录不存在也不创建
    link 文件状态:创建软链接选项
    hard 文件状态:创建硬链接选项
    touch 文件状态:文件不存在则创建
    absent 文件状态:删除或取消一个链接

    1.通过命令给远程主机创建一个名为lyshark.log文件,如果/tmp/lyshark.log文件已存在则更新时间戳,否则创建这个文件.

    ansible all -m file -a "path=/tmp/lyshark.log state=touch"
    

    2.在远程主机创建一个名为lyshark的目录,如果/tmp/lyshark这个目录存在,则不进行任何操作.

    ansible all -m file -a "path=/tmp/lyshark state=directory"
    

    3.在远程主机给/bin/bash命令,创建一个名为lyshark.link的软链接,文件存在则不进行任何操作.

    ansible all -m file -a "src=/bin/bash path=/tmp/lyshark.link state=link"
    

    4.在远程主机给/bin/bash命令,创建一个名为lyshark.hard的硬链接,文件存在则不进行任何操作.

    ansible all -m file -a "src=/bin/bash path=/tmp/lyshark.hard state=hard"
    

    5.在远程主机给/bin/bash命令,创建一个名为lyshark.hard的硬链接,若文件存在则强制覆盖一遍.

    ansible all -m file -a "src=/bin/bash path=/tmp/lyshark.hard state=hard force=yes"
    

    6.通过state=absent关键字,删除远程机器上的指定文件或目录,这里我们删除上面的/tmp/lyshark.hard这个硬链接.

    ansible all -m file -a "path=/tmp/lyshark.hard state=absent"
    

    7.在创建文件或目录的时候指定属主与属组,或直接修改远程主机上的文件或目录的属主与属组.

    ansible all -m shell -a "rm -fr /tmp/*" -o      #清空演示目录
    ansible all -m shell -a "useradd admin"         #创建一个用户与组
    ansible all -m file -a "path=/tmp/lyshark state=directory owner=root group=admin"
    ansible all -m file -a "path=/tmp/lyshark mode=777"
    

    7.当操作远程主机中的目录时,同时递归的将/tmp/lyshark目录中的文件的属主属组都设置为admin.

    ansible all -m file -a "path=/tmp/lyshark state=directory owner=admin group=admin mode=777 recurse=yes"
    

    ◆Copy◆

    文件的复制也是最常用的功能之一,在Ansible中我们可以使用copy模块本模块的作用就是拷贝文件它与fetch模块类似,不过fetch模块是从远程主机中拉取文件到 ansible 管理主机,而 copy 模块是将 ansible 管理主机上的文件拷贝到远程主机中,文件的变化是通过MD5值来判断的.

    下面来看它的几个常用参数:

    命 令 参 数 参 数 解 释
    src 用于指定本地文件的保存位置,也就是ansible管理主机的文件位置
    dest 指定文件将被拷贝到远程主机的哪个目录中,此选项必选
    content 用于替代src参数使用,可以直接设定指定文件的值
    force 远程主机文件存在强制拷贝,默认两个选项yes/no
    backup 在覆盖前是否备份,此参数有两个选项yes/no
    owner 在拷贝到远程主机以后,设置属主,远程主机上必须有对应的用户
    group 在拷贝到远程主机以后,设置属组,远程主机上必须有对应的用户
    mode 在拷贝到远程主机以后,设置文件的权限信息
    others 所有的file模块里的选项都可以在这里使用
    directory_mode 递归设定目录的权限,默认为系统默认权限

    1.将 ansible 管理主机中 /etc/passwd 文件复制到远程主机的 /tmp 目录下.

    ansible all -m copy -a "src=/etc/passwd dest=/tmp"
    #注:如果执行失败,请在被控机上安装 yum install libselinux-python -y
    

    2.通过使用content指定文本数据,覆盖写入远程/tmp/passwd文件里,注意这里只能是目录.

    ansible all -m copy -a 'content="www.mkdirs.com
    by:LyShark
    " dest=/tmp/passwd'
    

    3.将ansible主机上的/etc/shadow文件拷贝到远程主机的/tmp/目录下,并指定文件的属组等信息,需要注意,远程主机上必须存在对应的组.

    ansible all -m copy -a 'src=/etc/shadow dest=/tmp/shadow owner=admin group=admin mode=777'
    

    4.将远程主机/bin/bash文件通过feth模块,拉取到本地/root目录下.

    ansible all -m fetch -a "src=/bin/bash dest=/root"
    

    ◆Find◆

    find命令用来在指定目录下查找文件,任何位于参数之前的字符串都将被视为欲查找的目录名,如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示,下面的find 模块也可以帮助我们在被管理主机中查找符合条件的文件,就像 find 命令一样.

    下面来看它的几个常用参数:

    命 令 参 数 参 数 解 释
    paths 指定在哪个目录中查找文件,可以指定多个路径用逗号隔开
    recurse 是否为递归子目录查找文件,参数有两个选项yes/no
    hidden 是否查找隐藏文件,当hidden=yes才会查找隐藏文件
    file_type 指定查找文件的类型,可指定any、directory、file、link 四种
    patterns 指定需要查找文件的名称,想要使用python正则去匹配文件需要使用use_regex=yes
    use_regex 是否启用python正则来查找文件,两种选项yes/no
    contains 根据文章内容查找文件,此参数的值为一个正则表达式
    age 指定文件间隔时间,可使用单位有秒(s)、分(m)、时(h)、天(d)、星期(w)
    age_stamp 根据时间范围查找文件,文件时间属性有三个时间种类,atime、ctime、mtime
    size 根据文件的大小来查找,可以使用的单位有 t、g、m、k、b
    get_checksum 当有符合查找条件的文件被找到时,会同时返回对应文件的sha1校验码

    1.查询远程主机中/etc目录下,包含 passwd 字符串的文件,隐藏文件会被忽略,不会进行递归查找.

    ansible all -m find -a 'paths=/etc contains="*passwd*"'
    

    2.查询远程主机中/etc目录以及子目录中,查找文件内容中包含 passwd 字符串的文件,隐藏文件会被忽略.

    ansible all -m find -a 'paths=/etc contains="*passwd*" recurse=yes'
    

    3.查询远程主机中/etc目录下以 .sh 结尾的文件,包括隐藏文件,但是不包括目录或其他文件类型,不会进行递归查找.

    ansible all -m find -a 'paths=/etc patterns="*.sh" file_type=any hidden=yes'
    

    4.查询远程主机中/etc目录下以 .sh 结尾的文件,包括隐藏文件,包括所有文件类型,比如文件、目录、或者软链接,但是不会进行递归查找.

    ansible all -m find -a 'paths=/etc patterns="*.sh" file_type=any hidden=yes'
    

    5.查询远程主机中/etc目录中以及其子目录中查找 mtime 在1天以内的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型.

    ansible all -m find -a 'paths=/etc age=-1d recurse=yes'
    

    6.查询远程主机中/etc目录中以及其子目录中查找大于 1m 的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型.

    ansible all -m find -a 'paths=/etc size=1m recurse=yes'
    

    7.查询远程主机中/etc目录中以及其子目录中查找以 .sh 结尾的文件,并且返回符合条件文件的 sha1 校验码,包括隐藏文件.

    ansible all -m find -a 'paths=/etc patterns=*.sh get_checksum=yes hidden=yes recurse=yes'
    

    ◆Unarchive◆

    unarchive模块的功能是,解压缩,这个模块有两种用法

    1.将ansible主机上的压缩包在本地解压缩后传到远程主机上,这种情况下copy=yes
    2.将远程主机上的某个压缩包解压缩到指定路径下,这种情况下,需要设置copy=no

    下面来看它的几个常用参数:

    命 令 参 数 参 数 解 释
    copy 在解压文件之前,是否先将文件复制到远程主机,默认为yes
    creates 指定一个文件名,当该文件存在时,则解压指令不执行
    src 如果copy为yes,则需要指定压缩文件的源路径
    dest 远程主机上的一个路径,即文件解压的路径
    list_files 列出压缩包里的文件,默认两个参数yes/no
    mode 解压后文件的权限设置
    group 解压后的目录或文件的属组
    owner 解压后文件或目录的属主

    将ansible控制主机上的/root/lyshark.tar.gz解压缩到远程主机的/tmp/目录下,并设置权限777.

    [root@localhost ~]# ansible all -m unarchive -a "src=/root/lyshark.tar.gz dest=/tmp/ mode=777"
    

    ◆Lineinfile◆

    lineinfile模块相当的重要,在自动化运维中起到了至关重要的目的,他可以通过正则表达式替换指定文本,例如开启一些配置选项等,还可以新加一行文本,或者是删除指定的行,本命令一定认证的掌握下来.

    下面来看它的几个常用参数:

    命 令 参 数 参 数 解 释
    path 必须参数,指定要操作的文件路径
    line 必须参数,指定要替换的文本内容
    regexp 匹配正则语句,与要过滤的关键字
    state 状态语句:state=absent则是删除,state=present默认
    backrefs 表示是否开启后向引用,默认no,yes/no
    create 当文件不存在时,是否创建对应的文件,yes/no
    backup 是否在修改文件之前对文件进行备份
    insertafter 借助insertafter参数可以将文本插入到"指定的行"之后
    insertbefore 借助insertafter参数可以将文本插入到"指定的行"之前

    0.将远程文件的www字段全部替换成wangrui,并且在替换前做备份操作.

    ansible all -m replace -a 'path=/tmp/lyshark.log regexp="www" replace="wangrui" backup=yes'
    

    1.通过正则匹配查找/etc/selinux/config文本中开头是SELINUX=的行,并替换成SELINUX=disabled.

    ansible all -m lineinfile -a 'path=/etc/selinux/config regexp="^SELINUX=" line="SELINUX=disabled"'
    

    2.通过正则匹配查找/etc/selinux/config文本,并在文本末尾插入一行mkdirs.com

    ansible all -m lineinfile -a 'path=/etc/selinux/config regexp="EOF" line="mkdirs.com"'
    

    3.通过正则匹配查找/etc/selinux/config文本,并在文本行首插入一行mkdirs.com.

    ansible all -m lineinfile -a 'path=/etc/selinux/config regexp="BOF" line="mkdirs.com"'
    

    4.通过正则匹配查找/etc/selinux/config文本,删除所有的mkdirs.com字段.

    ansible all -m lineinfile -a 'path=/etc/selinux/config regexp="^mkdirs.com" state=absent'
    

    5.通过正则匹配查找/etc/selinux/config文本中在开头是SELINUX=disabled行的行后插入一段话mkdirs.com.

    ansible all -m lineinfile -a 'path=/etc/selinux/config insertafter="^SELINUX=" line="mkdirs.com"'
    

    6.通过正则匹配查找/etc/selinux/config文本中在开头是SELINUX=disabled行的行前插入一段话mkdirs.com.

    ansible all -m lineinfile -a 'path=/etc/selinux/config insertbefore="^SELINUX=" line="mkdirs.com"'
    

    ◆Setup◆

    setup 模块用于收集远程主机的一些基本信息,其可以收集几乎主机上的任何数据,方便我们后期的分析工作.

    下面来看它的几个常用参数:

    命 令 参 数 参 数 解 释
    ansible_all_ipv4_addresses 仅显示ipv4的信息
    ansible_devices 仅显示磁盘设备信息
    ansible_distribution 显示是什么系统,例:centos,suse等
    ansible_distribution_major_version 显示是系统主版本
    ansible_distribution_version 仅显示系统版本
    ansible_machine 显示系统类型,例:32位还是64位
    ansible_eth0 仅显示eth0的信息
    ansible_hostname 仅显示主机名
    ansible_kernel 仅显示内核版本
    ansible_lvm 显示lvm相关信息
    ansible_memtotal_mb 显示系统总内存
    ansible_memfree_mb 显示可用系统内存
    ansible_memory_mb 详细显示内存情况
    ansible_swaptotal_mb 显示总的swap内存
    ansible_swapfree_mb 显示swap内存的可用内存
    ansible_mounts 显示系统磁盘挂载情况
    ansible_processor 显示cpu个数(具体显示每个cpu的型号)
    ansible_processor_vcpus 显示cpu个数(只显示总的个数)

    1.通过setup命令获取远程主机的主机信息.

    [root@localhost ~]# ansible all -m setup
    

    2.获取远程主机的 IPV4 地址,或者是IPV6地址.

    [root@localhost ~]# ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
    [root@localhost ~]# ansible all -m setup -a "filter=ansible_all_ipv6_addresses"
    

    3.获取远程主机的内存信息列表.

    [root@localhost ~]# ansible all -m setup -a "filter=ansible_memory_mb"
    

    4.通过通配符实现模糊匹配,比如以"mb"关键字结尾的信息.

    [root@localhost ~]# ansible all -m setup -a "filter=*mb"
    

    5.查询系统eth0接口相关信息列表.

    [root@localhost ~]# ansible all -m setup -a "filter=ansible_ens32"
    

    ◆Yum◆

    yum 模块可以帮助我们在远程主机上通过yum源管理软件包,软件的安装也是至关重要的,这里我们介绍Yum模块,主要用户批量部署常用组件.yum 模块可以提供的status状态:latest,present,installed:这3个分别代表安装,后面2个是卸载.

    下面来看它的几个常用参数:

    命 令 参 数 参 数 解 释
    name 必须参数,用于指定需要管理的软件包
    state 用于指定软件包的状态,默认值为present
    disable_gpg_check 用于禁用对 rpm 包的公钥 gpg 验证,默认值为 no
    enablerepo 用于指定安装软件包时临时启用的 yum 源
    disablerepo 用于指定安装软件包时临时禁用的 yum 源

    1.安装软件:通过Yum模块批量的安装httpd服务到指定主机上.

    [root@localhost ~]# ansible all -m yum -a "name=httpd state=installed" -o
    [root@localhost ~]# ansible all -m shell -a "rpm -qa httpd" -o
    

    2.卸载软件:通过Yum模块批量的卸载httpd服务主机.

    [root@localhost ~]# ansible all -m yum -a "name=httpd state=removed" -o
    [root@localhost ~]# ansible all -m shell -a "rpm -qa httpd" -o
    

    ◆Cron◆

    cron 模块可以帮助我们管理远程主机中的计划任务,功能相当于 crontab 命令.

    下面来看它的几个常用参数:

    命 令 参 数 参 数 解 释
    user 用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户
    job 指定计划的任务中需要实际执行的命令或者脚本
    name 用于设置计划任务的名称,计划任务的名称会在注释中显示
    state 相关状态信息,当删除计划任务时,需要将 state 的值设置为 absent
    disabled 当计划任务有名称时,我们可以根据名称使对应的任务失效
    backup 此参数的值设置为yes,那么当修改或者删除对应的计划任务时,会对计划任务备份
    $time 指定具体的执行时间,minute分,hour时,day天,month月,weekday 0-7 代表周

    1.创建计划任务,任务名称为mkdirs test 任务于每天1点5分,执行输出一段话echo hello lyshark.

    ansible all -m cron -a "name='mkdirs test' minute=5 hour=1 job='echo hello lyshark'"
    

    2.创建计划任务任务名称为mkdirs test1 任务每3天执行一次,于执行当天的1点1分开始执行,任务内容为输出wangrui字符.

    ansible all -m cron -a "name='mkdirs test1' minute=1 hour=1 day=*/3 job='echo wangrui'"
    

    3.删除计划任务mkdirs test1,删除前做好备份.

    ansible all -m cron -a "name='mkdirs test1' state=absent backup=yes"
    

    4.查询远程主机上的任务列表.

    ansible all -m shell -a "crontab -l" -o
    

    5.其他配置过程.

    ansible all -m cron -a "name='test cron' job='/bin/bash /tmp/lyshark.sh' weekday=6"
    ansible all -m cron -a "name='test admin' job='/bin/bash /tmp/lyshark.sh' weekday=6 minute=30 hour='*/8'"
    ansible all -m cron -a "name='test cron' job='/bin/bash /tmp/lyshark.sh' minute=30 hour='*/8' day='1,10,20' weekday=6"
    

    ◆Service◆

    service 模块可以帮助我们管理远程主机上的服务,它完全可以替代Linux系统下的,相关操作比如启动服务,设置开机自启动.

    下面来看它的几个常用参数:

    命 令 参 数 参 数 解 释
    name 此参数用于指定需要操作的服务名称
    state 此参数用于指定服务的状态,started、stopped、restarted、reloaded
    enabled 此参数用于指定是否将服务设置为开机 启动项

    1.设置服务开机自启动,设置httpd服务开机自启动.

    [root@localhost ~]# ansible all -m service -a "name=httpd runlevel=3 state=started enabled=yes"
    

    2.关闭服务开机自启动,关闭httpd服务开机自启动.

    [root@localhost ~]# ansible all -m service -a "name=httpd runlevel=3 state=stopped enabled=no"
    

    ◆Get_url◆

    get_url模块用于下载指定文件到本地,在生产环境中也是最常用的东西啦.

    下面来看它的几个常用参数:

    命 令 参 数 参 数 解 释
    dest 文件下载到远程的那个目录下
    force 是否强制覆盖yes/no
    url 指定一个URL地址

    1.下载一个指定文件到远程主机,我这里没有网络,这里只做演示吧.

    [root@localhost ~]# ansible all -m get_url -a "url=http://mirrors.aliyun.com/repo/Centos-7.repo dest=/root"
    

    PlayBook 实战部署

    部署LAMP

    1.创建一个hosts文件列表,并指定用户名以及密码.

    [root@localhost playbook]# vim hosts
    
    [lamp]
    192.168.1.31
    192.168.1.32
    
    [lamp:vars]
    ansible_ssh_port=22
    ansible_ssh_user=root
    ansible_ssh_pass='1233'
    

    2.创建剧本文件.

    [root@localhost playbook]# vim main.yml
    
    ## 初始化,关闭防火墙,和SELinux
     - hosts: lamp
       tasks:
         - name: off selinux and iptables
           shell: setenforce 0 && iptables -F
         - name: permanent off selinux
           lineinfile:
                dest: /etc/selinux/config
                regexp: '^SELINUX='
                line: 'SELINUX=disabled'
    #----------------------------------------------------------
     - hosts: lamp
       tasks:
         - name: shell install lamp
           shell: yum install -y apr apr-util httpd mariadb mariadb-server php php-mysql
         - name: copy index.html index.php
           copy: src={{item.src}} dest={{item.dest}} owner=root group=root mode=644
           with_items:
               - {src: ./index.html,dest: /var/www/html/index.html}
               - {src: ./index.php,dest: /var/www/html/index.php}
         - name: start httpd,mariadb
           shell: systemctl restart httpd mariadb
         - name: set mysql password
           shell: mysql -e "set password=password('123123');"
    
           notify:                # 上一条命令执行成功发送notify消息
              - run httpd
              - run mariadb
    
       handlers:                  # 接到指定的消息并执行相应的过程
          - name: run httpd
            service: name=httpd state=restarted
          - name: run mariadb
            service: name=mariadb state=restarted
    

    3.检查剧本并执行

    [root@localhost playbook]# ansible-playbook -i hosts main.yml --syntax-check
    [root@localhost playbook]# ansible-playbook -i hosts main.yml --list-task
    [root@localhost playbook]# ansible-playbook -i hosts main.yml --list-hosts
    
    [root@localhost playbook]# ansible-playbook -i hosts main.yml
    

    部署Zabbix客户端

    [root@localhost playbook]# cat hosts
    [zabbix_client]
    192.168.1.31
    192.168.1.32
    
    [zabbix_client:vars]
    ansible_ssh_port=22
    ansible_ssh_user=root
    ansible_ssh_pass='1233'
    

    2.编写简单的部署脚本 main.yml

    ---
     - hosts: zabbix_client
       #remote_user: root              #指定远程SSH认证用户
       #sudo: yes                      #启用Sudo操作
       #sudo_user: lyshark             #指定Sudo的用户
       vars:
         - ServerIP: 192.168.1.30
       tasks:
         - name: wget zabbix-agent-4.0.0-2.el7.x86_64.rpm
           get_url: url="http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.0-2.el7.x86_64.rpm" dest="/tmp"
         - name: install zabbix-agent-4.0.0-2.el7.x86_64.rpm
           shell: rpm -i /tmp/zabbix-agent-4.0.0-2.el7.x86_64.rpm
    
         - name: edit zabbix_agentd.conf
           lineinfile:
                dest: /etc/zabbix/zabbix_agentd.conf
                regexp: 'Server=127.0.0.1'
                line: 'Server={{ServerIP}}'
         - name: edit zabbix_agentd.conf
           lineinfile:
                dest: /etc/zabbix/zabbix_agentd.conf
                regexp: 'ServerActive=127.0.0.1'
                line: 'ServerActive={{ServerIP}}'
         - name: edit zabbix_agentd.conf
           lineinfile:
                dest: /etc/zabbix/zabbix_agentd.conf
                regexp: 'Hostname=Zabbix server'
                line: 'Hostname={{ServerIP}}'
    
         - name: start zabbix
           shell: /usr/sbin/zabbix_agentd
         - name: enable zabbix
           shell: echo "/usr/sbin/zabbix_agentd" >> /etc/bashrc
    

    3.检查剧本并执行

    [root@localhost playbook]# ansible-playbook -i hosts main.yml --syntax-check
    [root@localhost playbook]# ansible-playbook -i hosts main.yml --list-task
    [root@localhost playbook]# ansible-playbook -i hosts main.yml --list-hosts
    
    [root@localhost playbook]# ansible-playbook -i hosts main.yml
    
  • 相关阅读:
    Ubuntu14 vsftp 的安装和虚拟用户配置
    Tomcat 8.5 apr 模式配置
    shell 脚本规范
    Linux ssh的的用法
    zabbix3.0自动发现磁盘并监控磁盘IO
    记一次用Linux curl命令获取Django url返回值异常的问题
    zabbix4.0短信告警配置
    shell脚本从入门到精通(中级)之提高篇
    shell脚本从入门到精通(初级)之入门篇
    jquery ajax error函数和及其参数详细说明 (转)
  • 原文地址:https://www.cnblogs.com/LyShark/p/11354058.html
Copyright © 2020-2023  润新知