zoukankan      html  css  js  c++  java
  • [ansiible]ansible常用模块

    第1章 如何学习Ansible?

    1.看官方文档
    2.帮助文档
    3.别人写好的,注意甄别
    4.不要自己发明创造
    5.尽量少使用shell模块,当想使用shell模块的时候,停下来,想一想有没有专有的模块干这个事
    6.遇到报错做好记录,截图或复制文本,方便排查
    7.尽量使用专有的模块去干专业的事
    

    第2章 Ansible安装部署

    Ansible的安装部署十分简单,只需要yum安装就行

    yum install ansible -y
    

    第3章 Ansible主机清单

    /etc/ansible/hosts 主机资产清单文件,用于定义被管理主机的认证信息, 例如 ssh 登录用户名、密码以及 key相关信息。

    1.主机支持主机名通配以及正则表达式,例如 web[1:3].oldboy.com 代表三台主机
    2.主机支持基于非标准的 ssh 端口,例如 web1.oldboy.com:6666
    3.主机支持指定变量,可对个别主机的特殊配置,如登陆用户,密码
    4.主机组支持指定变量[group_name:vars],同时支持嵌套组[game:children]
    

    1.指定主机组相关配置

    [root@m01 ~]# cat /etc/ansible/hosts    
    #主机组
    [web]
    172.16.1.7 
    172.16.1.8 
    [nfs]
    172.16.1.31
    
    #针对某个组的变量
    [web:vars]
    ansible_port=222
    
    #针对所有组的变量
    [all:vars]
    ansible_password='123456'
    

    第4章 Ansible常用模块

    0.如何学习模块

    ansible官方网站:

    https://docs.ansible.com/
    

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

    1.ping

    应用场景:
    测试主机和ansible之间的连通性
    举例:
    对webserver主机组测试是否连通

    ansible webserver -m ping
    

    2.command 简单模块

    应用场景:
    类似shell,但是只能执行简单的命令,复杂的命令和有些符号并不能识别,用的比较少
    01.查看主机名,可以执行成功

    [root@m01 ~]# ansible web -m command -a 'hostname'
    172.16.1.8 | CHANGED | rc=0 >>
    web02
    172.16.1.7 | CHANGED | rc=0 >>
    web01
    

    02.使用awk拼接查看主机IP执行失败

    [root@m01 ~]# ansible web -m command -a "ifconfig eth0|grep 10"
    172.16.1.7 | FAILED | rc=255 >>
    SIOCSIFADDR: 没有那个设备
    eth0|grep: ERROR while getting interface flags: 没有那个设备non-zero return code
    172.16.1.8 | FAILED | rc=255 >>
    SIOCSIFADDR: 没有那个设备
    eth0|grep: ERROR while getting interface flags: 没有那个设备non-zero return code
    

    3.shell 万能模块

    万能模块,所有命令都可以执行,和本地执行效果一样
    01.使用管道查询IP地址

    [root@m01 ~]# ansible web -m shell -a "ifconfig eth0|grep 10.0.0" 
    172.16.1.8 | CHANGED | rc=0 >>
            inet 10.0.0.8  netmask 255.255.255.0  broadcast 10.0.0.255
    172.16.1.7 | CHANGED | rc=0 >>
            inet 10.0.0.7  netmask 255.255.255.0  broadcast 10.0.0.255
    

    02.批量执行脚本
    在其他主机上创建一个脚本,内容为打印主机名

    cat > /root/echo.sh << EOF 
    #!/bin/bash
    echo "$(hostname)"
    EOF
    

    然后使用ansible的shell模块批量执行

    [root@m01 ~]# ansible all -m shell -a "/bin/bash /root/echo.sh"
    172.16.1.31 | CHANGED | rc=0 >>
    nfs
    172.16.1.8 | CHANGED | rc=0 >>
    web02
    172.16.1.7 | CHANGED | rc=0 >>
    web01
    

    缺点:

    不会记录执行的状态,每次都是执行,不方便重复利用
    

    4.copy 拷贝模块

    01.拷贝m01的hostsname文件到其他主机的/opt目录下

    ansible all -m copy -a "src=/etc/hostname dest=/opt"
    ansible all -m shell -a "ls -lh /opt"
    

    02.在传输文件时修改文件属主和属组信息

    ansible all -m copy -a "src=/etc/hostname dest=/opt owner=zhangya group=zhangya"
    

    03.在传输文件时修改文件的权限信息

    ansible all -m copy -a "src=/etc/hostname dest=/opt owner=zhangya group=zhangya mode='644'"
    

    04.创建文件并直接写入内容

    ansible all -m copy -a "content='rsync_backup:123456' dest=/opt/rsyncd.pwd owner=zhangya group=zhangya mode=600"
    

    等价于

    echo "rsync_backup:123456" > /opt/rsyncd.pwd
    chown zhangya:zhangya /opt/rsyncd.pwd
    chmod 600 /opt/rsyncd.pwd
    

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

    创建测试目录

    [root@m01 ~]# mkdir -p /data/{a,b,c}/{1,2,3}
    [root@m01 ~]# tree /data/
    /data/
    ├── a
    │   ├── 1
    │   ├── 2
    │   └── 3
    ├── b
    │   ├── 1
    │   ├── 2
    │   └── 3
    └── c
        ├── 1
        ├── 2
        └── 3
    

    传输命令

    ansible all -m copy -a "src=/data dest=/opt"
    

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

    ansible all -m copy -a "src=/data/ dest=/opt"
    

    06backup备份文件

    ansible all -m copy -a "src=/etc/hostname dest=/opt backup=yes"
    

    07在目标主机本地执行copy操作

    ansible all -m copy -a "src=/etc/hostname dest=/opt remote_src=yes"
    

    08参数说明:

    src:	源文件
    dest: 目标路径
    backup:	文件如果有更改,复制之前先备份一下
    content: 往文件里追加内容
    group: 定义文件用户组
    owner: 定义文件用户
    mode:  定义文件权限
    remote_src: 在目标主机本机执行复制命令
    

    5.file 文件模块

    01.创建文件夹

    ansible all -m file -a "path=/opt/oldzhang state=directory"
    

    02.创建文件并更改属性

    ansible all -m file -a "path=/opt/oldzhang state=directory owner=zhangya group=zhangya mode='755'"
    

    03.创建软链接

    ansible all -m file -a "src=/opt/oldzhang dest=/opt/oldya state=link"
    

    04.删除文件夹

    ansible all -m file -a "path=/opt/oldya state=absent"
    

    05.递归更改文件授权

    ansible all -m file -a "path=/opt/data owner=zhangya group=zhangya recurse=yes"
    

    参数说明:

    path:		目标文件或文件夹
    state:	目标状态
    - directory		创建目录
    - file			  创建文件
    - link 				创建软链接
    absent:	删除文件或目录
    recurse: 递归修改
    

    6.script模块

    编写脚本:

    [root@m01 ~]# cat echo.sh 
    #!/bin/bash
    touch $(hostname).txt
    

    执行命令:

    [root@m01 ~]# ansible all -vvv -m script -a "/root/echo.sh"
    

    7.cron定时任务

    01.创建测试脚本

    [root@m01 ~/script]# cat echo_hostname.sh 
    #!/bin/bash
    echo "$(date +%M:%S) $(hostname)" >> /tmp/hostname.txt
    

    传统定时任务

    * * * * * /bin/bash /opt/echo_hostname.sh
    

    ansible使用cron模块创建定时任务并指定名称

    ansible all -m cron -a 'name="echo_hostname" job="/bin/bash /opt/echo_hostname.sh"'
    

    修改指定名称的定时任务

    ansible all -m cron -a 'name="echo_hostname" minute="*/5" job="/bin/bash /opt/echo_hostname.sh"' 
    

    注释一条定时任务

    ansible all -m cron -a 'name="echo_hostname" minute="*/5" job="/bin/bash /opt/echo_hostname.sh" disabled=yes'
    

    打开一条注释的任务

    ansible all -m cron -a 'name="echo_hostname" minute="*/5" job="/bin/bash /opt/echo_hostname.sh" disabled=no'
    

    删除指定名称为Node的定时任务

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

    删除指定名称的定时任务

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

    8.group模块

    01.创建用户组

    ansible all -m group -a "name=www gid='666'"
    

    参数说明:

    name:		组名
    gid:	  指定gid
    state:	
    - absent	删除组
    - present 创建组
    

    9.user模块

    01.创建用户指定uid,gid,不创建家目录也不允许登陆

    ansible all -m user -a "name=www uid='666' group=www create_home=no shell=/sbin/nologin"
    

    02.创建普通用户,允许登陆并设置密码为123456

    官方文档:

    https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#how-do-i-generate-encrypted-passwords-for-the-user-module
    

    对密码进行加密:

    [root@m01 ~]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', '123456') }}"
    localhost | SUCCESS => {
        "msg": "$6$123456$37mxvJGRzjWxgD3HYl.bKq4aUXrcYV8mk0pxmqg8ARv3t9ke5ZM/NBbwTkx1FDcnLhrOX3jQc6L/NKAohhQJn/"
    }
    

    编写剧本文件:

    [root@m01 ~]# cat user.yaml 
    - hosts: all
      tasks:
      - name: create_user
        user:
          name: cookzhang
          password: '$6$123456$37mxvJGRzjWxgD3HYl.bKq4aUXrcYV8mk0pxmqg8ARv3t9ke5ZM/NBbwTkx1FDcnLhrOX3jQc6L/NKAohhQJn/'
    

    参数说明:

    uid #指定用户的 uid
    group #指定用户组名称
    groups #指定附加组名称
    password #给用户添加密码
    shell #指定用户登录 shell
    create_home #是否创建家目录
    

    10.yum模块

    安装一个软件

    ansible all -m yum -a "name=iftop state=latest"
    

    卸载一个软件

    ansible all -m yum -a "name=iftop state=removed"
    

    从指定URL的地址安装rpm包

    1.安装配置Nginx

    yum install nginx -y
    sed -i '38,87d' /etc/nginx/nginx.conf
    cat >/etc/nginx/conf.d/yum.conf <<EOF
    server {
        listen 80;
        server_name localhost;
        location / {
            root /data/yum;
            charset utf-8,gbk;
            autoindex on;
            autoindex_localtime on;
            autoindex_exact_size off;
        }
    }
    EOF
    mkdir /data/yum
    chown -R nginx:nginx /data/yum
    cd /data/yum
    wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.10.0-1.el7.ngx.x86_64.rpm
    nginx -t
    systemctl restart nginx
    curl 127.0.0.1
    

    2.从管理机上安装软件

    ansible all -m yum -a "name=http://10.0.0.61/nginx-1.10.0-1.el7.ngx.x86_64.rpm state=latest"
    

    参数说明:

    name				软件包名称
    state				状态
    - latest		安装最新版
    - removed 	卸载软件
    

    11.systemd服务模块

    启动一个服务并设置开机自启动

    ansible all -m systemd -a "name=nginx state=started enabled=yes" 
    

    停止一个服务

    ansible all -m systemd -a "name=nginx state=stopped" 
    

    参数说明:

    name
    state
    - started
    - stopped
    enabled
    

    12.mount模块

    shell命令挂载

    mount -t nfs 172.17.1.31:/data /data
    

    挂载一个目录并写入fstab

    ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=mounted"
    

    只写入fstab但是不挂载

    ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=present"
    

    卸载已经挂载的目录并删除fstab条目

    ansible web -m mount -a "path=/data state=absent"
    

    卸载已经挂载的目录但是不删除fstab条目

    ansible web -m mount -a "path=/data state=unmounted"
    

    参数说明:

    src							NFS服务器远程挂载地址
    path						本地挂载目录
    state:
    - absent				#卸载并删除fstab条目 
    - mounted				#挂载并写入fstab
    - present				#不挂载,只写入fstab
    - unmounted			#卸载设备,但不删除fstab条目
    - remounted		  #强制重新挂载
    

    13.unarchive解压模块

    01.解压远程服务器的压缩包到指定目录
    将管理机的压缩包解压到目标主机指定目录

    ansible all -m unarchive -a "src=/root/script/txt.tar.gz dest=/opt/"
    

    将目标主机自己本机压缩包解压到目标主机指定目录

    ansible all -m unarchive -a "src=/tmp/txt.tar.gz dest=/tmp/ remote_src=yes"
    

    14.archive压缩模块

    压缩文件到指定目录

    ansible all -m archive -a "path=/opt/*.txt dest=/tmp/opt.tar.gz"
    

    压缩文件到指定目录并指定格式

    ansible all -m archive -a "path=/opt/*.txt dest=/tmp/opt.zip format=zip"
    

    压缩多个文件到指定目录

    ansible all -m archive -a "path=/opt/1.txt,/opt/3.txt dest=/tmp/txt.tar.gz"
    

    15.setup 获取主机信息

    01.直接执行获取主机信息

    ansible web -m setup
    

    02.只将主机某个信息打印出来

    ansible web -m setup -a 'filter=ansible_default_ipv4'
    

    16.查看帮助

    ansible --help
    ansible-doc user
    

    第5章 Ansible输出信息颜色解释

    绿色信息: 执行的效果和你期望的一样,状态和上次没有改变
    黄色信息: 执行的效果和你期望的一样,并且状态发生了改变
    红色信息: 报错信息
    粉色信息: 警告信息,你所执行的命令或效果有专门的模块可以实现
    蓝色信息: 输出执行过程等详细信息
    

    第6章 编写NFS和Rsync服务

    1.编写ansible个人推荐的流程

    1.手动安装并整理命令
    2.收集起来所有的配置文件
    3.把shell命令翻译成ansible命令
    

    2.编写Rsync服务端

    第一步:手动安装并整理命令

    #1.创建www组和www用户
    groupadd -g 666 www
    useradd -u 666 -g 666 -M -s /sbin/nologin
    
    #2.创建数据目录并更改授权
    mkdir /{data,backup} -p
    chown -R www:www /{data,backup}
    
    #3.安装rsync软件
    yum install rsync -y
    
    #4.编写rsync配置文件
    cat >/etc/rsyncd.conf <<EOF
    uid = www 
    gid = www 
    port = 873
    fake super = yes
    use chroot = no
    max connections = 200
    timeout = 600
    ignore errors
    read only = false
    list = false
    auth users = rsync_backup
    secrets file = /etc/rsync.passwd
    log file = /var/log/rsyncd.log
    #####################################
    [backup]
    comment = welcome to oldboyedu backup!
    path = /backup
    
    [data]
    path = /data
    EOF
    
    #5.编写密码文件并更改权限为600
    echo "rsync_backup:123456" > /etc/rsync.passwd
    chmod 600 /etc/rsync.passwd
    
    #6.启动服务
    systemctl start rsyncd
    systemctl enable rsyncd
    
    #7.检查服务
    netstat -lntup|grep 873
    

    第二步:收集配置文件

    scp 10.0.0.31:/etc/rsyncd.conf /root/script/rsync
    scp 10.0.0.31:/etc/rsync.passwd /root/script/rsync
    

    第三步:把shell命令翻译成ansible命令

    #1.创建www组和www用户
    ansible backup -m group -a "name=www gid=666"
    ansible backup -m user -a "name=www uid='666' group=www create_home=no shell=/sbin/nologin"
    
    #2.创建数据目录并更改授权
    ansible backup -m file -a "path=/data state=directory owner=www group=www mode='755'"
    ansible backup -m file -a "path=/backup state=directory owner=www group=www mode='755'"
    
    #3.安装rsync软件
    ansible backup -m yum -a "name=rsync state=latest"
    
    #4.复制配置文件和密码文件
    ansible backup -m copy -a "src=/root/script/rsync/rsyncd.conf dest=/etc/"
    ansible backup -m copy -a "src=/root/script/rsync/rsync.passwd dest=/etc/ mode='600'"
    
    #6.启动服务
    ansible backup -m systemd -a "name=rsyncd state=started enabled=yes" 
    

    3.编写NFS服务端

    第一步:手动安装并整理命令

    #1.创建www组和www用户
    groupadd -g 666 www
    useradd -u 666 -g 666 -M -s /sbin/nologin
    
    #2.创建数据目录并更改授权
    mkdir /data 
    chown www:www /data
    
    #3.安装nfs软件
    yum install nfs-untils -y
    
    #4.编写nfs配置文件
    echo "/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)" > /etc/exports 
    
    #5.启动服务
    systemctl stsart nfs rpcbind
    

    第二步:收集配置文件

    scp 10.0.0.31:/etc/exports  /root/script/nfs
    

    第三步:把shell命令翻译成ansible命令

    #1.创建www组和www用户
    ansible nfs -m group -a "name=www gid=666"
    ansible nfs -m user -a "name=www uid='666' group=www create_home=no shell=/sbin/nologin"
    
    #2.创建数据目录并更改授权
    ansible nfs -m file -a "path=/data state=directory owner=www group=www mode='755'"
    
    #3.安装nfs软件
    ansible nfs -m yum -a "name=nfs state=latest"
    
    #4.编写nfs配置文件
    ansible nfs -m copy -a "src=/root/script/nfs/exports dest=/etc/"
    
    #5.启动服务
    ansible nfs -m systemd -a "name=rpcbind state=started enabled=yes" 
    ansible nfs -m systemd -a "name=nfs state=started enabled=yes" 
    

    第四步:客户端编写

    ansible web -m yum -a "name=nfs-utils state=latest"
    ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=mounted"
    
  • 相关阅读:
    Oracle与MySQL的几点区别
    MySQL使用Union创建视图报错
    MySQL指定mysqld启动时所加载的配置文件
    MySQL使用位运算
    django rest framework(3)
    Django Rest Framework(2)
    Django 之缓存
    RESTful API
    restful framework 认证源码流程
    其他排序
  • 原文地址:https://www.cnblogs.com/alaska/p/12579099.html
Copyright © 2011-2022 走看看