• ansible简介,简单实用


    Ansible 

    ansilbe是实现自动化运维的工具,基于python开发,实现批量系统配置,批量程序部署,批量运行命令等功能。

    ansible是基于模块工作的,自身是没有批量部署的能力。真正具有批量部署能力的是ansible的模块,ansbile只是提供一种框架

    ansbile特点

    模块化:使用特定的模块,完成特定的工作

    支持自定义模块

    基于Python语言开发的

    不需要再被控端安装组件,也就是无需客户端,直接在服务端执行命令。

    批量任务执行可以用脚本,也不需要传递到远程就可以执行。

    ansible的基本架构:

    1.链接插件用于连接主机,连接受控端。

    2.核心模块连接主机实现操作,依靠模块做具体的事情。

    3.自定义模块:根据自己的需求编写模块

    4.插件是对模块功能的补充。

    5.playbook,ansible功能的形象化描述。

    6.host inventory 定义ansible需要的操作主机的范围

    Ansible使用

    服务端:10.220.5.63

    两个被控端:10.220.5.65

                          10.220.5.66

    一、安装ansible

    [root@63 ~]# yum install ansible

    查看版本

    [root@63 ~]# ansible --version
    ansible 2.6.2
      config file = /etc/ansible/ansible.cfg
      configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
      ansible python module location = /usr/lib/python2.7/site-packages/ansible
      executable location = /usr/bin/ansible
      python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 2015

    相关文档

    [root@63~]# rpm -qc ansible
    /etc/ansible/ansible.cfg
    /etc/ansible/hosts

    二、生成密钥

    [root@63 ~]# ssh-keygen -t rsa
    [root@63 ~]#  ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.63
    [root@63 ~]#  ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.65
    [root@63~]#  ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.66
    [root@63 ~]#  ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.63 <<<自己也作为受控端
    [root@63 ~]#  ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.65
    [root@63~]#  ssh-copy-id -i ~/.ssh/id_rsa.pub 10.220.5.66

    在主控端/etc/hosts中添加受控端主机信息

    [root@63 ~]# vim /etc/hosts

    10.220.5.65 slave1
    10.220.5.66 slave2

    测试是否能免密码登录

    [root@63 ~]# ssh slave1
    Last login: Sat Nov 17 01:32:37 2018 from 10.220.5.63
    [root@slave1 ~]# <<<为10.220.5.65主机

    测试

    [root@63 ~]# ssh slave1 ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
        link/ether 00:0c:29:d1:a8:6a brd ff:ff:ff:ff:ff:ff
        inet 10.220.5.65/24 brd 10.220.5.255 scope global noprefixroute ens33
           valid_lft forever preferred_lft forever
        inet 10.220.5.233/24 scope global secondary ens33:1
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fed1:a86a/64 scope link 
           valid_lft forever preferred_lft forever

    三、使用ansible管理其他节点

    格式:ansible <host> [options]
    选项:
             -m:指定模块名称
             -a:指定模块的具体参数
              -s:以sudo的方式运行操作
              -i:指定被管理节点的主机列表
              -f:一次连接几个主机进行操作(默认是5个主机)

    查看ansible所支持的模块的信息

    [root@63 ~]# ansible-doc -l
    默认用command模块

    查看一个模块的使用帮助

    例:

    [root@63 ~]# ansible-doc -s command
    - name: Executes a command on a remote node
      command:
          argv:                  # Allows the user to provide the command as a list vs. a string.  Only the string
                                   or the list form can be provided, not both.  One
                                   or the other must be provided.
          chdir:                 # Change into this directory before running the command.
          creates:               # A filename or (since 2.0) glob pattern, when it already exists, this step will
                                   *not* be run.
          free_form:             # (required) The command module takes a free form command to run.  There is no
                                   parameter actually named 'free form'. See the
                                   examples!
          removes:               # A filename or (since 2.0) glob pattern, when it does not exist, this step will
                                   *not* be run.
          stdin:                 # Set the stdin of the command directly to the specified value.
          warn:                  # If command_warnings are on in ansible.cfg, do not warn about this particular
                                   line if set to `no'.

    模块

    1. command

    默认模块
    作用:在各个远程主机上执行命令,但是不能传递参数和变量,不支持特殊字符

    格式:ansible 目标 -m command -a "命令"
    说明:
    目标:目标可以是一个主机组,也可以是hosts文件中的一个或者多个主机,也可是all
    -m command:表示这次ansible操作是基于command模块实现
    -a "命令":表示是在管理节点上要执行的命令

    例子:获取受控节点主机名

    [root@63~]# ansible webserver -m command -a "hostname"
    10.220.5.65 | SUCCESS | rc=0 >>
    slave1
    
    10.220.5.66 | SUCCESS | rc=0 >>
    slave2

    也可以单独对一个受控端执行命令

    [root@63 ~]# ansible 10.220.5.65 -m command -a "hostname"
    10.220.5.65 | SUCCESS | rc=0 >>
    slave1

    2.shell模块

    也是在各个远程主机上执行命令,但shell模块可以支持特殊字符,command不支持

    chdir:指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。

    creates:数指定一个文件,当指定的文件存在时,就不执行对应命令

    removes:指定一个文件,当指定的文件不存在时,就不执行对应命令

    executable:默认情况下,shell 模块会调用远程主机中的 /bin/sh 去执行对应的命令,通常情况下,远程主机中的默认 shell 都是 bash。如果你想要使用其他类型的 shell 执行命令,则可以使用此参数指定某种类型的 shell 去执行对应的命令。指定 shell 文件时,需要使用绝对路径。

    例子:获取65主机/tmp所有文件

    [root@63 ~]# ansible 10.220.5.65 -m shell -a "ls /tmp/*"
    10.220.5.65 | SUCCESS | rc=0 >>
    /tmp/mysql3306.sock
    /tmp/mysql3306.sock.lock

     3.script

                   作用:在远程主机执行主控端存的shell脚本(相当于scp+shell)

    [root@63 ~]# ansible all -m script -a "/root/shell.sh"
    10.220.5.66 | SUCCESS => {
        "changed": true, 
        "rc": 0, 
        "stderr": "Shared connection to 10.220.5.66 closed.
    ", 
        "stderr_lines": [
            "Shared connection to 10.220.5.66 closed."
        ], 
        "stdout": "", 
        "stdout_lines": []
    }
    10.220.5.65 | SUCCESS => {

    4. cron

    作用:在指定的时间运行指定命令(计划任务)

      cron:
          backup:       计划名称        
          cron_file:    替换客户端用户的计划任务的文件         
          day:          日      
          hour:         小时 
    name: 设置计划任务的名称
    disabled:当计划任务有名称时,我们可以根据名称使对应的任务”失效”(注释掉对应的任务)。
    除了需要指定任务的名称,还需要同时指定任务的job 以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同,
    否则在注释任务的同时,任务的时间设定会被修改,除非你确定这样做。
          special_time  后面可加: reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)。             
          user:          设置当前计划任务属于哪个用户,如果不指定,默认为管理员用户       
          backup:        在修改或者删除计划任务时,会先对计划任务做备份,然后在进行修改或者删除            
          job:               用于指定计划任务中需要实际执行的命令或者脚本   
    state: 当计划任务有名字时,可以根据名称修改或者删除对应的任务,如果需要删除计划任务时,需要将state的值设置为absent

    例子1:每隔2分钟再tmp下的log.txt中追加一个信息

    [root@63 ~]# ansible all -m cron -a 'minute="*/2" job="echo 123>>/tmp/log.txt" name="job1" state="present"'
    10.220.5.66 | SUCCESS => {
        "changed": true, 
        "envs": [], 
        "jobs": [
            "job1"
        ]
    }
    10.220.5.65 | SUCCESS => {
        "changed": true, 
        "envs": [], 
        "jobs": [
            "job1"
        ]

    例子2.在65主机上创建计划任务,任务名称为crontab day test ,任务每五天执行一次,任务内容输出为test

    [root@63 ~]# ansible all -m cron -a " name='crontab day test' minute=1 day=*/3 job='echo test'"
    10.220.5.65 | SUCCESS => {
        "changed": true, 
        "envs": [], 
        "jobs": [
            "job1", 
            "crontab day test"
        ]
    }
    10.220.5.66 | SUCCESS => {
        "changed": true, 
        "envs": [], 
        "jobs": [
            "job1", 
            "crontab day test"
        ]
    }

     例子:.在 65主机上创建计划任务,任务名称为”special time test”,任务将在重启时执行,任务内容为输出 test 字符。

    [root@63 ~]# ansible 10.220.5.65 -m cron -a " name='special time test' special_time=reboot job='echo test'"
    10.220.5.65 | SUCCESS => {
        "changed": true, 
        "envs": [], 
        "jobs": [
            "job1", 
            "crontab day test", 
            "special time test"

    例子:任务”special time test”已经存在于65主机中。,要删除这个计划任务,删除任务的同时可以进行备份。

    [root@63~]# ansible 10.220.5.65 -m cron -a " name='special time test' state=absent backup=yes "
    10.220.5.65 | SUCCESS => {
        "backup_file": "/tmp/crontabNaCVq8", 
        "changed": true, 
        "envs": [], 
        "jobs": [
            "job1", 
            "crontab day test"

     检查一下在65主机上创建的计划任务

    [root@63~]# ansible 10.220.5.65 -a "crontab -l"
    10.220.5.65 | SUCCESS | rc=0 >>
    #Ansible: job1
    */2 * * * * echo 123>>/tmp/log.txt
    #Ansible: crontab day test
    1 * */3 * * echo test

    5.copy

    作用:文件的复制
    子命令:
    src:原文件路径
    dest:目标文件路径
    mode:指定权限
    backup:有目标文件存在,先对原始文件做备份,然后进行覆盖
    force:强制执行覆盖
    owner:指定复制后的文件的属主
    content:替代src

     others:所有的file模块里的选项都可以在这里使用

     例子1:将主控端/etc/passwd 文件,复制到65主机/tmp/目录下,并该名为psswd1

    [root@63 ~]# ansible 10.220.5.65 -m copy -a 'src="/etc/passwd" dest=/tmp/passwd1'
    10.220.5.65 | SUCCESS => {
        "changed": false, 
        "checksum": "be868aa216508a02c3e0c64186e77f191f27eeca", 
        "dest": "/tmp/passwd1", 
        "gid": 0, 
        "group": "root", 
        "mode": "0644", 
        "owner": "root", 
        "path": "/tmp/passwd1", 
        "size": 1565, 
        "state": "file", 
        "uid": 0

    6.user,group

    home:指定用户的家目录,需要与createhome配合使用。
    groups:指定用户的属组。
     uid:指定用的uid。
     password:指定用户的密码。
    注意:指定password参数时,不能使用明文密码,因为后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可。
    name:指定用户名。
    createhome:是否创建家目录 yes|no。
    system:是否为系统用户。
     remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r。
     state:是创建还是删除。(present,absent)
    shell:指定用户的shell环境。
     generate_ssh_key:是否为相关用户生成SSH密钥。 这不会覆盖现有的SSH密钥。
    ssh_key_bits:可选择指定要创建的SSH密钥中的位数。
     ssh_key_passphrase:设置SSH密钥的密码。 如果没有提供密码,SSH密钥将默认没有密码。
    ssh_key_file:指定SSH密钥文件名(可选)。 如果这是一个相对的文件名,那么它将是相对于用户的主目录。
     ssh_key_type:指定要生成的SSH密钥的类型(可选)。 可用的SSH密钥类型将取决于目标主机上的实现。
    例子:在65主机上创建用户名为qq,家目录为/home/,属组为redis,uid为1010

    [root@63 ~]# ansible 10.220.5.65 -m user -a "name=qq home=/home/qq createhome=yes groups=redis uid=1010"
    10.220.5.65 | SUCCESS => {
        "changed": true, 
        "comment": "", 
        "create_home": true, 
        "group": 1010, 
        "groups": "redis", 
        "home": "/home/qq", 
        "name": "qq", 
        "shell": "/bin/bash", 
        "state": "present", 
        "system": false, 
        "uid": 1010

    例子:在65主机上创建用户组httpd

    [root@66 ~]# ansible 10.220.5.65 -m group -a "name=httpd state=present"
    10.220.5.65 | SUCCESS => {
        "changed": true, 
        "gid": 1012, 
        "name": "httpd", 
        "state": "present", 
        "system": fals

    7.yum

    RedHat / CentOS包管理工具
    config_file:yum的配置文件 
    disable_gpg_check:关闭gpg_check 
     disablerepo:不启用某个源 
    enablerepo:启用某个源
     name:要进行操作的软件包的名字,默认最新的程序包,指明要安装的程序包,可以带上版本号,也可以传递一个url或者一个本地的rpm包的路径
    state:状态(present,absent,latest),表示是安装还卸载
       present:默认的,表示为安装
       lastest: 安装为最新的版本
       absent:表示删除
    例子:在65主机安装httpd

    [root@63~]# ansible 10.220.5.65 -m yum -a "name=httpd state=present"
    10.220.5.65 | SUCCESS => {
        "changed": true, 
        "msg": "", 
        "rc": 0, 
        
      ...................................
    }

    8.file模块

    作用:实现文件的各种管理操作
    force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
     group:属组
    mode:权限
    owner:属主
     path:路径
    recurse:递归的设置文件的属性,只对目录有效
    src:要被链接的源文件的路径,只应用于state=link的情况
     dest:被链接到的路径,只应用于state=link的情况
     state:
       directory:如果目录不存在,创建目录
       file:即使文件不存在,也不会被创建
       link:创建软链接
       hard:创建硬链接
       touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
       absent:删除目录、文件或者取消链接文件
    例子:在65主机上创建文件abc.sh

    [root@63 ~]# ansible 10.220.5.65 -m file -a 'state=touch path=/tmp/abc.sh'
    10.220.5.65 | SUCCESS => {
        "changed": true, 
        "dest": "/tmp/abc.sh", 
        "gid": 0, 
        "group": "root", 
        "mode": "0644", 
        "owner": "root", 
        "size": 0, 
        "state": "file", 
        "uid": 0

    将65主机/tmp/abc.sh 链接为/tmp/abc

    [root@63 ~]# ansible 10.220.5.65 -m file -a 'state=link src=/tmp/abc.sh path=/tmp/abc'
    10.220.5.65 | SUCCESS => {
        "changed": true, 
        "dest": "/tmp/abc", 
        "gid": 0, 
        "group": "root", 
        "mode": "0777", 
        "owner": "root", 
        "size": 11, 
        "src": "/tmp/abc.sh", 
        "state": "link", 
        "uid": 0
    }

    9. service

    作用:管理服务

    子命名;
    name:指定服务的名称
    enabled:指定服务是否开机自启动
    state:指定服务最后的状态 started stopped reloaded restarted
    runlevel:指定运行级别

     例子:在65主机上重启网卡

    [root@66  ~]# ansible 10.220.5.65 -m service -a "name=network state=restarted"
    10.220.5.65 | SUCCESS => {
        "changed": true, 
        "name": "network", 
        "state": "started", 

    10.ping

    作用:做ping测试

    例子:对64主机做ping测试

    [root@66  ~]# ansible 10.220.5.64 -m ping
    10.220.5.64 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }

    11.mount模块

    配置挂载点
    选项: 

    dumpfstype:必选项,挂载文件的类型  

     name:必选项,挂载点 

    opts:传递给mount命令的参数

    src:必选项,要挂载的文件 

    state:必选项 

    present:只处理fstab中的配置

     absent:删除挂载点 

    mounted:自动创建挂载点并挂载之 

    umounted:卸载

     例子:在64主机上挂载光盘到/mnt

    [root@66  ~]# ansible 10.220.5.64 -m mount -a "name=/mnt src=/dev/sr0 fstype=iso9660 state=mounted"
    10.220.5.64 | SUCCESS => {
        "changed": true, 
        "dump": "0", 
        "fstab": "/etc/fstab", 
        "fstype": "iso9660", 
        "name": "/mnt", 

                    

                         

  • 相关阅读:
    Codeforces 959 E Mahmoud and Ehab and the xor-MST
    LightOj 1336 Sigma Function
    某考试 T1 sigfib
    [BOI2007] Sequence
    UOJ 41. 矩阵变换
    [BOI2007] Mokia
    SPOJ 26108 TRENDGCD
    bzoj3545: [ONTAK2010]Peaks
    bzoj3910: 火车
    bzoj1185: [HNOI2007]最小矩形覆盖
  • 原文地址:https://www.cnblogs.com/bo-ke/p/9970208.html
Copyright © 2020-2023  润新知