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"

相关推荐
Hy行者勇哥4 天前
用Cursor智能编写Ansible/Terraform脚本,打通CI/CD链路
ci/cd·ansible·terraform
芷栀夏6 天前
飞牛NAS怎么部署Immich?家庭照片自动备份与远程访问教程
服务器·nginx·ansible
悠然南风17 天前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
祺风挽楠1 个月前
ansible编辑
网络·ansible
芳心粽伙饭1 个月前
Ansible课后作业
ansible
烁3471 个月前
Ansible初识
ansible
烁3471 个月前
Ansible安装部署调试
ansible
烁3471 个月前
Ansible命令
ansible
小义_1 个月前
【Ansible】(三)基础配置与连接设置
云原生·ansible
炸炸鱼.1 个月前
Ansible 企业级实战:Playbook 与 Roles 完全指南
网络·ansible