• Ansible自动化搭建及工具集和常见模块、命令详情(重点)及批量部署nginx


    一、ansible介绍

    1、ansible简介

          官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。

      Ansible跟其他IT自动化技术的区别在于其关注点并非配置管理、应用部署或IT流程工作流,而是提供一个统一的界面来协调所有的IT自动化功能,因此Ansible的系统更加易用,部署更快。

      Ansible可以让用户避免编写脚本或代码来管理应用,同时还能搭建工作流实现IT任务的自动化执行。IT自动化可以降低技术门槛及对传统IT的依赖,从而加快项目的交付速度。

    2、ansible优缺点

      优点:

    • 轻量级,他不需要去客户端安装agent,更新时,只需要在操作机上进行一次更新即可
    • 批量任务执行可以写成脚本,而且不用分发到远程就可以执行
    • 使用python编写的,维护更简单
    • 支持sudo

          缺点

    • 对于几千台、上万台机器的操作,还不清楚性能、效率情况如何,需要进一步了解。

    3、ansible架构及工作原理

         andible基本架构如下图所示

     

      ansible core : ansible 自身核心模块

      host inventory: 主机库,定义可管控的主机列表

      connection plugins: 连接插件,一般默认基于 ssh 协议连接

      modules:core modules ( 自带模块 ) 、 custom modules ( 自定义模块 )

      playbooks :剧本,按照所设定编排的顺序执行完成安排任务 

     Ansible工作原理如下图:

      1、管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接---这部分对应基本架构图中的连接模块;

      2、可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为     ad-hoc;

      3、管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系      统通过组合多条ad-hoc操作的配置文件 。

    Ansible默认是通过SSH通道来管理的,也就是它所说的免客户端方式管理, 它底层是通过 paramiko 来实现的。  

    ansible执行过程大体过程如下图,其中暖色调的代表已经模块化。

    二、部署安装

    操作环境:

    操作系统 IP地址 角色 主机名 CPU核心
    Centos7 192.168.200.113 Ansible ansible 1
    Centos7 192.168.200.114 Client client1 1
    Centos7 192.168.200.115 Client client2 2

    环境准备:

    关闭防火墙:

    [root@localhost ~]#systemctl stop firewalld

    [root@localhost ~]#iptables -F

    [root@localhost ~]#setenfrce 0

    Ansible113操作:

    [root@localhost ~]#hostname ansible

    [root@localhost ~]#bash

    [root@ansible]#nslookup www.baidu.com                     #测试网络连通性

    [root@ansible]#vim /etc/hosts                                      #编写主机名和IP的映射

    192.168.200.113 ansible
    
    192.168.200..17 client1
    
    192.168.200.112 client2

    通过scp把hosts文件发送给另外两台主机:

    [root@ansible]#scp /etc/hosts 192.168.200.114:/etc

    [root@ansible]#scp /etc/hosts 192.168.200.115:/etc

    YUM方式安装ansible:(推荐使用YUM安装)

    [root@ansible]#cd  /etc/yum.repos.d/

    [root@ansible yum.repos.d]# mkdir a/

    [root@ansible yum.repos.d]# mv C* a/

    [root@ansible yum.repos.d]# vim local.repo 

    [yum]
    
    name=yum
    
    baseurl=file:///media
    
    enabled=1
    
    gpgcheck=0

    [root@ansible yum.repos.d]# mount /dev/sr0 /media/

    [root@localhost yum.repos.d]#yum clean all

    [root@localhost yum.repos.d]#wget http://mirrors.aliyun.com/repo/Centos-7.repo

    安装ansible

    [root@localhost yum.repos.d]#yum install ansible -y                          

    [root@localhost yum.repos.d]#ansible --version

    ansible 2.4.2.0
      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, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

    PIP3方式安装ansible:

    [root@ansible]#yum install lrzsz vim net-tools gcc gcc-c++ ncurses ncurses-devel unzip zlib-devel zlib openssl-devel opdenssl             #安装依赖包

    [root@ansible]#rz                  #上传Python-3.5.2源码包

    [root@ansible]#tar xf Python3.5.2.tgz -C /usr/src/

    [root@ansible]#cd /usr/src/Python-3.5.2/

    [root@ansible Python-3.5.2]#./configure --perfix=/usr/local/python/ && make && make install

    [root@ansible Python-3.5.2]#ln -s /usr/local/python/bin/python3 /usr/bin/python3

    [root@ansible Python-3.5.2]#which python3

    /usr/bin/python3

    [root@ansible Python-3.5.2]#python3 -V

    pip3安装ansibe:

    [root@ansible Python-3.5.2]#/usr/local/python/bin/pip3 install ansible

    等待ansible安装完后。注意基于pip安装的没有配置文件。需要自己建立

    [root@ansible Python-3.5.2]#ln -s /usr/local/python/bin/ansible /usr/local/bin/

    [root@ansible Python-3.5.2]#which ansible

    [root@ansible Python-3.5.2]#ansible --version

    创建SSH免交互登录:

    [root@localhost yum.repos.d]#cd

    [root@ansible ~]#ssh-keygen -t rsa                      #生成秘钥对、这种属于交互式的、此处不选择

    选择这种非交互式的

    [root@ansible ~]# ssh-keygen -t rsa -P "" -f .ssh/id_rsa                               #属于非交互式的

    [root@ansible ~]#ls .ssh/

    id_rsa              id_rsa.pub        known_hosts

    client1 114操作环境准备:

    关闭防火墙:

    [root@localhost ~]#systemctl stop firewalld

    [root@localhost ~]#iptables -F

    [root@localhost ~]#setenfrce 0

    [root@localhost ~]# hostname client1

    [root@localhost ~]# bash

    client2 115操作环境准备:

    关闭防火墙:

    [root@localhost ~]#systemctl stop firewalld

    [root@localhost ~]#iptables -F

    [root@localhost ~]#setenfrce 0

    [root@localhost ~]# hostname client2

    [root@localhost ~]# bash

    Ansible113操作:

    发送公钥给两台client:

    [root@ansible ~]# ssh-copy-id root@192.168.200.114

    [root@ansible ~]# ssh-copy-id root@192.168.200.115

    测试免密连接:

    [root@ansible ~]# ssh root@192.168.200.114

    [root@ansible ~]# ssh root@192.168.200.115

    Ansible配置:

    [root@ansible ~]# cp /etc/ansible/hosts /etc/ansible/hosts.bak

    root@ansible ~]# vim /etc/ansible/hosts

    在最末尾添加如下:

    [crushlinux]
    192.168.200.114 192.168.200.115

    [root@ansible ~]# ansible crushlinux -m ping                            #查询环境

    192.168.200.115 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
    }
    192.168.200.114 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
    }



    crushlinux需要提前在/etc/ansible/hosts文件中定义组
    Ansible一般用三种颜色表示返回执行的结果:红色、绿色、橘黄色。其中红色表示执行过程有异常,橘黄色表示命令在执行过程中有变更
    绿色表示执行成功但是没有变更且没有对机器做修改

    基于sshpass秘钥分发:

    sshpass可以帮助我们免交互的方式发送文件,一旦把公钥删除就无法继续发送文件[root@client1 ~]# rm -rf .ssh/authorized_keys 

    [root@ansible ~]# yum install sshpass -y                                #安装sshpass秘钥

    [root@ansible ~]# sshpass -p 123123 ssh root@192.168.200.114

    [root@client1 ~]# rm -rf .ssh/authorized_keys

    [root@client2 ~]# rm -rf .ssh/authorized_keys

    [root@ansible ~]# sshpass -p123123 ssh-copy-id root@192.168.200.115

    [root@ansible ~]# sshpass -p123123 ssh-copy-id root@192.168.200.114

    第一种使用sshpass免密连接

    第二种修改SSH配置文件

    [root@ansible ~]# vim /etc/ssh/ssh_config

    35行修改成如下:

    StrictHostKeyChecking no

     

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

     

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

    [crushlinux]
    192.168.200.114
    192.168.200.115
    
     
    [clinet]                   #测试主机名
    client1
    client1
    
    [test01]                   #测试正则
    client[1:2]

     [root@ansible ~]# ansible client -m ping && ansible test01 -m ping             #查询环境、ping是模块

    
    

    client1 | SUCCESS => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
    }
    client2 | SUCCESS => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
    }
    client2 | SUCCESS => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
    }
    client1 | SUCCESS => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
    }



    SUCCESS表示命令执行成 ,=>{}表示返回的结果,changed:flase表示没有对主机做出更改
    ping:ping表示Ping命令返回非结果

         配置完成后可以针对hosts定义服务组进行远程操作,也可以针对组中的指定的某一个或多个主机操作,下面介绍如何对特定的服务器操作“

    1:针对crushlinux组中的192.168.200.114主机操作,通--limit参数限定主机的变更

    [root@ansible ~]# ansible crushlinux -m command -a "head -5 /etc/passwd" --limit "192.168.200.114"

    192.168.200.114 | SUCCESS | rc=0 >>
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    2:只对192.168.200.114主机操作,通过IP限定主机变更

    [root@ansible ~]# ansible 192.168.200.114 -m command -a "head -5 /etc/passwd"                  #-a表示要执行的操作

    192.168.200.114 | SUCCESS | rc=0 >>
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    3:只对192.168.200.0网段所有主机进行操作,通过通配符限定主机变更

    [root@ansible ~]# ansible 192.168.200.* -m command -a "head -5 /etc/passwd"

    192.168.200.114 | SUCCESS | rc=0 >>
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    192.168.200.115 | SUCCESS | rc=0 >>
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    Ansible命令:
       Ansible额维护命令大多以ansible开头,在终端输入ansible后连续按两次Tab键,会补全所有以ansible字母揩油的命令,

    [root@ansible ~]# ansible                           #连续按两次Tab键
    ansible               ansible-connection        ansible-doc           ansible-galaxy-2           ansible-playbook-2       ansible-pull-2.7
    ansible-2           ansible-console              ansible-doc-2        ansible-galaxy-2.7       ansible-playbook-2.7    ansible-vault
    ansible-2.7        ansible-console-2           ansible-doc-2.7    ansible-inventory         ansible-pull                    ansible-vault-2
    ansible-config    ansible-console-2.7       ansible-galaxy      ansible-playbook         ansible-pull-2

     

     

     实验案例:

    1:检查所有主机是否存活

    [root@ansible ~]# ansible all -f5 -m ping

    192.168.200.102 | SUCCESS => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
    }
    192.168.200.101 | SUCCESS => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
    }
    client1 | SUCCESS => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
    }
    client2 | SUCCESS => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
    }

    2:列出crushlinux组中所有主机列表:

    [root@ansible ~]# ansible crushlinux --list-host

    hosts (2): 192.168.200.114 192.168.200.115


    [root@ansible ~]# cat /etc/ansible/hosts

    [crushlinux]
    192.168.200.114
    192.168.200.115

    
    

    [client]
    client1
    client2

    
    

    [test01]
    client[1:2]

    3:批量显示crushlinux组中的磁盘使用情况:

    [root@ansible ~]# ansible crushlinux -a "df -Th"                       #查询client两台主机磁盘
    
    192.168.200.114 | SUCCESS | rc=0 >>
    文件系统 类型 容量 已用 可用 已用% 挂载点
    /dev/mapper/centos-root xfs 50G 5.0G 45G 10% /
    devtmpfs devtmpfs 475M 0 475M 0% /dev
    tmpfs tmpfs 487M 0 487M 0% /dev/shm
    tmpfs tmpfs 487M 8.6M 478M 2% /run
    tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
    /dev/sda1 xfs 1014M 148M 867M 15% /boot
    /dev/mapper/centos-home xfs 26G 33M 26G 1% /home
    tmpfs tmpfs 98M 36K 98M 1% /run/user/0
    /dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
    
    192.168.200.115 | SUCCESS | rc=0 >>
    文件系统 类型 容量 已用 可用 已用% 挂载点
    /dev/mapper/centos-root xfs 17G 4.2G 13G 25% /
    devtmpfs devtmpfs 470M 0 470M 0% /dev
    tmpfs tmpfs 487M 0 487M 0% /dev/shm
    tmpfs tmpfs 487M 8.6M 478M 2% /run
    tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
    /dev/sda1 xfs 1014M 166M 849M 17% /boot
    tmpfs tmpfs 98M 24K 98M 1% /run/user/0
    /dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64

    2:Ansible-doc

               ansibe-doc用来查询模块文档的说明,类似于man命令,针对每个模块都有详细说明应用案例:

    [root@ansible ~]#ansible-doc -l             #查看总帮助
    [root@ansible ~]#ansible-doc -s shell       #查看shell模块的帮助
    [root@ansible ~]#ansible-doc -s raw

    3:ansible-playbook:

              Ansible-playbook是日常应用中使用频繁最高的命令,类似于Linux中的sh,用来执行系列任务,其工作机制是,通过读取编写好的pliaybook文件实现集中处理任务,ansible-playbook命令后面跟yml格式的playbook文件,playbook文件存放了要执行的任务代码,命令使用方式如下:

    语法:ansible-playbook playbook.yml

             ansible-console是ansible为用户提供的一款交互式工具,类似于windows中的cmd以及shell,用户可以在ansible-console虚拟出来的终端上做像shell一样使用ansible-console:

            ansible-console命令后显示如下:

    [root@ansible ~]# ansible-console
    Vault password:                     #密码是ansible
    Welcome to the ansible console.
    Type help or ? to list commands.
    
    root@all (4)[f:5]$ cd crushlinux
    root@crushlinux (2)[f:5]$ list
    192.168.200.114
    192.168.200.115
    root@crushlinux (2)[f:5]$ exit       #exit退出

    Ansible模块集群

    1:command模块:

    command模块在远程主机执行命令,不支持管道,重定向等shell的特性,常用参数如下:

    1:chdir:在远程主机上运行命令前需要提前进入目录

    2:creates:在命令运行时创建一个文件,如果文件已经存在,则不会创建任务

    3:removes:在命令运行时移除一个文件,如果文件不存在,则不会执行任务移除命令

    4:executeble:指明运行命令的shell程序

    实验案例:

    1:在所有主机上运行"ls ./"命令。运行前切换到./home目录下。操作如下:

    准备环境,在两台主机上分别创建crushlinux用户否则/home目录下为空查看不带结果:

    Client端操作:

    [root@client1 ~]# useradd crushlinux [root@client1 ~]# ls /home/ crushlinux kvm [root@client2 ~]# useradd crushlinx [root@client2 ~]# ls /home/ crushlinx room

    ansible端操作:

    [root@ansible ~]# ansible all -m command -a "chdir=/home ls ./"

    client2 | SUCCESS | rc=0 >> crushlinx room 192.168.200.115 | SUCCESS | rc=0 >> crushlinx room client1 | SUCCESS | rc=0 >> crushlinux kvm 192.168.200.114 | SUCCESS | rc=0 >> crushlinux kvm
    [root@ansible ~]# ansible crushlinux -a 'uptime'             #uptime表示系统时间
    192.168.200.115 | SUCCESS | rc=0 >>
     10:05:21 up  1:28,  4 users,  load average: 0.00, 0.02, 0.05
    
    192.168.200.114 | SUCCESS | rc=0 >>
     10:05:21 up  1:24,  2 users,  load average: 0.00, 0.03, 0.05

    Shell模块:

       shell模块在远程主机执行命令,相当于调用远程主机的shell进程,然后再该shell下打开子shell运行命令,和command模块的区别在于shell模块支持shell特性,如管道,重定向等:

    实验案例:

    1:测试重定向:

    [root@ansible ~]# ansible crushlinux(此处换成all也可以,也可单独用IP指定) -m shell -a 'echo "111111111" > /tmp/test.txt'
    192.168.200.114 | SUCCESS | rc=0 >>
    
    192.168.200.115 | SUCCESS | rc=0 >>

    [root@client1 ~]# cat /tmp/test.txt

    111111111

    [root@client2 ~]# cat /tmp/test.txt

    111111111

    [root@ansible ~]# ansible all -m command -a 'echo "192.168.200.114" > /tmp/test.txt'
    client2 | SUCCESS | rc=0 >>
    192.168.200.114 > /tmp/test.txt

    192.168.200.115 | SUCCESS | rc=0 >>
    192.168.200.114 > /tmp/test.txt

    192.168.200.114 | SUCCESS | rc=0 >>
    192.168.200.114 > /tmp/test.txt

    client1 | SUCCESS | rc=0 >>
    192.168.200.114 > /tmp/test.txt

    使用command模块虽然运行没有问题但是依旧不会在两台client主机上显示这步更改操作,因为command模块不支持重定向、管道操作

    2:测试管道符

    [root@ansible ~]# ansible all -m shell -a 'ifconfig ens33 | awk -F "[ :]+" "NR==2 {print $3}"'
    192.168.200.115 | SUCCESS | rc=0 >>
            inet 192.168.200.115  netmask 255.255.255.0  broadcast 192.168.200.255
    
    client2 | SUCCESS | rc=0 >>
            inet 192.168.200.115  netmask 255.255.255.0  broadcast 192.168.200.255
    
    client1 | SUCCESS | rc=0 >>
            inet 192.168.200.114  netmask 255.255.255.0  broadcast 192.168.200.255
    
    192.168.200.114 | SUCCESS | rc=0 >>
            inet 192.168.200.114  netmask 255.255.255.0  broadcast 192.168.200.255

    raw模块:

    最开始的方式运行命令(不依赖python,仅仅通过ssh实现)

    注:raw模块和comand、shell 模块不同的是其没有chdir、creates、removes参数,chdir参数的作用就是先切到chdir指定的目录后,再执行后面的命令,这在后面很多模块里都会有该参数 。

    实验案例:

    1:清除yum缓存:

      [root@ansible ~]# ansible all -m raw -a "mount /dev/sr0 /media"

    192.168.200.114 | CHANGED | rc=0 >>
    mount: /dev/sr0 写保护,将以只读方式挂载
    Shared connection to 192.168.200.102 closed.


    client1 | CHANGED | rc=0 >>
    mount: /dev/sr0 写保护,将以只读方式挂载
    Shared connection to client1 closed.


    client2 | FAILED | rc=32 >>
    mount: /dev/sr0 写保护,将以只读方式挂载
    mount: /dev/sr0 已经挂载或 /media 忙
    /dev/sr0 已经挂载到 /media 上
    Shared connection to client2 closed.
    non-zero return code

    192.168.200.115 | FAILED | rc=32 >>
    mount: /dev/sr0 写保护,将以只读方式挂载
    mount: /dev/sr0 已经挂载或 /media 忙
    /dev/sr0 已经挂载到 /media 上
    Shared connection to 192.168.200.101 closed.
    non-zero return code



    [root@ansible ~]# ansible all -m raw -a "yum clean all" client2 | SUCCESS | rc=0 >> 已加载插件:fastestmirror, langpacks 正在清理软件源: epel yum Shared connection to client2 closed. 192.168.200.115 | SUCCESS | rc=0 >> 已加载插件:fastestmirror, langpacks 正在清理软件源: epel yum Shared connection to 192.168.200.115 closed. 192.168.200.114 | SUCCESS | rc=0 >> 已加载插件:fastestmirror, langpacks 正在清理软件源: yum Shared connection to 192.168.200.114 closed. client1 | SUCCESS | rc=0 >> 已加载插件:fastestmirror, langpacks 正在清理软件源: yum Shared connection to client1 closed.

    2:重建缓存:

    [root@ansible ~]# ansible all -m raw -a "yum makecache"
    client1 | SUCCESS | rc=0 >>
    已加载插件:fastestmirror, langpacks
    Determining fastest mirrors
    yum                                                      | 3.6 kB     00:00     
    (1/4): yum/group_gz                                        | 166 kB   00:00     
    (2/4): yum/primary_db                                      | 3.1 MB   00:00     
    (3/4): yum/filelists_db                                    | 3.2 MB   00:00     
    (4/4): yum/other_db                                        | 1.3 MB   00:00     
    元数据缓存已建立
    Shared connection to client1 closed.
    
    
    192.168.200.114 | SUCCESS | rc=0 >>
    已加载插件:fastestmirror, langpacks
    /var/run/yum.pid 已被锁定,PID 为 14905 的另一个程序正在运行。
    Another app is currently holding the yum lock; waiting for it to exit...
      另一个应用程序是:yum
        内存: 23 M RSS (346 MB VSZ)
        已启动: Mon Oct 28 11:51:00 2019 - 00:02之前
        状态  :睡眠中,进程ID:14905
    Another app is currently holding the yum lock; waiting for it to exit...
      另一个应用程序是:yum
        内存: 29 M RSS (350 MB VSZ)
        已启动: Mon Oct 28 11:51:00 2019 - 00:04之前
        状态  :运行中,进程ID:14905
    Loading mirror speeds from cached hostfile
    yum                                                      | 3.6 kB     00:00     
    元数据缓存已建立
    Shared connection to 192.168.200.114 closed.

    copy 模块:

       

    实验案例:

     将crushlinux组中主机的/etc/hosts文件拷贝到/tmp、下指定权限为777更改属主为crushlinx属组为root:

    [root@ansible ~]# ansible crushlinux -m copy -a "src=/etc/hosts dest=/tmp/ mode=777 owner=crushlinux group=root"
    192.168.200.114 | SUCCESS => {
        "changed": true, 
        "checksum": "4efbe32544b08f6b76d05599131211a08ba2ea35", 
        "dest": "/tmp/hosts", 
        "gid": 0, 
        "group": "root", 
        "md5sum": "461ed2a7440cd3b1a17437c409a54ef3", 
        "mode": "0777", 
        "owner": "crushlinux", 
        "secontext": "unconfined_u:object_r:admin_home_t:s0", 
        "size": 230, 
        "src": "/root/.ansible/tmp/ansible-tmp-1572236033.85-131139758635890/source", 
        "state": "file", 
        "uid": 1001
    }
    192.168.200.115 | FAILED! => {                #两台client机的/tmp/下都有了hosts的文件依旧运行出问题
        "changed": false, 
        "checksum": "4efbe32544b08f6b76d05599131211a08ba2ea35", 
        "gid": 0, 
        "group": "root", 
        "mode": "0644", 
        "msg": "chown failed: failed to look up user crushlinux", 
        "owner": "root", 
        "path": "/tmp/hosts", 
        "secontext": "unconfined_u:object_r:admin_home_t:s0", 
        "size": 230, 
        "state": "file", 
        "uid": 0
    }

    yum模块

       YUM模块基于yum机制,对远程主机管理程序包,常用参数如下:

    1:name:程序包的名称,可以带上版本号,如下指定版本号默认安装为最新版本

    2:state=present | latest | absent:指明对程序包执行的操作,present表示安装程序包,latest表示安装最新的安装包,absent表示卸载程序包。

    3:disablerepo:在用yum安装时禁用某个仓库的ID

    4:enablerepo:在用yum安装时启用某个仓库的ID

    5:conf_file:yum 运行时的配置文件而并不是使用默认的配置文件

    6:diavle_gpg_check=yes | no:是否启用完整的校验功能

    实验案例:

     注意:实验前要在client配置yum仓库

    管理员只是发送yum命令到被管理端,被管理端要存在可用的yum仓库才可以成功安装。

    1:client端yum安装dhcp

    [root@ansible ~]# ansible crushlinux -m yum -a "name=dhcp state=present"
    192.168.200.114 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
    "Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile Resolving Dependencies --> Running transaction check ---> Package dhcp.x86_64 12:4.2.5-68.el7.centos.1 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: dhcp x86_64 12:4.2.5-68.el7.centos.1 yum 513 k Transaction Summary ================================================================================ Install 1 Package Total download size: 513 k Installed size: 1.4 M Downloading packages: Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : 12:dhcp-4.2.5-68.el7.centos.1.x86_64 1/1 Verifying : 12:dhcp-4.2.5-68.el7.centos.1.x86_64 1/1 Installed: dhcp.x86_64 12:4.2.5-68.el7.centos.1 Complete! "
    ]
    }
    192.168.200.115 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
    "Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * epel: mirrors.yun-idc.com Resolving Dependencies --> Running transaction check ---> Package dhcp.x86_64 12:4.2.5-68.el7.centos.1 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: dhcp x86_64 12:4.2.5-68.el7.centos.1 yum 513 k Transaction Summary ================================================================================ Install 1 Package Total download size: 513 k Installed size: 1.4 M Downloading packages: Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : 12:dhcp-4.2.5-68.el7.centos.1.x86_64 1/1 Verifying : 12:dhcp-4.2.5-68.el7.centos.1.x86_64 1/1 Installed: dhcp.x86_64 12:4.2.5-68.el7.centos.1 Complete! "
    ]
    }

    USER模块

     实验案例:

    1:创建用户:

    [root@ansible ~]# ansible crushlinux -m user -a 'name=user1 system=yes uid=502 group=root 
    groups=sshd shell=/sbin/nologin home=/home/user1 paassword=user1 comment="test user"
    '


    查看:

      [root@ansible ~]# ansible crushlinux -m command -a 'tail -l /etc/passwd'

    2:删除用户和家目录:

    [root@ansible ~]# ansible crushlinux -m user -a 'name=crushlinux state=absent remove=yes'
    

    [root@ansible ~]# ansible crushlinux -m user -a 'name=crushlinux state=absent remove=yes'
    192.168.200.115 | SUCCESS => {
    "changed": false,
    "name": "crushlinux",
    "state": "absent"
    }
    192.168.200.114 | SUCCESS => {
    "changed": true,
    "force": false,
    "name": "crushlinux",
    "remove": true,
    "state": "absent"
    }

     

    批量部署nginx

    基于playbook部署nginx

    [root@ansible ansible]# vim /etc/ansible/hosts

    [crushlinux]                 #后面用crushlinux中的机器IP来操作全部机器
    
    192.168.200.112
    192.168.200.113
    

      

    [root@ansible ~]# yum -y install tree 

    1、创建目录结构                        
    [root@ansible ~]# mkdir -pv /etc/ansible/roles/nginx/{files,handlers,tasks,templates,vars}

    2、上传需要用的源码包到file文件下

    [root@ansible ansible]# tree /etc/ansible/
    /etc/ansible/
    ├── ansible.cfg
    ├── hosts
    ├── hosts.bak
    ├── nginx.yaml
    └── roles
    └── nginx
    ├── files                 #file用于存储用于copy或script模块调用的文件
    │   └── nginx-1.16.0.tar.gz
    ├── handlers          #handlers用于定义开启的服务,且此目录最少存放一个mian.yaml文件,是一个触发器
    ├── tasks               #tasks此目录最少存放一个mian.yaml文件,是一个任务文件
    ├── templates        #定义模板
    └── vars                 #定义变量

    7 directories, 5 files

    [root@ansible ~]# cd /etc/ansible/roles/nginx/files
    [root@ansible files]# rz
    z waiting to receive.**B0100000023be50
    [root@ansible files]# ls
    nginx-1.16.0.tar.gz

    3、定义一个主调用文件(总入口文件)

    [root@ansible files]# vim /etc/ansible/nginx.yaml

    ---
    - hosts: crushlinux                      #执行的主机范围
    gather_facts: True                      #开启系统内置变量
    remote_user: root
    roles:                                         #启用roles原型配置
    - nginx                                      #执行nginx原型模组
    ...

    4、handlers定义mian.yaml文件

    [root@ansible files]# cd ../../../

    [root@ansible ansible]# vim /etc/ansible/roles/nginx/handlers/main.yaml

    ---
    - name: start nginx                         #名字:开启nginx服务
    raw: /usr/local/nginx/sbin/nginx            #路径:
    ...
    

    5、tasks定义mian.yaml文件

    [root@ansible ansible]# vim /etc/ansible/roles/nginx/tasks/main.yaml
    ---
    - name: yum install                  #使用yum install安装
      yum: name={{ item }} state=latest   #定义item变量下载更多依赖包,state=latest表示最新
    with_items: - openssl-devel - pcre-devel - zlib-devel - gcc - gcc-c++ - make - name: user nginx shell: useradd -M -s /sbin/nologin nginx #用shell模块定义程序用户 - name: package copy: src=nginx-1.16.0.tar.gz dest=/usr/src #用copy模块将nginx-1.16.0源码包上传到/usr/src下 - name: install nginx shell: cd /usr/src ; tar xf nginx-1.16.0.tar.gz -C /usr/src ; cd /usr/src/nginx-1.16.0 ; ./configure --prefix=/usr/local/nginx --user=nginx
    --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre
    && make && make install - name: copy conf file template: src=nginx.conf dest=/usr/local/nginx/conf/nginx.conf #用templete模板将nginx.conf配置文件同步到/usr/local/nginx/cong/nginx.conf notify: #notify通知触发器启动nginx服务 - start nginx ...

    6、templates:存储由templates模块调用的模板文件

    [root@ansible ansible]# vim /etc/ansible/roles/nginx/templates/nginx.conf
    user  nginx;
    worker_processes 1;
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    error_log  logs/error.log  info;
    
    pid        logs/nginx.pid;
    
    
    events {
        use epoll;
        worker_connections  10240;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    
        server { 
            listen       {{ nginxport}};        #定义变量端口
            server_name  {{ server_name}};       #定义主机名变量
    
            charset utf-8;
    
            access_log  logs/host.access.log  main;
    
            location / {
                root   html;
                index  index.html index.htm;
            
    }
    }
    } 
    

    7、vars定义templates中的端口和主机名变量mian.yaml文件

    [root@ansible ansible]# vim /etc/ansible/roles/nginx/vars/main.yaml
    ---
    nginxport: "80"
    server_name: "www.crushlinux"
    ...
    

    8、查看目录结构

    [root@ansible ansible]# tree /etc/ansible/

    /etc/ansible/
    
    ├── ansible.cfg
    
    ├── hosts
    
    ├── hosts.bak
    
    ├── nginx.yaml                    #总入口文件
    
    └── roles
    
        └── nginx
    
            ├── files                        #file存放软件包
    
            │   └── nginx-1.16.0.tar.gz
    
            ├── handlers                     #触发器
    
            │   └── main.yaml
    
            ├── tasks                       #任务
    
            │   └── main.yaml
    
            ├── templates                    #模板
    
            │   └── nginx.conf
    
            └── vars                        #变量
    
                └── main.yaml
    

    9、测试部署 

    [root@ansible ansible]# ansible-playbook -C /etc/ansible/nginx.yaml 

    PLAY [crushlinux] **************************************************************************************************************************
    
    TASK [Gathering Facts] **********************************************************************************************************************
    
    ok: [192.168.200.112]
    
    ok: [192.168.200.113]
    
    TASK [nginx : yum install] ******************************************************************************************************************
    
    changed: [192.168.200.112] => (item=[u'openssl-devel', u'pcre-devel', u'zlib-devel', u'gcc', u'gcc-c++', u'make'])
    
    changed: [192.168.200.113] => (item=[u'openssl-devel', u'pcre-devel', u'zlib-devel', u'gcc', u'gcc-c++', u'make'])
    
    TASK [nginx : user nginx] ******************************************************************************************************************
    
    skipping: [192.168.200.112]
    
    skipping: [192.168.200.113]
    
    TASK [nginx : package] *********************************************************************************************************************
    
    changed: [192.168.200.113]
    
    changed: [192.168.200.112]
    
    TASK [nginx : install nginx] ***************************************************************************************************************
    
    skipping: [192.168.200.112]
    
    skipping: [192.168.200.113]
    
    TASK [nginx : copy conf file] ************************************************************************************************************
    
    changed: [192.168.200.112]
    
    changed: [192.168.200.113]
    
    RUNNING HANDLER [nginx : start nginx] *****************************************************************************************************
    
    skipping: [192.168.200.112]
    
    skipping: [192.168.200.113]
    
    PLAY RECAP *********************************************************************************************************************************
    
    192.168.200.112            : ok=4    changed=3    unreachable=0    failed=0   
    
    192.168.200.113            : ok=4    changed=3    unreachable=0    failed=0   
    

    10、正式部署

    此处报错因为对方目标主机用于nginx账户

    [root@client1 /]# vim /etc/passwd

    [root@client1 /]# vim /etc/group

    [root@ansible ansible]# ansible-playbook /etc/ansible/nginx.yaml 
    
    PLAY [crushlinux] *************************************************************************************************
    
    TASK [Gathering Facts] *****************************************************************************************************
    ok: [192.168.200.112]
    ok: [192.168.200.113]
    
    TASK [nginx : yum install] ********************************************************************************************
    changed: [192.168.200.112] => (item=[u'openssl-devel', u'pcre-devel', u'zlib-devel', u'gcc', u'gcc-c++', u'make'])
    changed: [192.168.200.113] => (item=[u'openssl-devel', u'pcre-devel', u'zlib-devel', u'gcc', u'gcc-c++', u'make'])
    
    TASK [nginx : user nginx] *********************************************************************************************
    fatal: [192.168.200.112]: FAILED! => {"changed": true, "cmd": "useradd -M -s /sbin/nologin nginx", "delta": "0:00:00.023112", 
    "end": "2020-03-17 16:18:51.053670", "msg": "non-zero return code", "rc": 9, "start": "2020-03-17 16:18:51.030558", "stderr":
    "useradd:用户“nginx”已存在", "stderr_lines": ["useradd:用户“nginx”已存在"], "stdout": "", "stdout_lines": []} fatal: [192.168.200.113]: FAILED! => {"changed": true, "cmd": "useradd -M -s /sbin/nologin nginx", "delta": "0:00:00.022611",
    "end": "2020-03-17 16:18:51.080721", "msg": "non-zero return code", "rc": 9, "start": "2020-03-17 16:18:51.058110", "stderr":
    "useradd:用户“nginx”已存在", "stderr_lines": ["useradd:用户“nginx”已存在"], "stdout": "", "stdout_lines": []} to retry, use: --limit @/etc/ansible/nginx.retry PLAY RECAP ******************************************************************************************************************************** 192.168.200.112 : ok=2 changed=1 unreachable=0 failed=1 192.168.200.113 : ok=2 changed=1 unreachable=0 failed=1

    删除cliente1和client2中的nginx账户后执行正常如下:

    [root@ansible ansible]# ansible-playbook /etc/ansible/nginx.yaml 
    
    PLAY [crushlinux] *************************************************************************************************************
    
    TASK [Gathering Facts] *****************************************************************************************************
    ok: [192.168.200.113]
    ok: [192.168.200.112]
    
    TASK [nginx : yum install] *********************************************************************************************************
    ok: [192.168.200.113] => (item=[u'openssl-devel', u'pcre-devel', u'zlib-devel', u'gcc', u'gcc-c++', u'make'])
    ok: [192.168.200.112] => (item=[u'openssl-devel', u'pcre-devel', u'zlib-devel', u'gcc', u'gcc-c++', u'make'])
    
    TASK [nginx : user nginx] *************************************************************************************************************
    changed: [192.168.200.113]
    changed: [192.168.200.112]
    
    TASK [nginx : package] *********************************************************************************************
    changed: [192.168.200.112]
    changed: [192.168.200.113]
    
    TASK [nginx : install nginx] *********************************************************************************************************
    changed: [192.168.200.113]
    changed: [192.168.200.112]
    
    TASK [nginx : copy conf file] **********************************************************************************************************
    changed: [192.168.200.112]
    changed: [192.168.200.113]
    
    RUNNING HANDLER [nginx : start nginx] ************************************************************************************************
    changed: [192.168.200.113]
    changed: [192.168.200.112]
    PLAY RECAP ************************************************************************************************************************ 192.168.200.112 : ok=7 changed=5 unreachable=0 failed=0 192.168.200.113 : ok=7 changed=5 unreachable=0 failed=0

     

    state=latest
  • 相关阅读:
    (转)extern用法详解
    (转)extern用法,全局变量与头文件
    关于将数字转换成中文表达程序
    不用对战平台玩魔兽
    结构体内存对齐问题(转)
    今天碰到的很奇怪的问题
    99乘法表
    自我检讨
    收支簿
    掠夺论
  • 原文地址:https://www.cnblogs.com/CMX_Shmily/p/11743446.html
Copyright © 2020-2023  润新知