美文网首页工作生活
Ansible基础(一)

Ansible基础(一)

作者: 你好_请关照 | 来源:发表于2019-07-01 23:52 被阅读0次

    前言:

    1、ansible输出结果颜色含义:
    绿色: 命令执行成功 没有对远程主机做任何修改
    黄色: 命令执行成功 大部分情况表示对远程主机做了改动
    红色: 命令执行失败
    粉色: 建议进行操作的方法
    蓝色: 显示命令或剧本执行的过程

    2、ansible帮助文档如何查看:
    ansible-doc -l --- 查看所有ansible模块信息
    ansible-doc -s 模块 --- 查看指定模块详细说明
    ansible-doc 模块 --- 查看指定模块更加详细说明

    一、ansible简介:

    1、ansible 是基于sshd服务实现的
    2、功能简介:

    批量管理服务
    批量部署服务
    批量分发数据
    批量采集数据信息

    3、ansible软件并行批量管理

    二、软件特点

    优点

    1、管理端不需要启动服务程序
    2、管理端不需要编写配置文件
    3、功能强大

    缺点:

    模块太多了

    三、ansible程序功能组成

    1、主机清单
    2、模块功能
    3、剧本编写

    四、ansible使用前准备

    1、基于ssh秘钥方式,将主机秘钥分发至个被管理主机,确保管理主机能直接登录(不用输入密码)
    2、确认epel源更新完毕
    3、安装ansible (yum install ansible -y)

    ==============================================================

    五、ansible 主机清单配置5种方式的(/etc/ansible/hosts)

    1、简单配置

    172.16.1.7
    172.16.1.31
    172.16.1.41

    2、分组配置

    [web]
    172.16.1.31
    172.16.1.41
    [nfs]
    172.16.1.7
    172.16.1.6

    3、符号匹配主机信息

    172.16.1.1 172.16.1.2 .. 172.16.1.200
    [data]
    172.16.1.[30:45]

    4、配置特殊变量信息

    特殊变量参照官方文档:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
    [web]
    172.16.1.7 ansible_user=root ansible_password=123456 ansible_port=22
    [web]
    web01 ansible_host=172.16.1.7 ansible_user=root ansible_password=123456 ansible_port=22

    5、嵌入式胚子

    5.1嵌入子组

    [rsync:children]
    rsync_server
    rsync_client

    [rsync_server]
    172.16.1.41
    [rsync_client]
    172.16.1.7
    172.16.1.31

    5.2嵌入变量(剧本)

    第二种嵌入式:嵌入变量 (剧本)
    [rsync_client]
    172.16.1.7
    172.16.1.31
    [rsync_client:vars]
    ansible_user=root
    ansible_password=123456

    六、管理多台主机语法格式:

    ansible 主机信息(可以是组) -m 模块名称 -a "完成动作"
    举例:

    [root@web01 ~]# ansible server -m command -a "hostname"
    172.16.1.41 | CHANGED | rc=0 >>
    backup-41
    
    172.16.1.31 | CHANGED | rc=0 >>
    nfs01-31
    
    [root@web01 ~]# 
    

    七、常用模块介绍

    在ansible中 使用ansible-doc <模块名称> 来查看单独模块用法

    1、command模块--可批量管理主机执行命令(默认模块)

    常用参数
    官方模块说明:https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module

    参数:chdir--在执行命令操作前进行切换目录

    [root@web01 ~]# ansible server -m command -a "chdir=/tmp pwd"
    

    参数:creates--判断一个文件是否存在,如果存在后面的命令就不会执行

    [root@web01 ~]# ansible server -m command -a "creates=/tmp/hosts touch /tmp/hosts "
    

    参数:removes--判断一个文件是否存在,如果不存在,后续的命令不会被执行

    [root@web01 ~]# ansible server -m command -a "removes=/tmp/test touch /tmp/test"
    

    2、shell模块--可以批量管理主机执行命令(万能模块)

    官方模块说明:https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module
    参数chdir:在执行命令前进行目录切换

    [root@web01 ~]# ansible server -m shell -a "chdir=/tmp ls"
    172.16.1.41 | CHANGED | rc=0 >>
    ansible_command_payload_yJt3M6
    hosts
    ls
    
    172.16.1.31 | CHANGED | rc=0 >>
    ansible_command_payload_G06CEK
    hosts
    ls
    

    参数:creates----判断一个文件是否存在,如果存在,后续命令不会执行

    [root@web01 ~]# ansible server -m shell -a "creates=/tmp/test touch /tmp/test"
     [WARNING]: Consider using the file module with state=touch rather than running 'touch'.  If you need to use command because file is
    insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this
    message.
    
    172.16.1.31 | CHANGED | rc=0 >>
    
    
    172.16.1.41 | CHANGED | rc=0 >>
    

    参数:removes--判断一个文件是否存在,如果不存在则候命的命令不会执行

    [root@web01 ~]# ansible server -m shell -a  "removes=/tmp/test chdir=/tmp ls"
    172.16.1.41 | CHANGED | rc=0 >>
    ansible_command_payload_RhVulC
    hosts
    ls
    test
    
    172.16.1.31 | CHANGED | rc=0 >>
    ansible_command_payload_WVfVC2
    hosts
    ls
    test
    

    3、script模块--批量执行脚本信息

    官网模块说明:https://docs.ansible.com/ansible/latest/modules/script_module.html#script-module
    使用这个模块需要注意的

    1、保证本地(需要执行脚本的设备端)有脚本文件
    2、脚本有执行权限

    [root@web01 ~]# ansible server -m script -a "/web_data/install.sh" 
    

    4、yum模块--批量部署软件程序

    官方模块说明:https://docs.ansible.com/ansible/latest/modules/yum_module.html#yum-module
    参数:name--指定安装软件的名称
    参数:state--指定软件安装或卸载
    在这个模块中卸载使用 removed 安装使用installed;注意看示例

    [root@web01 ~]# ansible server -m yum -a "name=ansible state=installed"
    

    5、service模块--批量管理服务的运行状态

    官网模块说明:https://docs.ansible.com/ansible/latest/modules/service_module.html#service-module

    参数

    name:指定服务名称
    enabled:设置服务是否开机自动运行 yes:开启开机自动运行 no:关闭开机自动运行
    state:指定服务的运行状态(有以下几个状态)

    restarted 重启
    reloaded 重读配置文件(部分服务可用)
    stopped 关闭服务
    started 开启服务

    [root@web01 ~]# ansible server -m service -a "name=sshd state=started"
    

    6、copy模块--将管理端的主机数据文件,分发给被管理端;将管理端目录中的数据移动到其他目录

    官网模块说明:https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module
    参数:src--指定管理端源数据
    参数:dest--分发到远程主机的目标路径下
    参数:owner--专属文件之后修改文件属主
    参数:group--传输文件之后修改文件属组
    参数:mode--修改文件的读、写、执行权限

    [root@web01 ~]# ansible server -m copy -a "src=/tmp/rsyncd.conf dest=/tmp owner=rsync group=rsync mode=666"
    

    参数:backup--在分发传输文件之前,将源文件进行备份,按照时间信息进行备份
    参数remote_src--no表示从管理端找寻数据进行分发;yes 默认从被管理端找寻数据进行分发
    参数content--分发文件时在文件中穿件简单信息

    [root@web01 /tmp]# ansible server -m copy -a "content='xianjian'  dest=/tmp/xianjian  remote_src=no  mode=666"
    

    注意:在copy模块中不能同时使用content 参数和src参数,否则会出现互斥,报错如下

    [root@web01 /tmp]# ansible server -m copy -a "content='xianjian'   src=/tmp/xinjian dest=/tmp/xianjian  remote_src=no  mode=666"
    172.16.1.41 | FAILED! => {
        "changed": false, 
        "msg": "src and content are mutually exclusive"
    }
    172.16.1.31 | FAILED! => {
        "changed": false, 
        "msg": "src and content are mutually exclusive"
    }
    

    7、fetch模块--将远程主机数据进行拉取

    官网模块说明:https://docs.ansible.com/ansible/latest/modules/fetch_module.html#fetch-module
    参数:src--要拉取的远程数据
    参数:dest--要保存本地的文件路径

    [root@web01 /tmp]# ansible 172.16.1.41 -m fetch -a "src=/tmp/xinjian dest=/tmp/"
    172.16.1.41 | CHANGED => {
        "changed": true, 
        "checksum": "d5c2fe81c8a4fc3f532ab2617e6623dc46ce85a8", 
        "dest": "/tmp/172.16.1.41/tmp/xinjian", 
        "md5sum": "295b4c158e20855fb1fc47ec8f60600f", 
        "remote_checksum": "d5c2fe81c8a4fc3f532ab2617e6623dc46ce85a8", 
        "remote_md5sum": null
    }
    

    使用这个模块时注意src=/tmp/xinjian 不得加/;否则会出现如下报错

    [root@web01 /tmp]# ansible 172.16.1.41 -m fetch -a "src=/tmp/xinjian/ dest=/tmp/"
    172.16.1.41 | FAILED! => {
        "changed": false, 
        "file": "/tmp/xinjian/", 
        "msg": "unable to calculate the checksum of the remote file"
    }
    


    8、file模块--修改文件属性信息用于创建数据信息(文件、目录、连接文件、删除数据)

    官方说明:https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module
    path:指定路径信息
    owner:传输文件之后修改文件属主权限
    group:传输文件后修改属组权限
    mode:直接修改文件读、写、执行权限
    state:touch(创建文件)、directory(创建目录)、hard(创建硬链接文件) link(创建软链接文件)、absent(删除数据)

    创建件目录:

    [root@web01 /]# ansible 172.16.1.31 -m file -a "path=/mnt/test/  state=directory"
    172.16.1.31 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "gid": 65534, 
        "group": "nfsnobody", 
        "mode": "0755", 
        "owner": "nfsnobody", 
        "path": "/mnt/test/", 
        "secontext": "system_u:object_r:nfs_t:s0", 
        "size": 6, 
        "state": "directory", 
        "uid": 65534
    }
    [root@web01 /]# 
    

    创建文件:

    [root@web01 /]# ansible 172.16.1.31 -m file -a "path=/mnt/test/test state=touch"
    172.16.1.31 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "dest": "/mnt/test/test", 
        "gid": 65534, 
        "group": "nfsnobody", 
        "mode": "0644", 
        "owner": "nfsnobody", 
        "secontext": "system_u:object_r:nfs_t:s0", 
        "size": 0, 
        "state": "file", 
        "uid": 65534
    }
    [root@web01 /]# 
    

    删除数据信息:

    [root@web01 /]# ansible 172.16.1.31 -m file -a "path=/tmp/test  state=absent"
    172.16.1.31 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "path": "/tmp/test", 
        "state": "absent"
    }
    

    9、mount模块--挂载模块

    官方说明:https://docs.ansible.com/ansible/latest/modules/mount_module.html#mount-module
    参数:src--指定要挂载数据
    参数:path--指定挂载点
    **参数:fstype--指定挂载后,文件系统类型 如:ext3、ext4、xfs、nfs **
    参数:state--指定动作 如:mounted(挂载)、present(永久挂载)、umounted(临时卸载) absent(永久卸载)

    动作 功能 特点
    mounted 挂载 1、会立即进行挂载操作2、可实现永久挂载
    present 挂载 只能永久挂载不会临时挂载
    unmounted 卸载 只能进行临时卸载
    absent 卸载 1. 进行临时卸载 2. 进行永久卸载 3. 挂载点目录会被删除

    挂载:

    [root@web01 /]# ansible server -m mount -a "src=172.16.1.31:/web_data path=/mnt fstype=nfs state=mounted"
    172.16.1.31 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "dump": "0", 
        "fstab": "/etc/fstab", 
        "fstype": "nfs", 
        "name": "/mnt", 
        "opts": "defaults", 
        "passno": "0", 
        "src": "172.16.1.31:/web_data"
    }
    172.16.1.41 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "dump": "0", 
        "fstab": "/etc/fstab", 
        "fstype": "nfs", 
        "name": "/mnt", 
        "opts": "defaults", 
        "passno": "0", 
        "src": "172.16.1.31:/web_data"
    }
    

    10、 cron模块--定时任务模块

    官方说明:https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module
    name: 定义定时任务注释信息
    参数:minute --表示分钟信息
    参数:hour --表示小时信息
    参数:day --表示日期信息
    参数:month --表示月份信息
    参数:weekday --表示星期信息
    参数:job --表示定义任务信息
    参数:state --指定动作 如:present(创建定时任务)、absent(删除定时任务)
    参数:disabled: 让定时任务临时失效

    利用ansible编写时间同步定时任务:每隔5分钟,进行时间同步:

    [root@web01 /]# ansible server  -m cron -a "name='date sync' minute=*/5  job='ntpdate ntp1.aliyun.com &>/dev/null'"
    172.16.1.31 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "envs": [], 
        "jobs": [
            "date sync"
        ]
    }
    172.16.1.41 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "envs": [], 
        "jobs": [
            "date sync"
        ]
    }
    
    

    删除定时任务:

    [root@web01 /]# ansible 172.16.1.31 -m cron -a "name='date sync' state=absent"
    172.16.1.31 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "envs": [], 
        "jobs": []
    }
    

    注释定时任务:

    [root@web01 /]# ansible 172.16.1.31 -m cron -a "name='date sync' minute=*/5  job='ntpdate ntp1.aliyun.com &>/dev/null'  disabled=yes" 
    172.16.1.31 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "envs": [], 
        "jobs": [
            "date sync"
        ]
    }
    

    11、 group模块--批量创建用户组

    官网说明:https://docs.ansible.com/ansible/latest/modules/group_module.html#group-module
    参数:name--指点组名
    参数:gid--指定gid
    参数:state--指定动作 present(创建) absent(删除)

    [root@web01 /]# ansible server -m group -a  "name=tese gid=777 state=present"
    172.16.1.31 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "gid": 777, 
        "name": "tese", 
        "state": "present", 
        "system": false
    }
    172.16.1.41 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "gid": 777, 
        "name": "tese", 
        "state": "present", 
        "system": false
    }
    

    12、user模块--批量创建用户模块

    官方说明:https://docs.ansible.com/ansible/latest/modules/user_module.html#user-module
    参数:name--指定用户名称
    参数:uid--指定用户uid信息
    参数:group--指定属组
    参数:groups--指定属于附加组
    参数:password—-指定用户密码信息(必须密文的信息)
    参数:shell—-指定用户shell信息 /sbin/nologin
    参数:create_home--no表示不创建家目录

    创建用户:

    [root@web01 /]# ansible server -m user -a "name=girl uid=888 group=tese  shell=/sbin/nologin create_home=no"
    172.16.1.41 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "comment": "", 
        "create_home": false, 
        "group": 777, 
        "home": "/home/girl", 
        "name": "girl", 
        "shell": "/sbin/nologin", 
        "state": "present", 
        "system": false, 
        "uid": 888
    }
    172.16.1.31 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "comment": "", 
        "create_home": false, 
        "group": 777, 
        "home": "/home/girl", 
        "name": "girl", 
        "shell": "/sbin/nologin", 
        "state": "present", 
        "system": false, 
        "uid": 888
    }
    

    删除用户:

    [root@web01 /]# ansible server -m user -a "name=girl state=absent"
    172.16.1.41 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "force": false, 
        "name": "girl", 
        "remove": false, 
        "state": "absent"
    }
    172.16.1.31 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "force": false, 
        "name": "girl", 
        "remove": false, 
        "state": "absent"
    }
    [root@web01 /]# 
    

    ansible创建用户密文密码

    **方法一:利用ansible模块功能
    ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"
    mypassword: 指定明文密码信息
    mysecretsalt:加密计算方式(辅助加密)

    [root@web01 ~]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'mysecretsalt') }}"
    localhost | SUCCESS => {
        "msg": "$6$mysecretsalt$ZB9R8AirQYAXhtfhOo2qdJz52FyNI6v3L6Uc3KNRP.arBKIYpcuEyQewT5qBAHoyQFwHkW6Z551Ql.cZ53GeY0"
    }
    

    方法二:利用python模块功能
    使用这种方法需要安装python-pip
    如果安装不上需要更新pip源,更新方法:
    更新pip源:

    配置方法:在文件
    ~/.pip/pip.conf
    中添加或修改:
    
    [global]
    index-url = https://mirrors.aliyun.com/pypi/simple/
    
    [install]
    trusted-host=mirrors.aliyun.com
    

    ==============================================================

    安装好 :yum install python-pip 后
    执行 pip install passlib
    然后执行(什么也不用改,直接执行即可) :
    python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"

    [root@m01 ~]# pip install passlib
    Collecting passlib
      Downloading https://files.pythonhosted.org/packages/ee/a7/d6d238d927df355d4e4e000670342ca4705a72f0bf694027cf67d9bcf5af/passlib-1.7.1-py2.py3-none-any.whl (498kB)
        100% |████████████████████████████████| 501kB 13kB/s 
    Installing collected packages: passlib
    Successfully installed passlib-1.7.1
    You are using pip version 8.1.2, however version 19.1.1 is available.
    You should consider upgrading via the 'pip install --upgrade pip' command.
    [root@m01 ~]# python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
    Password: 
    $6$pYHuK3LNv3OwCytH$MnGUAzTXLH9TdU/Xz.9u9FY2QaZfEtH5l.kEE9hID9sZPrug6fm0M3BWMVjUk81uemTHkZhtg7i982M.05x8T1
    [root@m01 ~]# ansible nfs01 -m user -a 'name=test password="$6$pYHuK3LNv3OwCytH$MnGUAzTXLH9TdU/Xz.9u9FY2QaZfEtH5l.kEE9hID9sZPrug6fm0M3BWMVjUk81uemTHkZhtg7i982M.05x8T1"'
    172.16.1.31 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "comment": "", 
        "create_home": true, 
        "group": 1001, 
        "home": "/home/test", 
        "name": "test", 
        "password": "NOT_LOGGING_PASSWORD", 
        "shell": "/bin/bash", 
        "state": "present", 
        "system": false, 
        "uid": 1000
    }
    [root@m01 ~]# ansible nfs01 -m command -a "id test"
    172.16.1.31 | CHANGED | rc=0 >>
    uid=1000(test) gid=1001(test) groups=1001(test)
    [root@m01 ~]# 
    
    

    相关文章

      网友评论

        本文标题:Ansible基础(一)

        本文链接:https://www.haomeiwen.com/subject/aqbbcctx.html