Ansible概述、Ansible环境准备、Ansibleadhoc临时命令语法、命令模块、文件模块、用户模块、综合练习

ansible

  • 批量管理服务器的工具
  • 2015年被红帽公司收购
  • 使用Python语言编写的
  • 基于ssh进行管理,所以不需要在被管端安装任何软件
  • ansible在管理远程主机的时候,主要是通过各种模块进行操作的

环境准备

主机名 IP地址 角色
web1 192.168.88.11 被控制节点(webserver)
web2 192.168.88.12 被控制节点(webserver)
db1 192.168.88.13 被控制节点(database)
pubserver 192.168.88.240 控制节点(manager)
  • 4台主机,需要配置主机名、IP地址、YUM。关闭SELINUX和防火墙

    创建3台主机并配置IP地址。pubserver不需要单独准备,继续使用之前课程中的192.168.88.240。

    [root@myhost ~]# vm clone web{1,2} db1

    [root@myhost ~]# vm setip web1 192.168.88.11

    [root@myhost ~]# vm setip web2 192.168.88.12

    [root@myhost ~]# vm setip db1 192.168.88.13

    在192.168.88.240上配置yum源

    将/linux-soft/s2/目录下的ansible目录中rpm包拷贝到yum服务器的rpms目录

    [root@myhost ~]# scp /linux-soft/s2/zzg/ansible_soft/* 192.168.88.240:/var/ftp/rpms

    更新yum服务器仓库源

    [root@pubserver ~]# createrepo /var/ftp/rpms/

    4台主机的yum全为以下配置

    [root@pubserver ~]# vim /etc/yum.repos.d/local.repo

    [BaseOS]

    name = BaseOS

    baseurl = ftp://192.168.88.240/dvd/BaseOS

    enabled = 1

    gpgcheck = 0

    [AppStream]

    name = AppStream

    baseurl = ftp://192.168.88.240/dvd/AppStream

    enabled = 1

    gpgcheck = 0

    [rpms]

    name = rpms

    baseurl = ftp://192.168.88.240/rpms

    enabled = 1

    gpgcheck = 0

  • 安装ansible

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

  • 配置控制节点pubserver,具体要求如下:

    • 配置名称解析,能够通过名字访问所有节点

    • 配置可以通过ssh到所有节点免密登陆

      配置名称解析

      [root@pubserver ~]# echo -e "192.168.88.240\tpubserver" >> /etc/hosts

      [root@pubserver ~]# for i in 1 2

      do

      echo -e "192.168.88.1i\twebi" >> /etc/hosts

      done

      [root@pubserver ~]# echo -e "192.168.88.13\tdb1" >> /etc/hosts

      [root@pubserver ~]# tail -4 /etc/hosts

      192.168.88.240 pubserver

      192.168.88.11 web1

      192.168.88.12 web2

      192.168.88.13 db1

      配置免密登陆

      [root@pubserver ~]# ssh-keygen # 三个问题都直接回车,使用默认值

      执行以下命令时,可能需要回答yes和远程用户的密码,请按提示操作

      [root@pubserver ~]# for i in web{1..2} db1

      do

      ssh-copy-id $i

      done

配置ansible管理环境

  • 使用一套ansible软件,有可能需要管理多种环境。如在同一台管理主机上管理开发环境和生产环境。

  • 通过创建不同的工作目录,来实现相应的管理需求。

  • 将某一环境下的主机写入到对应工作目录的主机清单文件。

  • 进入对应的工作目录执行管理任务,就可以管理相应环境的主机。

    创建ansible工作目录,目录名自己定义,不是固定的。

    [root@pubserver ~]# mkdir ansible

    [root@pubserver ~]# cd ansible

    创建配置文件。默认的配置文件是/etc/ansible/ansible.cfg,但是一般不使用它,而是在工作目录下创建自己的配置文件

    [root@pubserver ansible]# vim ansible.cfg # 文件名必须是ansible.cfg

    [defaults]

    host_key_checking = false # 不检查主机密钥,=号两边空格可有可无。

    inventory = inventory # 定义主机清单文件为当前目录的inventory

    创建主机清单文件。写在[]里的是组名,[]下面的是组内的主机名

    [root@pubserver ansible]# vim inventory

    [webservers]

    web[1:2] # web1和web2的简化写法,表示从1到2

    [dbs]

    db1

    cluster是组名,自定义的;:children是固定写法,表示下面的组名是cluster的子组。

    [cluster:children]

    webservers

    dbs

    查看被管理的所有的主机。注意,一定在工作目录下执行命令。

    [root@pubserver ansible]# ansible all --list-hosts

    hosts (3):
    
      web1
    
      web2
    
      db1
    

    查看webservers组中所有的主机

    [root@pubserver ansible]# ansible webservers --list-hosts

    hosts (2):
    
      web1
    
      web2
    

ansible管理

  • ansible进行远程管理的两个方法:

    • adhoc临时命令。就是在命令行上执行管理命令。
    • playbook剧本。把管理任务用特定格式写到文件中。
  • 无论哪种方式,都是通过模块加参数进行管理。

adhoc临时命令

  • 语法:

    ansible 主机或组列表 -m 模块 -a "参数" # -a是可选的

  • 通过ping模块测试到远程主机的连通性。

    [root@pubserver ansible]# ansible all -m ping

    该命令检查是否可以管理远程主机。如果结果为绿色的SUCCESS,则表示成功。

    如果是红色的UNREACHABLE,则检查网络是否可通,是否已经可以免密登陆

ansible模块

  • 在ansible中,通过模块来完成某一特定任务。

  • 学习模块,主要知道实现某种功能,需要哪个模块。

  • 模块的使用方式都一样。主要是查看该模块有哪些参数。

    列出全部可用模块,按空格键向下翻页,按q退出

    [root@pubserver ansible]# ansible-doc -l

    列出模块数量

    [root@pubserver ansible]# ansible-doc -l | wc -l # 如有WARNING提示,可忽略

    7214

    查看包含yum的模块名

    [root@pubserver ansible]# ansible-doc -l | grep yum

    查看yum模块的帮助文档,按空格键向下翻页,按q退出

    [root@pubserver ansible]# ansible-doc yum

command模块
  • ansible默认模块,用于在远程主机上执行任意命令

  • command不支持shell特性,如管道、重定向。

    在所有被管主机上创建目录/tmp/demo

    [root@pubserver ansible]# ansible all -a "mkdir /tmp/demo"

    查看we1的ip地址

    [root@pubserver ansible]# ansible web1 -a "ip a s"

    [root@pubserver ansible]# ansible web1 -a "ip a s | head" # 报错

shell模块
  • 与command模块类似,但是支持shell特性,如管道、重定向。

    查看web1的ip地址,只显示前10行

    [root@pubserver ansible]# ansible web1 -m shell -a "ip a s | head"

script模块
  • 用于在远程主机上执行脚本

    # 在控制端创建脚本即可
    
    [root@pubserver ansible]# vim test.sh
    
    #!/bin/bash
    
    
    for user in user{1..5}
    
    do
    
        useradd $user
    
        echo '123456' | passwd --stdin $user
    
    done
    
    
    # 在webservers组的主机上执行脚本
    
    [root@pubserver ansible]# ansible webservers -m script -a "test.sh"
    
    file模块
  • 可以创建文件、目录、链接等,还可以修改权限、属性等

  • 常用的选项:

    • path:指定文件路径

    • owner:设置文件所有者

    • group:设置文件所属组

    • state:状态。touch表示创建文件,directory表示创建目录,link表示创建软链接,absent表示删除

    • mode:设置权限

    • src:source的简写,源

    • dest:destination的简写,目标

      查看使用帮助

      [root@pubserver ansible]# ansible-doc file

      ... ...

      EXAMPLES:

      • name: Change file ownership, group and permissions # 忽略

        ansible.builtin.file: # 模块名。以下是它的各种参数

        path: /etc/foo.conf # 要修改的文件的路径

        owner: foo # 文件所有者

        group: foo # 文件的所有组

        mode: '0644' # 权限

      ... ...

      根据上面的example,-m file -a的内容就是doc中把各参数的冒号换成=号

      在webservers组的主机上创建/tmp/file.txt

      [root@pubserver ansible]# ansible webservers -m file -a "path=/tmp/file.txt state=touch" # touch是指如果文件不存在,则创建;如果存在则改变它的时间戳

      在webservers组的主机上创建/tmp/demo目录

      [root@pubserver ansible]# ansible webservers -m file -a "path=/tmp/demo state=directory"

      将webservers组的主机上/tmp/file.txt的属主改为sshd,属组改为adm,权限改为0777

      [root@pubserver ansible]# ansible webservers -m file -a "path=/tmp/file.txt owner=sshd group=adm mode='0777'"

      [root@pubserver ansible]# ansible webservers -a "ls -l /tmp/file.txt"

      删除webservers组的主机上/tmp/file.txt

      [root@pubserver ansible]# ansible webservers -m file -a "path=/tmp/file.txt state=absent" # absent英文缺席的、不存在的

      删除webservers组的主机上/tmp/demo

      [root@pubserver ansible]# ansible webservers -m file -a "path=/tmp/demo state=absent"

      在webservers组的主机上创建/etc/hosts的软链接,目标是/tmp/hosts.txt

      [root@pubserver ansible]# ansible webservers -m file -a "src=/etc/hosts dest=/tmp/hosts.txt state=link"

copy模块
  • 用于将文件从控制端拷贝到被控端

  • 常用选项:

    • src:源。控制端的文件路径

    • dest:目标。被控制端的文件路径

    • content:内容。需要写到文件中的内容

      [root@pubserver ansible]# echo "AAA" > a3.txt

      将a3.txt拷贝到webservers主机的/root/

      [root@pubserver ansible]# ansible webservers -m copy -a "src=a3.txt dest=/root/"

      在目标主机上创建/tmp/mytest.txt,内容是Hello World

      [root@pubserver ansible]# ansible webservers -m copy -a "content='Hello World' dest=/tmp/mytest.txt"

fetch模块
  • 与copy模块相反,copy是上传,fetch是下载

  • 常用选项:

    • src:源。被控制端的文件路径

    • dest:目标。控制端的文件路径

      将webservers主机上的/etc/hostname下载到本地用户的家目录下

      [root@pubserver ansible]# ansible webservers -m fetch -a "src=/etc/hostname dest=~/"

      [root@pubserver ansible]# ls /root/web1/etc/ # web1是webservers组中的主机

      hostname

      [root@pubserver ansible]# ls /root/web2/etc/

      hostname

lineinfile模块
  • 用于确保存目标文件中有某一行内容

  • 常用选项:

    • path:待修改的文件路径

    • line:写入文件的一行内容

    • regexp:正则表达式,用于查找文件中的内容

      webservers组中的主机,/etc/issue中一定要有一行Hello World。如果该行不存在,则默认添加到文件结尾

      [root@pubserver ansible]# ansible webservers -m lineinfile -a "path=/etc/issue line='Hello World'"

      webservers组中的主机,把/etc/issue中有Hello的行,替换成chi le ma

      [root@pubserver ansible]# ansible webservers -m lineinfile -a "path=/etc/issue line='chi le ma' regexp='Hello'"

replace模块
  • lineinfile会替换一行,replace可以替换关键词

  • 常用选项:

    • path:待修改的文件路径

    • replace:将正则表达式查到的内容,替换成replace的内容

    • regexp:正则表达式,用于查找文件中的内容

      把webservers组中主机上/etc/issue文件中的chi,替换成he

      [root@pubserver ansible]# ansible webservers -m replace -a "path=/etc/issue regexp='chi' replace='he'"

文件操作综合练习
  • 所有操作均对webservers组中的主机生效

  • 在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777

  • 将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600

  • 替换目标主机/tmp/mydemo/hosts文件中的db1为database1

  • 将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录

    在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777

    [root@pubserver ansible]# ansible webservers -m file -a "path=/tmp/mydemo owner=adm group=adm mode='0777' state=directory"

    将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600

    [root@pubserver ansible]# ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/mydemo owner=adm group=adm mode='0600'"

    替换目标主机/tmp/mydemo/hosts文件中的db1为database1

    [root@pubserver ansible]# ansible webservers -m replace -a "path=/tmp/mydemo/hosts regexp='db1' replace='database1'"

    将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录。

    [root@pubserver ansible]# ansible webservers -m fetch -a "src=/tmp/mydemo/hosts dest=."

user模块
  • 实现linux用户管理

  • 常用选项:

    • name:待创建的用户名

    • uid:用户ID

    • group:设置主组

    • groups:设置附加组

    • home:设置家目录

    • password:设置用户密码

    • state:状态。present表示创建,它是默认选项。absent表示删除

    • remove:删除家目录、邮箱等。值为yes或true都可以

      在webservers组中的主机上,创建zhangsan用户

      [root@pubserver ansible]# ansible webservers -m user -a "name=zhangsan"

      在webservers组中的主机上,创建lisi用户。设置其uid为1010,主组是adm,附加组是daemon和root,家目录是/home/lisi

      [root@pubserver ansible]# ansible webservers -m user -a "name=lisi uid=1010 group=adm groups=daemon,root home=/home/lisi"

      设置zhangsan的密码是123456

      {{}}是固定格式,表示执行命令。password_hash是函数,sha512是加密算法,则password_hash函数将会把123456通过sha512加密变成zhangsan的密码

      [root@pubserver ansible]# ansible webservers -m user -a "name=zhangsan password={{'123456'|password_hash('sha512')}}"

      删除zhangsan用户,不删除家目录

      [root@pubserver ansible]# ansible webservers -m user -a "name=zhangsan state=absent"

      删除lisi用户,同时删除家目录

      [root@pubserver ansible]# ansible webservers -m user -a "name=lisi state=absent remove=yes"

group模块
  • 创建、删除组

  • 常用选项:

    • name:待创建的组名

    • gid:组的ID号

    • state:present表示创建,它是默认选项。absent表示删除

      在webservers组中的主机上创建名为devops的组

      [root@pubserver ansible]# ansible webservers -m group -a "name=devops"

      在webservers组中的主机上删除名为devops的组

      [root@pubserver ansible]# ansible webservers -m group -a "name=devops state=absent"

相关推荐
一切皆文件linux14 小时前
网站集群批量管理-密钥认证与Ansible模块
ansible
让美好继续发生2 天前
ansible学习
学习·ansible
有谁看见我的剑了?2 天前
ansible学习之 Facts
ansible
peanutfish2 天前
Chapter 4 RH294 RHEL Automation with Ansible
linux·ansible·yaml
henan程序媛3 天前
jenkins项目发布基础
运维·gitlab·ansible·jenkins
pyliumy4 天前
ansible 配置
大数据·ansible
运维小白。。4 天前
自动化运维工具 Ansible
运维·自动化·ansible
weixin_438197385 天前
ansible之playbook\shell\script模块远程自动安装nginx
linux·服务器·ansible
peanutfish5 天前
Chapter 5 RH294 RHEL Automation with Ansible
linux·ansible·yaml
人类群星闪耀时5 天前
自动化运维的利器:Ansible、Puppet和Chef详解
运维·自动化·ansible