ansible

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

    环境准备

    | Control | 192.168.88.253 | 控制节点(manager) | | —- | —- | —- | | Node1 | 192.168.88.11 | 被控制节点(test) | | Node2 | 192.168.88.12 | 被控制节点(proxy) | | Node3 | 192.168.88.13 | 被控制节点(web1) | | Node4 | 192.168.88.14 | 被控制节点(web2) | | Node5 | 192.168.88.15 | 被控制节点(database) |

  • 6台主机,需要配置主机名、IP地址、YUM。关闭SELINUX和防火墙 ```shell

    在192.168.88.240上配置rhel8 yum源

    挂载rhel8光盘

    [root@pubserver ~]# mkdir /var/ftp/rhel8 [root@pubserver ~]# vim /etc/fstab # 在最后加入以下一行: /iso/rhel-8.2-x86_64-dvd.iso /var/ftp/rhel8 iso9660 defaults 0 0 [root@pubserver ~]# mount -a

6台主机的rhel8配置为:

[root@control ~]# vim /etc/yum.repos.d/local.repo [BaseOS] name=Base OS baseurl=ftp://192.168.88.240/rhel8/BaseOS enabled=1 gpgcheck=0

[AppStream] name=AppStream baseurl=ftp://192.168.88.240/rhel8/AppStream enabled=1 gpgcheck=0

  1. - control节点要求:
  2. - 配置名称解析,能够通过名字访问所有节点
  3. - 配置可以通过ssh到所有节点免密登陆
  4. - 拷贝`/linux-soft/2/ansible_soft.tar.gz`control,并解压安装
  5. ```shell
  6. # 配置名称解析
  7. [root@control ~]# echo -e "192.168.88.253\tcontrol" >> /etc/hosts
  8. [root@control ~]# for i in {1..5}
  9. > do
  10. > echo -e "192.168.88.1$i\tnode$i" >> /etc/hosts
  11. > done
  12. [root@control ~]# tail -6 /etc/hosts
  13. 192.168.88.253 control
  14. 192.168.88.11 node1
  15. 192.168.88.12 node2
  16. 192.168.88.13 node3
  17. 192.168.88.14 node4
  18. 192.168.88.15 node5
  19. # 配置免密登陆
  20. [root@control ~]# ssh-keygen # 三个问题都直接回车,使用默认值
  21. [root@control ~]# for i in node{1..5} # 回答yes和密码
  22. > do
  23. > ssh-copy-id $i
  24. > done
  25. # 装包
  26. [root@zzgrhel8 ~]# scp /linux-soft/2/ansible_soft.tar.gz 192.168.88.253:/root
  27. [root@control ~]# yum install -y tar
  28. [root@control ~]# tar xf ansible_soft.tar.gz
  29. [root@control ~]# cd ansible_soft/
  30. [root@control ansible_soft]# yum install -y *.rpm

配置ansible管理环境

  • 因为要管理的远程主机可能不一样。所以具有相同管理方式的配置放到一个目录下。
  1. # 创建ansible工作目录,目录名自己定义,不是固定的。
  2. [root@control ~]# mkdir ansible
  3. [root@control ~]# cd ansible
  4. # 创建配置文件。默认的配置文件是/etc/ansible/ansible.cfg,但是一般不使用它,而是在工作目录下创建自己的配置文件
  5. [root@control ansible]# vim ansible.cfg # 文件名必须是ansible.cfg
  6. [defaults]
  7. inventory = hosts # 管理的主机,配置在当前目录的hosts文件中,hosts名是自定义的。=号两边空格可有可无。
  8. # 创建主机清单文件。写在[]里的是组名,[]下面的是组内的主机名
  9. [root@control ansible]# vim hosts
  10. [test]
  11. node1
  12. [proxy]
  13. node2
  14. [webservers]
  15. node[3:4] # node3和node4的简化写法,表示从3到4
  16. [database]
  17. node5
  18. # cluster是组名,自定义的;:children是固定写法,表示下面的组名是cluster的子组。
  19. [cluster:children]
  20. webservers
  21. database
  22. # 查看被管理的所有的主机。注意,一定在工作目录下执行命令。
  23. [root@control ansible]# ansible all --list-hosts
  24. hosts (5):
  25. node1
  26. node2
  27. node3
  28. node4
  29. node5
  30. # 查看webservers组中所有的主机
  31. [root@control ansible]# ansible webservers --list-hosts
  32. hosts (2):
  33. node3
  34. node4

ansible管理

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

adhoc临时命令

  • 语法:

    1. ansible 主机或组列表 -m 模块 -a "参数" # -a是可选的
  • 测试到远程主机的连通性

    1. [root@control ansible]# ansible all -m ping
    2. [root@Control ansible]# ansible test,node3 -m ping

    ansible模块

  • 模块基本信息查看 ```shell

    列出ansible的所有模块数量

    [root@control ansible]# ansible-doc -l | wc -l 2834

    列出ansible的所有模块

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

    查看与yum相关的模块

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

查看yum模块的使用说明,主要查看下方的EXAMPLE示例

[root@control ansible]# ansible-doc yum

  1. - 学习模块,主要知道实现某种功能,需要哪个模块。
  2. - 模块的使用方式都一样。主要是查看该模块有哪些参数。
  3. <a name="bWQOw"></a>
  4. ## command模块
  5. - ansible默认模块,用于在远程主机上执行任意命令
  6. - command不支持shell特性,如管道、重定向。
  7. ```shell
  8. # 在所有被管主机上创建目录/tmp/demo
  9. [root@control ansible]# ansible all -a "mkdir /tmp/demo"
  10. # 查看node1的ip地址
  11. [root@control ansible]# ansible node1 -a "ip a s"
  12. [root@control ansible]# ansible node1 -a "ip a s | head" # 报错

shell模块

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

    1. # 查看node1的ip地址,只显示前10行
    2. [root@control ansible]# ansible node1 -m shell -a "ip a s | head"

    script模块

  • 用于在远程主机上执行脚本 ```shell

    在控制端创建脚本即可

    [root@control ansible]# vim test.sh

    !/bin/bash

yum install -y httpd systemctl start httpd

在test组的主机上执行脚本

[root@control ansible]# ansible test -m script -a “test.sh”

  1. <a name="CwAAU"></a>
  2. ## file模块
  3. - 可以创建文件、目录、链接等,还可以修改权限、属性等
  4. - 常用的选项:
  5. - path:指定文件路径
  6. - owner:设置文件所有者
  7. - group:设置文件所属组
  8. - state:状态。touch表示创建文件,directory表示创建目录,link表示创建软链接,absent表示删除
  9. - mode:设置权限
  10. - src:source的简写,源
  11. - dest:destination的简写,目标
  12. ```shell
  13. # 查看使用帮助
  14. [root@control ansible]# ansible-doc file
  15. ... ...
  16. EXAMPLES:
  17. - name: Change file ownership, group and permissions # 忽略
  18. file: # 模块名。以下是它的各种参数
  19. path: /etc/foo.conf # 要修改的文件的路径
  20. owner: foo # 文件所有者
  21. group: foo # 文件的所有组
  22. mode: '0644' # 权限
  23. ... ...
  24. # 根据上面的example,-m file -a的内容就是doc中把各参数的冒号换成=号
  25. # 在test主机上创建/tmp/file.txt
  26. [root@control ansible]# ansible test -m file -a "path=/tmp/file.txt state=touch" # touch是指如果文件不存在,则创建
  27. # 在test主机上创建/tmp/demo目录
  28. [root@control ansible]# ansible test -m file -a "path=/tmp/demo state=directory"
  29. # 将test主机上/tmp/file.txt的属主改为sshd,属组改为adm,权限改为0777
  30. [root@control ansible]# ansible test -m file -a "path=/tmp/file.txt owner=sshd group=adm mode='0777'"
  31. [root@control ansible]# ansible test -a "ls -l /tmp/file.txt"
  32. # 删除test主机上/tmp/file.txt
  33. [root@control ansible]# ansible test -m file -a "path=/tmp/file.txt state=absent" # absent英文缺席的、不存在的
  34. # 删除test主机上/tmp/demo
  35. [root@control ansible]# ansible test -m file -a "path=/tmp/demo state=absent"
  36. # 在test主机上创建/etc/hosts的软链接,目标是/tmp/hosts.txt
  37. [root@control ansible]# ansible test -m file -a "src=/etc/hosts dest=/tmp/hosts.txt state=link"

copy模块

  • 用于将文件从控制端拷贝到被控端
  • 常用选项:
    • src:源。控制端的文件路径
    • dest:目标。被控制端的文件路径
    • content:内容。需要写到文件中的内容 ```shell [root@control ansible]# echo “AAA” > a3.txt

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

      [root@control ansible]# ansible test -m copy -a “src=a3.txt dest=/root/“

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

[root@control ansible]# ansible test -m copy -a “content=’Hello World’ dest=/tmp/mytest.txt”

  1. <a name="I9syD"></a>
  2. ## fetch模块
  3. - 与copy模块相反,copy是上传,fetch是下载
  4. - 常用选项:
  5. - src:源。被控制端的文件路径
  6. - dest:目标。控制端的文件路径
  7. ```shell
  8. # 将test主机上的/etc/hostname下载到本地用户的家目录下
  9. [root@control ansible]# ansible test -m fetch -a "src=/etc/hostname dest=~/"
  10. [root@control ansible]# ls ~/node1/etc/ # node1是test组中的主机
  11. hostname

lineinfile模块

  • 用于确保存目标文件中有某一行内容
  • 常用选项:
    • path:待修改的文件路径
    • line:写入文件的一行内容
    • regexp:正则表达式,用于查找文件中的内容 ```shell

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

      [root@control ansible]# ansible test -m lineinfile -a “path=/etc/issue line=’Hello World’”

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

[root@control ansible]# ansible test -m lineinfile -a “path=/etc/issue line=’chi le ma’ regexp=’Hello’”

  1. <a name="YfqF2"></a>
  2. ## replace模块
  3. - lineinfile会替换一行,replace可以替换关键词
  4. - 常用选项:
  5. - path:待修改的文件路径
  6. - replace:将正则表达式查到的内容,替换成replace的内容
  7. - regexp:正则表达式,用于查找文件中的内容
  8. ```shell
  9. # 把test组中主机上/etc/issue文件中的chi,替换成he
  10. [root@control ansible]# ansible test -m replace -a "path=/etc/issue regexp='chi' replace='he'"

文件操作综合练习

  • 所有操作均对test组中的主机生效
  • 在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777
  • 将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600
  • 替换目标主机/tmp/mydemo/hosts文件中的node5为server5
  • 将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录 ```shell

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

    [root@control ansible]# ansible test -m file -a “path=/tmp/mydemo owner=adm group=adm mode=’0777’ state=directory”

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

[root@control ansible]# ansible test -m copy -a “src=/etc/hosts dest=/tmp/mydemo owner=adm group=adm mode=’0600’”

替换目标主机/tmp/mydemo/hosts文件中的node5为server5

[root@control ansible]# ansible test -m replace -a “path=/tmp/mydemo/hosts regexp=’node5’ replace=’server5’”

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

[root@control ansible]# ansible test -m fetch -a “src=/tmp/mydemo/hosts dest=.”

  1. <a name="qjT2I"></a>
  2. ## user模块
  3. - 实现linux用户管理
  4. - 常用选项:
  5. - name:待创建的用户名
  6. - uid:用户ID
  7. - group:设置主组
  8. - groups:设置附加组
  9. - home:设置家目录
  10. - password:设置用户密码
  11. - state:状态。present表示创建,它是默认选项。absent表示删除
  12. - remove:删除家目录、邮箱等。值为yes或true都可以。
  13. ```shell
  14. # 在test组中的主机上,创建tom用户
  15. [root@control ansible]# ansible test -m user -a "name=tom"
  16. # 在test组中的主机上,创建jerry用户。设置其uid为1010,主组是adm,附加组是daemon和root,家目录是/home/jerry
  17. [root@control ansible]# ansible test -m user -a "name=jerry uid=1010 group=adm groups=daemon,root home=/home/jerry"
  18. # 设置tom的密码是123456
  19. # {{}}是固定格式,表示执行命令。password_hash是函数,sha512是加密算法,则password_hash函数将会把123456通过sha512加密变成tom的密码
  20. [root@control ansible]# ansible test -m user -a "name=tom password={{'123456'|password_hash('sha512')}}"
  21. # 删除tom用户,不删除家目录
  22. [root@control ansible]# ansible test -m user -a "name=tom state=absent"
  23. # 删除jerry用户,同时删除家目录
  24. [root@control ansible]# ansible test -m user -a "name=jerry state=absent remove=yes"

group模块

  • 创建、删除组
  • 常用选项:
    • name:待创建的组名
    • gid:组的ID号
    • state:present表示创建,它是默认选项。absent表示删除 ```shell

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

      [root@control ansible]# ansible test -m group -a “name=devops”

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

[root@control ansible]# ansible test -m group -a “name=devops state=absent” ```