• 使用ansible实现轻量级的批量主机管理


      作者:邓聪聪

      查看ansible配置文件下的hosts的文件

    [root@ansible-server scripts]# cat /etc/ansible/hosts
    [test]
    172.16.16.7
    172.16.16.8
    [root@ansible-server scripts]# 

    1.生成秘钥对

      ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ''  -q  #生产密钥对,免交互,并安静输出

      这个命令会产生一个公钥(~/.ssh/id_dsa.pub)和密钥(~/.ssh/id_dsa),

      -t dsa:表示使用密钥的加密类型,可以为'rsa'和'dsa'

      -P '':表示不需要密码登录

      -f ~/.ssh/id_dsa:表示密钥存放的路径为${USER}/.ssh/id_dsa

      ssh-copy-id -i ~/.ssh/id_dsa.pub username@ip,hostname  #如果你是单台机器的话,可以使用这种方式把公钥文件传递到对方主机

       //被控主机下的文件信息

    2.使用ansible-playbook来生成推送ymal文件,批量推送

      这里使用到了authoried_keys模块,vi /opt/ssh_key.yaml 

    # Using alternate directory locations:
    - hosts: test    //可以是组也可以是全部
      user: root    //推送所使用的用户
    
    
      tasks: 
      - name: ssh-copy
        authorized_key:
          user=root 
          key="{{ lookup('file', '/root/.ssh/id_dsa.pub') }}"
    单个设备推送公钥:
    ssh-copy-id -i ~/.ssh/id_dsa.pub user@IP    #输入密码即可验证
    
    [root@begon opt]# ansible-playbook /opt/push.ssh.ymal       
    PLAY [test2] ********************************************************************************************************************************************************************************
    TASK [Gathering Facts] **********************************************************************************************************************************************************************
    fatal: [1.81.5.157]: FAILED! => {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host."}
    fatal: [1.81.5.154]: FAILED! => {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host."}
    PLAY RECAP **********************************************************************************************************************************************************************************
    1.81.5.154                 : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   
    1.81.5.157                 : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   
    报错解决;
    修改/etc/ansible/ansible.cfg下的host_key_checking = False (默认check)
    [root@begon opt]# more   /opt/push.ssh.ymal  
    - hosts: test2
      user: root
      tasks: 
      - name: ssh-copy
        authorized_key:
          user=root 
          key="{{ lookup('file', '/root/.ssh/id_dsa.pub') }}"
    [root@begon opt]# ll /root/.ssh
    total 12
    -rw------- 1 root root 668 Apr  9 23:23 id_dsa
    -rw-r--r-- 1 root root 600 Apr  9 23:23 id_dsa.pub
    -rw-r--r-- 1 root root 352 Apr  9 23:27 known_hosts
    [root@begon opt]# vi /etc/ansible/ansible.cfg 
    [root@begon opt]# ansible-playbook /opt/push.ssh.ymal  
    PLAY [test2] ********************************************************************************************************************************************************************************
    TASK [Gathering Facts] **********************************************************************************************************************************************************************
    fatal: [1.81.5.154]: UNREACHABLE! => {"changed": false, "msg": "Invalid/incorrect password: Warning: Permanently added '1.81.5.154' (ECDSA) to the list of known hosts.
    Permission denied, please try again.", "unreachable": true}
    fatal: [1.81.5.157]: UNREACHABLE! => {"changed": false, "msg": "Invalid/incorrect password: Warning: Permanently added '1.81.5.157' (ECDSA) to the list of known hosts.
    Permission denied, please try again.", "unreachable": true}
    PLAY RECAP **********************************************************************************************************************************************************************************
    1.81.5.154                 : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   
    1.81.5.157                 : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   
    ==============验证密码的可用性=================
    [root@begon opt]# vi /etc/ansible/hosts                                                     
    [root@begon opt]# ansible-playbook /opt/push.ssh.ymal        
    PLAY [test2] ********************************************************************************************************************************************************************************
    TASK [Gathering Facts] **********************************************************************************************************************************************************************
    ok: [1.81.5.157]
    ok: [1.81.5.154]
    TASK [ssh-copy] *****************************************************************************************************************************************************************************
    changed: [1.81.5.154]
    changed: [1.81.5.157]
    PLAY RECAP **********************************************************************************************************************************************************************************
    1.81.5.154                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    1.81.5.157                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
    [root@begon opt]# ansible  test2 -a 'ping -c 3 222.222.222.1'
    1.81.5.154 | CHANGED | rc=0 >>
    PING 222.222.222.1 (222.222.222.1) 56(84) bytes of data.
    64 bytes from 222.222.222.1: icmp_seq=1 ttl=54 time=18.6 ms
    64 bytes from 222.222.222.1: icmp_seq=2 ttl=54 time=17.6 ms
    64 bytes from 222.222.222.1: icmp_seq=3 ttl=54 time=17.7 ms
    
    --- 222.222.222.1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2003ms
    rtt min/avg/max/mdev = 17.685/18.020/18.605/0.429 ms
    1.81.5.157 | CHANGED | rc=0 >>
    PING 222.222.222.1 (222.222.222.1) 56(84) bytes of data.
    64 bytes from 222.222.222.1: icmp_seq=1 ttl=54 time=15.5 ms
    64 bytes from 222.222.222.1: icmp_seq=2 ttl=54 time=15.2 ms
    64 bytes from 222.222.222.1: icmp_seq=3 ttl=54 time=15.2 ms
    
    --- 222.222.222.1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2003ms
    rtt min/avg/max/mdev = 15.219/15.323/15.506/0.129 ms
    [root@begon opt]# 

    3.测试

    [root@ansible-server scripts]# ansible all -m command -a date
    172.16.16.8 | SUCCESS | rc=0 >>
    Mon Mar  4 22:24:56 EST 2019
    172.16.16.7 | SUCCESS | rc=0 >>
    Mon Mar  4 22:24:56 EST 2019
    [root@ansible-server scripts]# 

     4.1ansible的各项命令参数的使用

      1.service  #管理的服务必须存在在/etc/init.d/下有的服务脚本

      name=service name  #服务的名称 

      state=参数            #停止服务 服务状态信息为过去时 (stared/stoped/restarted/reloaded )

      案例:ansible test -m service -a "name=crond state=restarted"

      2.yum 

      name=name       #指定安装的软件

      state=installed    #安装

      案例:ansible test -m yum -a "name=vim state=installed "

      3.copy #将/etc/hosts 文件 传输到各个服务器送,src=文件的源路径,dest=文件的目标路径

      案例:ansible test -m copy -a "src=/etc/hosts dest=/tmp/"

      4.script #脚本模块,在本地执行脚本时,将脚本中的内容传输到远程节点上运行

      案例:ansible all -m script -a "/root/ansible-server/scripts/batch_free.sh"

    4.2.剧本格式示例

      剧本的检查 ansible-playbook --syntax-check name.ymal

      剧本彩排 ansible-playbook -C name.ymal 

    # Using alternate directory locations:
    - hosts: test  //冒号后面跟参数必须有空格
      user: root
    
      tasks:   //冒号后面没有参数的时候可以省略掉空格
      - name: ssh-copy  //名称,可以跟多个剧本
        authorized_key:  
          user=root
          key="{{ lookup('file', '/root/.ssh/id_dsa.pub') }}"

       使用Ansible的user模块批量修改远程客户机的用户密码 

    [root@ansible-server ~]# vi /opt/root_passwd.yaml
    ---
      - hosts: test
        gather_facts: false
        tasks:
        - name: change user passwd
          user: name={{ item.name }} password={{ item.chpass | password_hash('sha512') }}  update_password=always
          with_items:
               - { name: 'root', chpass: '123456' }
               - { name: 'test', chpass: '123456' }

      注意上面在yaml文件中修改了远程客户机的root用户密码, test用户密码.如果还想要修改其他用户密码, 则继续按照上面规则添加即可!

    [root@begon opt]# more   /opt/push.ssh.ymal  - hosts: test2  user: root
      tasks:   - name: ssh-copy    authorized_key:      user=root       key="{{ lookup('file', '/root/.ssh/id_dsa.pub') }}"[root@begon opt]# ll /root/.sshtotal 12-rw------- 1 root root 668 Apr  9 23:23 id_dsa-rw-r--r-- 1 root root 600 Apr  9 23:23 id_dsa.pub-rw-r--r-- 1 root root 352 Apr  9 23:27 known_hosts[root@begon opt]# vi /etc/ansible/ansible.cfg [root@begon opt]# ansible-playbook /opt/push.ssh.ymal  
    PLAY [test2] ********************************************************************************************************************************************************************************
    TASK [Gathering Facts] **********************************************************************************************************************************************************************fatal: [1.81.5.154]: UNREACHABLE! => {"changed": false, "msg": "Invalid/incorrect password: Warning: Permanently added '1.81.5.154' (ECDSA) to the list of known hosts. Permission denied, please try again.", "unreachable": true}fatal: [1.81.5.157]: UNREACHABLE! => {"changed": false, "msg": "Invalid/incorrect password: Warning: Permanently added '1.81.5.157' (ECDSA) to the list of known hosts. Permission denied, please try again.", "unreachable": true}
    PLAY RECAP **********************************************************************************************************************************************************************************1.81.5.154                 : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   1.81.5.157                 : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   
    [root@begon opt]# ansible  test2 -a 'ping -c 3 222.222.222.1'         1.81.5.157 | UNREACHABLE! => {    "changed": false,     "msg": "Invalid/incorrect password: Permission denied, please try again.",     "unreachable": true}1.81.5.154 | UNREACHABLE! => {    "changed": false,     "msg": "Invalid/incorrect password: Permission denied, please try again.",     "unreachable": true}[root@begon opt]# vi /etc/ansible/hosts                                                     [root@begon opt]# ansible-playbook /opt/push.ssh.ymal        
    PLAY [test2] ********************************************************************************************************************************************************************************
    TASK [Gathering Facts] **********************************************************************************************************************************************************************ok: [1.81.5.157]ok: [1.81.5.154]
    TASK [ssh-copy] *****************************************************************************************************************************************************************************changed: [1.81.5.154]changed: [1.81.5.157]
    PLAY RECAP **********************************************************************************************************************************************************************************1.81.5.154                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   1.81.5.157                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    [root@begon opt]# ansible  test2 -a 'ping -c 3 222.222.222.1'1.81.5.154 | CHANGED | rc=0 >>PING 222.222.222.1 (222.222.222.1) 56(84) bytes of data.64 bytes from 222.222.222.1: icmp_seq=1 ttl=54 time=18.6 ms64 bytes from 222.222.222.1: icmp_seq=2 ttl=54 time=17.6 ms64 bytes from 222.222.222.1: icmp_seq=3 ttl=54 time=17.7 ms
    --- 222.222.222.1 ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 2003msrtt min/avg/max/mdev = 17.685/18.020/18.605/0.429 ms1.81.5.157 | CHANGED | rc=0 >>PING 222.222.222.1 (222.222.222.1) 56(84) bytes of data.64 bytes from 222.222.222.1: icmp_seq=1 ttl=54 time=15.5 ms64 bytes from 222.222.222.1: icmp_seq=2 ttl=54 time=15.2 ms64 bytes from 222.222.222.1: icmp_seq=3 ttl=54 time=15.2 ms
    --- 222.222.222.1 ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 2003msrtt min/avg/max/mdev = 15.219/15.323/15.506/0.129 ms[root@begon opt]# 

  • 相关阅读:
    记录一次.Net框架Bug发现和提交过程:.Net Framework和.Net Core均受影响
    浅谈 Angular 项目实战
    Angular CLI 升级 6.0 之后遇到的问题
    构建具有用户身份认证的 Ionic 应用
    关于 Angular 跨域请求携带 Cookie 的问题
    使用 ng build 构建后资源地址引用错误的问题
    React 系列教程 1:实现 Animate.css 官网效果
    如何在已有的 Web 应用中使用 ReactJS
    关于浏览器后退操作与页面缓存问题
    三阶魔方公式速记
  • 原文地址:https://www.cnblogs.com/dengcongcong/p/10475580.html
Copyright © 2020-2023  润新知