zoukankan      html  css  js  c++  java
  • Ubuntu18.04下Ansible的基本使用

    这里使用四台Ubuntu18.04主机(一台充当Ansible管理端服务器,另外三台充当Ansible被管理端服务器),Ansible用apt安装,版本为2.9.10,下表是它们所使用的操作系统以及IP地址。

    四台Ubuntu18.04主机所使用的操作系统以及IP地址

    主机名称 操作系统 IP地址
    Ansible管理端服务器 Ubuntu18.04 192.168.0.132
    Ansible被管理端服务器 Ubuntu18.04 192.168.0.133
    Ansible被管理端服务器 Ubuntu18.04 192.168.0.134
    Ansible被管理端服务器 Ubuntu18.04 192.168.0.135

    Ansible官网文档:https://docs.ansible.com

    Ansible服务特点说明:

    (1)管理端不需要启动服务程序(no server)

    (2)管理端不需要编写配置文件(/etc/ansible/ansible.cfg)

    (3)受控端不需要安装软件程序(libselinux-python)

           被管理端selinux服务没有关闭 --- 影响ansible软件的管理

           libselinux-python让selinux开启的状态也可以使用ansible程序

    (4)受控端不需要启动服务程序(no agent)

    (5)服务程序管理操作模块众多(module)

    (6)利用剧本编写来实现自动化(playbook)

    提示:以下操作均在root用户下进行,如在普通用户,请自行加上sudo!

    查看系统版本:

    lsb_release -a

    一、安装Ansible

    注意:以下操作均在Ansible管理端服务器上!

    官网文档截图:

    依次执行以下命令,安装ansible:

    apt update

    apt install software-properties-common

    apt-add-repository --yes --update ppa:ansible/ansible

    apt install ansible

    安装完成后,查看ansible的版本:

    ansible --version

    二、创建“密钥对”,Ansible是基于SSH远程管理服务实现远程主机批量管理的

    注意:这里使用的是root用户,Ubuntu18.04默认root用户没有密码,并且不能使用SSH远程,(需要设置root密码,使用命令:sudo passwd root,需要开启root用户SSH远程权限,在配置文件/etc/ssh/sshd_config里加入PermitRootLogin yes配置,重启SSH服务生效即可)

    ssh-keygen(也可以使用-t选项指定秘钥的类型,如:ssh-keygen -t rsa或ssh-keygen -t dsa)

    三、使用脚本将公钥批量分发至Ansible被管理端服务器

    思考,批量分发公钥时有两个问题:

    1、需要输入连接确认信息 yes/no

    2、需要第一次连接输入密码

    解决方法:

    1、使用-o StrictHostKeyChecking=no选项,即可解决第一个问题

    2、使用sshpass即可解决第二个问题,sshpass用于非交互的ssh密码验证,使用-p参数指定明文密码,然后直接登录远程服务器。

       安装sshpass命令,apt install sshpass

    实现脚本:

    for i in `seq 3 5`; do sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.13$i "-o StrictHostKeyChecking=no"; done

    查看软件安装到系统里面的文件目录信息

    dpkg -L ansible|egrep -v "^/usr/(share|lib)"

    说明:

    /etc/ansible/ansible.cfg   # ansible服务配置文件

    /etc/ansible/hosts           # 主机清单文件,定义可以管理的主机信息

    /etc/ansible/roles            # 角色配置文件

    四、配置主机清单文件,并测试是否可以管理多个主机

    打开配置文件:vim /etc/ansible/hosts

    在配置文件最后,输入所有Ansible被管理端服务器的IP地址

    保存退出后,进行测试基于秘钥的SSH是否连接正常

    执行下面的命令,查看Ansible被管理端服务器的主机名:

    ansible all -a "hostname"

    可以看到被管理端服务器主机名分别为:ceph3、ceph4、ceph2

    五、Ansible模块的应用

    模块的应用语法格式:

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

    命令类型模块

    1、command模块(官方文档:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module

    简单用法:

    查看所有在主机清单配置文件里主机的主机名

    ansible all -m command -a "hostname"(command也是个Ansible默认模块,-m command可以不写)

    扩展应用

    官方截图:

    (1)参数:chdir,在执行命令之前对目录进行切换

    以下命令意思是:在所有被管理端服务器的tmp目录下创建demo.txt文件

    ansible all -m command -a "chdir=/tmp touch demo.txt"

    可以看到有条警告信息,如果不想再看到,根据说明进入Ansible配置文件:vim /etc/ansible/ansible.cfg,去掉command_warnings = False(188行)配置前的#即可,注意要顶格。

    (2)参数:creates,如果文件存在了,不执行命令操作

    以下命令意思是:如果被管理端服务器/tmp目录下没有hosts文件(注意:如果不加chdir=/tmp,默认会将文件创建到家目录下),则创建demo123.txt文件

    ansible all -m command -a "creates=/tmp/hosts chdir=/tmp touch demo123.txt"

    (3)参数:removes,如果文件存在了, 这个步骤将执行

    以下命令意思是:如果被管理端服务器/tmp目录下有hosts文件(注意:如果不加chdir=/tmp,默认会将文件创建到家目录下),则创建demo456.txt文件

    ansible all -m command -a "removes=/tmp/hosts chdir=/tmp touch demo456.txt"

    注意事项:command模块有些符号信息无法识别,如:"<",">","|",";","&"

    2、shell模块(官方文档:https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module

    shell模块参数功能和command模块类似

    简单用法:

    查看所有在主机清单配置文件里主机的主机名

    ansible all -m shell -a "hostname"

    shell模块被称为万能模块,command模块能干的不能干的它都能干

    ansible all -m shell -a "chdir=/tmp touch demo.txt"

    ansible all -m shell -a "creates=/tmp/hosts chdir=/tmp touch demo123.txt"

    ansible all -m shell -a "removes=/tmp/hosts chdir=/tmp touch demo456.txt"

    shell模块,这些"<",">","|",";","&"符合都可以识别:

    ansible all -m shell -a "echo 123 >> /tmp/hosts.bak"

    ansible all -m shell -a "grep 192 /etc/hosts"

    3、script模块(官方文档:https://docs.ansible.com/ansible/latest/modules/script_module.html#script-module

    scripts模块参数功能也和command模块类似

    新建demo.sh文件,写入以下脚本,脚本内容是计算1到100的累加和并将结果重定向到tmp目录的sum.txt文件:

    vim /root/demo.sh

    #!/bin/bash
    sum=0
    for i in `seq 1 100`
    do
            sum=$[$i+$sum]
    done
    echo $sum > /tmp/sum.txt

    保存退出后,执行以下命令,命令意思是:在所有被管理端服务器执行demo.sh脚本

    ansible all -m script -a "/root/demo.sh"

    文件类型模块

    1、copy模块,批量分发文件(官方文档:https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module

    以下命令意思是:将管理端服务器/root目录下的demo.sh文件批量分发至所有被管理端服务器/tmp目录下

    ansible all -m copy -a "src=/root/demo.sh dest=/tmp/"

    扩展用法:

    (1)在传输文件时修改文件的属主和属组信息,注意:指定的属主和属组必须在被管理端服务器存在,否则会报错

    ansible all -m copy -a "src=/root/demo.sh dest=/tmp/ owner=zhangsan group=zhangsan"

    (2)在传输文件时修改文件的权限信息

    ansible all -m copy -a "src=/root/demo.sh dest=/tmp/ mode=777"

    (3)在传输数据文件信息时对远程主机源文件进行备份,注意:文件必须有改动后再次传输才会备份,被管理端服务器的文件备份名类似这样,demo.sh.8328.2020-06-20@03:51:21~ 

    ansible all -m copy -a "src=/root/demo.sh dest=/tmp/ backup=yes"

    (4)创建一个文件并直接编辑文件的信息

    ansible all -m copy -a "content='123456' dest=/tmp/rsync.password"

    复制文件时加不加“/”的区别:

    ansible all -m copy -a "src=/tmp dest=/tmp/"

    src后面目录没有/:将目录本身以及目录下面的内容都进行远程传输复制

    ansible all -m copy -a "src=/tmp/ dest=/tmp/"

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

    2、file模块,设置文件属性信息(官方文档:https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module

    基本用法:

    ansible all -m file -a "dest=/tmp/demo.sh owner=zhangsan group=zhangsan mode=666"

    扩展用法:

    可以利用模块创建数据信息 (文件 目录 链接文件)

    state  参数

    =absent     # 缺席/删除数据信息

    =directory  # 创建一个目录信息

    =file           # 检查创建的数据信息是否存在,绿色存在,红色不存在

    =hard        # 创建一个硬链接文件

    =link          # 创建一个软链接文件

    =touch       # 创建一个文件信息

    创建目录信息:

    ansible all -m file -a "dest=/tmp/demo/ state=directory"

    ansible all -m file -a "dest=/tmp/demo/demo01/demo02 state=directory"

    创建文件信息:

    ansible all -m file -a "dest=/tmp/demo.py state=touch"

    创建链接文件信息:

    ansible all -m file -a "src=/tmp/demo.txt dest=/tmp/demo_hard.txt state=hard"

    ansible all -m file -a "src=/tmp/demo.txt dest=/tmp/demo_link.txt state=link"

    在被管理端服务器上验证是否为硬链接,也就是查看inode索引节点编号是否相同,相同即为硬链接:ll -i /tmp/demo_hard.txt /tmp/demo.txt

    可以利用模块删除数据信息

    ansible all -m file -a "dest=/tmp/demo.txt state=absent"

    ansible all -m file -a "dest=/tmp/demo/ state=absent"

    3、 fetch模块,批量拉取数据(官方文档:https://docs.ansible.com/ansible/latest/modules/fetch_module.html#fetch-module

    以下命令意思是:将所有被管理端服务器/tmp目录下的demo.txt文件批量拉取到管理端服务器的/tmp目录下

    ansible all -m fetch -a "src=/tmp/demo.txt dest=/tmp"

    拉取成功后的目录,默认以主机IP命名

    包类型模块

    1、apt模块(官方文档:https://docs.ansible.com/ansible/latest/modules/apt_module.html#apt-module

    批量安装apache2 :

    ansible all -m apt -a "name=apache2 state=present"

    ansible all -m apt -a "name=apache2 state=latest"

    批量卸载apache2 :

    ansible all -m apt -a "name=apache2 state=absent"

    说明:

    name  # 指定安装软件名称

    state   # 指定是否安装软件

      absent  # 卸载

      build-dep

      latest    # 安装最新版本

      present(默认)

      fixed

    系统类型模块

    1、service模块,被管理端服务器上服务的运行状态,停止,开启,重启(官方文档:https://docs.ansible.com/ansible/latest/modules/service_module.html#service-module

    批量停止apache2服务,并禁止开机自启动

    ansible all -m service -a "name=apache2 state=stopped enabled=no"

    说明:

    name  # 指定管理的服务名称

    state   # 指定服务状态

      reloaded  # 重新加载

      restarted  # 重新启动

      started     # 启动

      stopped      # 停止

    enabled  # 指定服务是否开机自启动

    2、cron模块,批量设置多个主机的定时任务信息(官方文档:https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module

    基本用法:

    ansible all -m cron -a "minute=0 hour=2 job='sync && echo 3 > /proc/sys/vm/drop_caches >/dev/null 2>&1'"

    说明:

     *   *   *   *   *  定时任务动作

    分 时 日 月 周

    ansible-doc -s cron  # 查看使用说明

    minute     # 设置分钟信息

    hour      # 设置小时信息

    day        # 设置日期信息

    month      # 设置月份信息

    weekday     # 设置周信息

    job       # 用于定义定时任务需要干的事情

    扩展用法:

    (1)给定时任务设置注释信息

    ansible all -m cron -a "name='time sync' minute=0 hour=2 job='sync && echo 3 > /proc/sys/vm/drop_caches >/dev/null 2>&1'"

    (3)批量注释定时任务,disabled=yes为注释,disabled=no为取消注释

    ansible all -m cron -a "name='time sync' minute=0 hour=2 job='sync && echo 3 > /proc/sys/vm/drop_caches >/dev/null 2>&1' disabled=yes"

    (2)删除指定定时任务

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

    注意:ansible可以删除的定时任务,只能是ansible设置好的定时任务

    3、mount模块,批量进行挂载操作(官方文档:https://docs.ansible.com/ansible/latest/modules/mount_module.html#mount-module

    基本用法:

    ansible all -m mount -a "src=192.168.0.130:/data path=/mnt fstype=nfs state=mounted"

    参数:

    src:需要挂载的存储设备或文件信息

    path:指定目标挂载点目录

    fstype:指定挂载时的文件系统类型

    state

      present/mounted     # 进行挂载

      present:不会实现立即挂载,修改fstab文件,实现开机自动挂载

      mounted:会实现立即挂载,并且会修改fstab文件,实现开机自动挂载 *****

      absent/unmounted    # 进行卸载

      absent:会实现立即卸载,并且会删除fstab文件信息,禁止开机自动挂载

      unmounted:会实现立即卸载,但是不会删除fstab文件信息  *****

    4、user模块,实现批量创建用户(官方文档:https://docs.ansible.com/ansible/latest/modules/user_module.html#user-module

    基本用法:

    ansible all -m user -a "name=wangwu"

    扩展用法:

    (1)指定用户uid信息

    ansible all -m user -a "name=wangwu01 uid=6666"

    (2)指定用户组信息,group为指定主要组,groups为指定次要组

    ansible all -m user -a "name=wangwu02 group=wangwu01"

    ansible all -m user -a "name=wangwu03 groups=wangwu01"

    (3)批量创建虚拟用户,create_home=no为不创建家目录

    ansible all -m user -a "name=wangwu04 create_home=no shell=/sbin/nologin"

    (4)给指定用户创建密码

    ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"

    ansible all -i localhost, -m debug -a "msg={{ '密码信息' | password_hash('sha512', '加密校验信息') }}"

    ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'abcdefg') }}"

    ansible all -m user -a 'name=wangwu05 password=$6$abcdefg$SVqgF31LWsg8o0zQyy63h/NIcgk3RP516ZKxuWJasoxHYEkq0YWf.WgIhFz5uK19zJrEK61oiA.TFD5ROrPxH0'

    六、Ansible剧本的编写方法

    学习Ansible剧本编写前,需要先了解下YAML,YAML是专门用来写配置文件的语言,非常简洁和强大,远比JSON格式方便。

    YAML入门教程:https://www.runoob.com/w3cnote/yaml-intro.html

    如何执行剧本:

    第一个步骤:检查剧本的语法格式

    ansible-playbook --syntax-check rsync_server.yaml

    第二个步骤:模拟执行剧本

    ansible-playbook -C rsync_server.yaml

    第三个步骤:直接执行剧本

    ansible-playbook rsync_server.yaml

     

    扩展

    Ansible使用过程中屏幕输出颜色说明:

    绿色信息:查看主机信息/对主机未做改动

    黄色信息:对主机数据信息做了修改

    红色信息:命令执行出错了

    粉色信息:忠告信息

    蓝色信息:显示ansible命令执行的过程

     

  • 相关阅读:
    编程算法
    JDBC连接MySQL数据库及演示样例
    CKEditor&ckfindtor
    从零開始开发Android版2048 (五) 撤销的实现
    TCP/IP之分层
    poj2239 Selecting Courses --- 二分图最大匹配
    英尺到米的换算
    概率dp ZOJ 3640
    Android应用程序注冊广播接收器(registerReceiver)的过程分析
    TsFltMgr.sys系统蓝屏的原因就在于QQ电脑管家!
  • 原文地址:https://www.cnblogs.com/opsprobe/p/13163591.html
Copyright © 2011-2022 走看看