美文网首页
ansible使用笔记(二)常用命令使用及常用模块简介

ansible使用笔记(二)常用命令使用及常用模块简介

作者: Bigyong | 来源:发表于2020-11-06 21:20 被阅读0次

    目录
    一、常用命令使用
    二、双引号" " 单引号' '对执行结果的影响
    三、ansible-console工具
    四、ansible常用模块

    • 4.1 ansible-doc 和 ping模块
    • 4.2 command
    • 4.3 shell模块
    • 4.4 script模块
    • 4.5 yum模块
    • 4.6 service模块
    • 4.7 copy模块
    • 4.8 lineinfile模块 replace模块
    • 4.9 setup模块

    一、常用命令使用
    前面有提到过ansible的常用的命令和使用
    列出要执行主机
    ansible all --list-hosts
    批量检测主机
    ansible all -m ping -k
    ansible主机集合 -m 模块名称 -a 模块参数
    主机集合 主机名或分组名,多个使用"逗号"分隔
    -m 模块名称,默认command模块
    -a or --args模块参数
    其它参数
    -i inventory文件路径,或可执行脚本
    -k 使用交互式登陆密码
    -e 定义变量
    -v 显示详细信息

    二、双引号" " 单引号' '对执行结果的影响
    执行以下命令来查看ansible的执行结果
    1)shell
    ansible web -m shell -a "echo ${HOSTNAME}"
    ansible web -m shell -a 'echo ${HOSTNAME}'

    2)创建的文件在哪查看
    ansible cache -m shell -a 'cd /tmp'
    ansible cache -m shell -a 'touch testfile'

    [root@ansible ~]# ansible  web  -m shell -a "echo \${HOSTNAME}"
    web1 | CHANGED | rc=0 >>
    ansible                //可以看到使用双引号"echo \${HOSTNAME}"显示的是本机的主机名
    web2 | CHANGED | rc=0 >>
    ansible
    [root@ansible ~]# ansible  web  -m shell -a 'echo \${HOSTNAME}'
    web2 | CHANGED | rc=0 >>
    web2                  //使用单引号'echo \${HOSTNAME}'显示的才是远程主机名 才是我们想要的结果
    web1 | CHANGED | rc=0 >>
    web1
    
    [root@ansible ~]# ansible cache -m shell -a 'cd /tmp'
    cache | CHANGED | rc=0 >>
    
    [root@ansible ~]# ansible cache -m shell -a 'touch testfile'
    [root@ansible ~]# ssh cache
    [root@cache ~]# ll
    总用量 4
    drwxr-xr-x 2 root root  6 4月  13 2019 Desktop
    -rw-r--r-- 1 root root 55 10月 20 15:04 resolv.conf
    -rw-r--r-- 1 root root  0 10月 29 15:25 testfile              //创建的文件在家目录下 并没有在/tmp目录下
    

    注:
    1)变量解析 双引号"" 与单引号''使用区别
    ansible 执行命令是二次解析,第一次在本机解析, 第二次在执行机器解析,需要第二次解析的变量要转移
    总结: 参数默认使用 ' ' 号就对了

    2)创建的文件在哪里
    文件在用户家目录,ansible 是使用 ssh 多次连接执行,连接退出以后之前的状态就全部失效了
    解决方法:使用 chdir 代替 cd 命令
    ansible cache -m shell -a 'chdir=/tmp touch testfile'

    三、ansible-console工具
    是ansible为用户提供的交互式工具,用户可以在ansible-console虚拟出来的终端出来的终端上像shell一样使用ansible内置的各种命令,这为习惯使用shell交互方式的用户提供了良好的使用体验

    [root@ansible ~]# ansible-console        //对所有主机执行操作
    [root@ansible ~]# ansible-console  db    //对db组主机执行操作
    Welcome to the ansible console.
    Type help or ? to list commands.
    
    root@db (2)[f:5]$ pwd                   //和正常在shell下操作一样
    db1 | CHANGED | rc=0 >>
    /root
    db2 | CHANGED | rc=0 >>
    /root
    
    root@db (2)[f:5]$ cat /etc/hosts
    db1 | CHANGED | rc=0 >>
    # ::1       localhost localhost.localdomain localhost6 localhost6.localdomain6
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    db2 | CHANGED | rc=0 >>
    # ::1       localhost localhost.localdomain localhost6 localhost6.localdomain6
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    
    root@db (2)[f:5]$ cat /etc/hostname
    db1 | CHANGED | rc=0 >>
    db1
    db2 | CHANGED | rc=0 >>
    db2
    root@db (2)[f:5]$ ls
    db2 | CHANGED | rc=0 >>
    abc.txt
    Desktop
    haha
    resolv.conf
    ......
    

    四、ansible常用模块
    4.1 ) ansible-doc和ping模块
    ansible-doc模块手册

    模块的手册相当于shell的man,很重要

    • ansible-doc -l 列出所有模块
    • ansible-doc modulename 查看帮助

    ping模块
    测试网络连通性,ping模块没有参数
    注:测试ssh连通性

    • ansible host-pattern -m ping

    4.2 ) command模块
    默认模块,远程执行命令
    用法

    • ansible host-pattern -m command -a '[args]'

    command模块注意事项:
    该模块通过-a跟上要执行的命令可以直接执行,若命令里有如下字符则执行不成功
    "<" ">" "|" "&"
    command模块不能解析系统变量
    该模块不启动shell直接在ssh进程中执行,所有使用到shell的命令执行都会失败

    • ansible all -m command -a 'ps aux|grep ssh'
    • ansible all -m command -a 'set'

    查看所有机器负载

    • ansible all -m command -a 'uptime'

    查看日期和时间

    • ansible all -m command -a 'date +%F_%T'

    4.3 )shell模块
    shell模块用法基本和command一样,区别是shell模块是通过/bin/sh进行执行命令,可以执行任意命令
    不能执行交互式的命令,例如 vim top等

    [root@ansible ~]# ansible web1 -m shell -a 'useradd by'
    web1 | CHANGED | rc=0 >>
    
    [root@ansible ~]# ansible web1 -m shell -a 'echo 123|passwd --stdin by'
    web1 | CHANGED | rc=0 >>
    更改用户 by 的密码 。
    passwd:所有的身份验证令牌已经成功更新
    
    [root@ansible ~]# ssh -l by web1
    by@web1's password: 
    [by@web1 ~]$
    

    4.4 ) script模块
    命令太复杂?
    在本地写脚本,然后使用script模块指量执行
    ansible web -m script -a 'urscript'
    注意:该脚本包含但不限于shell脚本,只要指定sha-bang解释器的脚本都可运行

    案例:
    给所有web主机添加用户wk
    1.要求by用户与wk用户不能出现在同一台主机上
    2.设置wk用户的密码是456

    [root@ansible ~]# cat a.sh 
    #!/bin/bash
    id by
    if [ $? != 0 ];then
        useradd wk
        echo 456|passwd --stdin wk
    fi
    
    [root@ansible ~]# ansible web -m script -a '/root/a.sh'
    web1 | CHANGED => {
        "changed": true, 
        "rc": 0, 
        "stderr": "Shared connection to web1 closed.\r\n", 
        "stderr_lines": [
            "Shared connection to web1 closed."
        ], 
        "stdout": "uid=1000(by) gid=1000(by) 组=1000(by)\r\n",             //提示by用户已存在
        "stdout_lines": [
            "uid=1000(by) gid=1000(by) 组=1000(by)"
        ]
    }
    web2 | CHANGED => {
        "changed": true, 
        "rc": 0, 
        "stderr": "Shared connection to web2 closed.\r\n", 
        "stderr_lines": [
            "Shared connection to web2 closed."
        ], 
        "stdout": "id: by: no such user\r\n更改用户 wk 的密码 。\r\npasswd:所有的身份验证令牌已经成功更新。\r\n", 
        "stdout_lines": [
            "id: by: no such user", 
            "更改用户 wk 的密码 。", 
            "passwd:所有的身份验证令牌已经成功更新。"       //添加wk用户 设置密码456
        ]
    }
    
    [root@ansible ~]# ssh web1 ls /home
    by
    [root@ansible ~]# ssh web1 id by
    uid=1000(by) gid=1000(by) 组=1000(by)
    [root@ansible ~]# ssh web1 id wk
    id: wk: no such user
    
    [root@ansible ~]# ssh web2 id by
    id: by: no such user
    [root@ansible ~]# ssh web2 id wk
    uid=1000(wk) gid=1000(wk) 组=1000(wk)
    

    4.5 ) yum模块
    使用yum包管理器来管理软件包
    name:要进行操作的软件包名字
    state:动作(installed安装、removed删除)

    4.6 ) service模块
    name:必须项,服务名称
    enabled:是否开机启动yes|no
    sleep:执行restarted,会在stop和start之间沉睡几秒钟
    state:对当时服务执行启动、停止、重启中、重新加载等操作(started,stopped,restarted,reloaded)
    案例:
    1.给db组安装mariadb
    2.开启mariadb服务并设置开机启动

    [root@ansible ~]# ansible db -m yum -a 'name="mariadb-server" state=installed'    \\给所有db主机安装mariadb
    [root@ansible ~]# ansible db -m service -a 'name="mariadb" enabled="yes" state="started"'   \开启服务并设置开机启动
    [root@ansible ~]# ssh db1 "systemctl status mariadb"             //检测服务是否开启
    ● mariadb.service - MariaDB database server
       Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
       Active: active (running) since 一 2020-10-26 17:21:11 CST; 3 days ago
      Process: 852 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS)
      Process: 794 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)
     Main PID: 851 (mysqld_safe)
       CGroup: /system.slice/mariadb.service
               ├─851 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
               └─996 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/lib/mysql/db1.err --pid-file=db1.pid
    
    10月 26 17:21:04 db1 systemd[1]: Starting MariaDB database server...
    10月 26 17:21:05 db1 mysqld_safe[851]: 201026 17:21:05 mysqld_safe Logging to '/var/lib/mysql/db1.err'.
    10月 26 17:21:06 db1 mysqld_safe[851]: 201026 17:21:06 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
    10月 26 17:21:11 db1 systemd[1]: Started MariaDB database server.
    

    4.7 ) copy模块
    复制文件到远程主机
    src:复制本地文件到远程主机,绝对路径和相对路径都可以,路径为目录时会递归复制,若路径以"/"结尾,只复制目录里的内容,若不以"/"结尾,则复制包含目录在内的整个内容,类似于rsync
    dest:必须项,远程主机的绝对路径,如果源文件是一个目录,那该路径必须是目录
    backup:覆盖前先备份原文件,备份文件包含时间信息,有两个选项:yes|no
    force:若目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,设为no,则只有当目标主机的目标位置不存在该文件时才复制,默认为yes
    案例:
    拷到本机/etc/resolv.conf 文件到所有拖管主机 并对原文件备份
    给所有 db 主机开启 binlog 日志

    [root@ansible ~]# ansible all -m shell -a 'cat /etc/resolv.conf'
    web2 | CHANGED | rc=0 >>
    ; generated by /usr/sbin/dhclient-script
    search vbr
    nameserver 192.168.1.254
    web1 | CHANGED | rc=0 >>
    ; generated by /usr/sbin/dhclient-script
    search vbr
    nameserver 192.168.1.254
    ......
    
    [root@ansible ~]# ansible all -m copy -a 'src=/etc/resolv.conf dest=/etc/resolv.conf backup='yes''
    db2 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "backup_file": "/etc/resolv.conf.3512.2020-10-30@11:31:52~",           //备份文件路径
        "changed": true, 
        "checksum": "7ab5654c93c18a1dd208eaadbb30428367315504", 
        "dest": "/etc/resolv.conf", 
        "gid": 0, 
        "group": "root", 
        "md5sum": "db739b8728e142b7894ef64608a83d8c", 
        "mode": "0644", 
        "owner": "root", 
        "size": 55, 
        "src": "/root/.ansible/tmp/ansible-tmp-1604028710.47-8488-12200601987494/source", 
        "state": "file", 
        "uid": 0
    }
    db1 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "backup_file": "/etc/resolv.conf.3603.2020-10-30@11:31:51~", 
        "changed": true, 
        "checksum": "7ab5654c93c18a1dd208eaadbb30428367315504", 
        "dest": "/etc/resolv.conf", 
        "gid": 0, 
        "group": "root", 
        "md5sum": "db739b8728e142b7894ef64608a83d8c", 
        "mode": "0644", 
        "owner": "root", 
        "size": 55, 
        "src": "/root/.ansible/tmp/ansible-tmp-1604028710.43-8485-88071037096399/source", 
        "state": "file", 
        "uid": 0
    }
    ......
    
    [root@ansible ~]# ansible all -m shell -a 'cat /etc/resolv.conf'
    web2 | CHANGED | rc=0 >>
    # Generated by NetworkManager
    nameserver 192.168.44.54
    db1 | CHANGED | rc=0 >>
    # Generated by NetworkManager
    nameserver 192.168.44.54
    web1 | CHANGED | rc=0 >>
    ......
    
    [root@ansible ~]# ssh web1 "ls /etc/resolv.conf.4369.2020-10-30@11:31:52~"
    /etc/resolv.conf.4369.2020-10-30@11:31:52~
    
    [root@ansible ~]# vim /root/my.cnf     //编写配置文件
    [mysqld]
    log-bin=mysql-bin
    binlog-format=mixed
    
    [root@ansible ~]# ansible db -m copy -a 'src=/root/my.cnf dest=/etc/my.cnf'
    [root@ansible ~]# ansible db -m service -a 'name="mariadb" enabled="yes" state="restarted"'
    [root@ansible ~]# ssh db1 cat /etc/my.cnf
    [mysqld]
    log-bin=mysql-bin
    binlog-format=mixed
    

    4.8 ) lineinfile模块 replace模块
    类似sed的一种行编辑替换模块
    path 目标文件文件
    regexp 正则表达式,要修改的行
    line 最终修改的结果

    replace模块
    类似sed的一种行编辑替换模块
    path 目标文件文件
    regexp 正则表达式,要修改的行
    replace 替换后的结果

    lineinfile模块与 replace模块区别
    lineinfile模块 是修改某个文件的单行并进行替换
    replace模块 是修改某个文件的所有匹配行并进行替换

    [root@ansible ~]# cat abc.txt 
    AAABBBCCC
    DDDEEEFFF
    AAABBBCCC
    DDDEEEFFF
    
    ansible all -m copy -a 'src=/root/abc.txt dest=/root/abc.txt'
    
    [root@ansible ~]# ansible all -m replace -a 'path="/root/abc.txt" regexp="AAA" replace="ZZZ"'
    
    [root@ansible ~]# ansible all -m shell -a "cat /root/abc.txt"
    cache | CHANGED | rc=0 >>
    ZZZBBBCCC
    DDDEEEFFF
    ZZZBBBCCC
    DDDEEEFFF
    db2 | CHANGED | rc=0 >>
    ZZZBBBCCC
    DDDEEEFFF
    ZZZBBBCCC
    DDDEEEFFF
    db1 | CHANGED | rc=0 >>
    ZZZBBBCCC
    DDDEEEFFF
    ZZZBBBCCC
    DDDEEEFFF
    web2 | CHANGED | rc=0 >>
    ZZZBBBCCC
    DDDEEEFFF
    ZZZBBBCCC
    DDDEEEFFF
    web1 | CHANGED | rc=0 >>
    ZZZBBBCCC
    DDDEEEFFF
    ZZZBBBCCC
    DDDEEEFFF
    
    [root@ansible ~]# ansible all -m lineinfile  -a 'path="/root/abc.txt" regexp="ZZZ" line="YYY"'
    
    [root@ansible ~]# ansible all -m shell -a "cat /root/abc.txt"
    web2 | CHANGED | rc=0 >>
    ZZZBBBCCC
    DDDEEEFFF
    YYY
    DDDEEEFFF
    web1 | CHANGED | rc=0 >>
    ZZZBBBCCC
    DDDEEEFFF
    YYY
    DDDEEEFFF
    db2 | CHANGED | rc=0 >>
    ZZZBBBCCC
    DDDEEEFFF
    YYY
    DDDEEEFFF
    db1 | CHANGED | rc=0 >>
    ZZZBBBCCC
    DDDEEEFFF
    YYY
    DDDEEEFFF
    cache | CHANGED | rc=0 >>
    ZZZBBBCCC
    DDDEEEFFF
    YYY
    DDDEEEFFF
    

    4.9 ) setup模块
    主要用于获取主机信息,playbooks里经常会用的另一个参数gather_facts与该模块相关,setup模块下经常用的是filter参数

    filter过滤所需信息

    执行以下命令可查看包含的所有信息,可大致浏览一遍,包含的信息,
    需要注意的是 filter过滤条件必须以信息中模块名为过滤条件 模块中详细信息不能为过滤条件

    [root@ansible ~]# ansible cache -m setup 
    [root@ansible ~]# ansible cache -m setup -a 'filter=ansible_distribution'
    cache | SUCCESS => {
        "ansible_facts": {
            "ansible_distribution": "CentOS", 
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": false
    }
    
    [root@ansible ~]# ansible db1 -m setup -a 'filter=ansible_date_time'
    db1 | SUCCESS => {
        "ansible_facts": {
            "ansible_date_time": {
                "date": "2020-10-30", 
                "day": "30", 
                "epoch": "1604039910", 
                "hour": "14", 
                "iso8601": "2020-10-30T06:38:30Z", 
                ......
    
    
    [root@ansible ~]# ansible db1 -m setup -a 'filter=ansible_default_ipv4'
    db1 | SUCCESS => {
        "ansible_facts": {
            "ansible_default_ipv4": {
                "address": "192.168.4.143", 
                "alias": "eth0", 
                "broadcast": "192.168.4.255", 
                "gateway": "192.168.4.254", 
                "interface": "eth0", 
                "macaddress": "52:54:00:ef:6e:df
                ......
    
    [root@ansible ~]# ansible db1 -m setup |grep 192.168  \\如果知道信息的一部分可以用grep搜索
                "192.168.4.143"
                "address": "192.168.4.143", 
                "broadcast": "192.168.4.255", 
                "gateway": "192.168.4.254", 
                "network": "192.168.4.0", 
                    "192.168.44.54"
    

    相关文章

      网友评论

          本文标题:ansible使用笔记(二)常用命令使用及常用模块简介

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