Ansible-doc 实战

1 ansible

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

1.1 环境准备

主机名 IP地址 角色
control 192.168.199.51 控制节点master
node1 192.168.199.52 被控制节点node1
node2 192.168.199.53 被控制节点node2

1.2 环境要求

  • control节点要求:
    - 配置名称解析,能够通过名字访问所有节点
    - 配置可以通过ssh到所有节点免密登陆
    - 安装ansible
配置域名解析
[root@control ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.199.51 control
192.168.199.52 node1
192.168.199.53 node2
[root@control ~]# 

配置免密登录
[root@control ~]# ssh-keygen 
[root@control ~]# ssh-copy-id node1
[root@control ~]# ssh-copy-id node2
安装ansible
[root@control ~]# yum install epel-release.noarch -y

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

1.3 配置ansible管理工具

因为要管理的远程主机可能不一样。所以具有相同管理方式的配置放到一个目录下
默认的安装目录是在/etc/ansible/

# 创建ansible工作目录,目录名自己定义,不是固定的。
[root@control ~]# mkdir ansible
[root@control ~]# cd ansible

# 创建配置文件。默认的配置文件是/etc/ansible/ansible.cfg,但是一般不使用它,而是在工作目录下创建自己的配置文件
[root@control ansible]# vim ansible.cfg    # 文件名必须是ansible.cfg
[defaults]
inventory = hosts    # 管理的主机,配置在当前目录的hosts文件中,hosts名是自定义的。=号两边空格可有可无。

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

[root@control ansible]# vim hosts 

[web1]
node1

[web2]
node2

[root@control ansible]# ansible all --list-hosts
  hosts (2):
    node2
    node1
[root@control ansible]# 

2 ansible-doc 命令

2.1 语法

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

2.2 ansible模块

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

# 查看与yum相关的模块
[root@control ansible]# ansible-doc -l | grep yum
yum                                                           Manages packa...
yum_repository                                                Add or remove...
[root@control ansible]# 

  • 学习模块,主要知道实现某种功能,需要哪个模块。
  • 模块的使用方式都一样。主要是查看该模块有哪些参数。

2.3 command模块和shell模块的区别

  • ansible默认模块,用于在远程主机上执行任意命令
  • command不支持shell特性,如管道、重定向。
# 在所有被管主机上创建目录/tmp/demo
[root@control ansible]# ansible all -a "mkdir /tmp/demo"

# 查看node1的ip地址
[root@control ansible]# ansible node1 -a "ip a s"
[root@control ansible]# ansible node1 -a "ip a s | head"   # 报错

shell模块

  • 与command模块类似,但是支持shell特性,如管道、重定向
# 查看node1的ip地址,只显示前10[root@control ansible]# ansible node1 -m shell -a "ip a s | head"

3 模块实战

3.1 script模块

  • 用于在远程主机上执行脚本,将本地的脚本copy到远程主机上,并执行
[root@control ansible]# vim test.sh
#!/bin/bash
#author zoey

touch /root/script.txt
echo "this is a script model" >script.txt

[root@control ansible]# ansible all -m script -a "test.sh"
node2 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to node2 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to node2 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
}
node1 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to node1 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to node1 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
}
[root@control ansible]# 

[root@node1 ~]# cat script.txt 
this is a script model
[root@node1 ~]# 


3.2 file模块

  • 可以创建文件、目录、链接等,还可以修改权限、属性等
  • 常用的选项:
    • path:指定文件路径
    • owner:设置文件所有者
    • group:设置文件所属组
    • state:状态。touch表示创建文件,directory表示创建目录,link表示创建软链接,absent表示删除
    • mode:设置权限
    • src:source的简写,源
    • dest:destination的简写,目标
# 查看使用帮助
[root@control ansible]# ansible-doc file
EXAMPLES:

- name: Change file ownership, group and permissions
  file:
    path: /etc/foo.conf
    owner: foo
    group: foo
    mode: '0644'

在WEB1主机上创建/tmp/file.txt
[root@control ansible]# ansible web1 -m file -a "path=/tmp/file.txt state=touch"

删除web1主机上/tmp/file.txt
[root@control ansible]# ansible web1 -m file -a "path=/tmp/file.txt state=absent"

在web1主机上创建/etc/hosts的软链接,目标是/tmp/hosts.txt
[root@control ansible]# ansible web1 -m file -a "src=/etc/hosts dest=/tmp/hosts.txt state=link"

3.3 copy模块

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

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

 #在目标主机上创建/tmp/mytest.txt,内容是Hello World
[root@control ansible]# ansible web1 -m copy -a "content='hello word' dest=/tmp/mytest.txt"

3.4 fetch模块

  • 与copy模块相反,copy是上传,fetch是下载
  • 常用选项:
    • src:源。被控制端的文件路径
    • dest:目标。控制端的文件路径
# 将web1主机上的/etc/hostname下载到本地用户的家目录下
[root@control ansible]# 
[root@control ansible]# ansible web1 -m fetch -a "src=/etc/hostname dest=./"


3.5 lineinfile模块

  • 用于确保存目标文件中有某一行内容
  • 常用选项:
    • path:待修改的文件路径
    • line:写入文件的一行内容
    • regexp:正则表达式,用于查找文件中的内容
# web1组中的主机,/etc/issue中一定要有一行Hello World。如果该行不存在,则默认添加到文件结尾
[root@control ansible]# ansible web1 -m lineinfile -a "path=/etc/issue line='hello world'"

# web1组中的主机,把/etc/issue中有Hello的行,替换成chi le ma
ansible web1 -m lineinfile -a "path=/etc/issue line='chi le ma' regexp='hello'"

3.6 replace模块

  • lineinfile会替换一行,replace可以替换关键词
  • 常用选项:
    • path:待修改的文件路径
    • replace:将正则表达式查到的内容,替换成replace的内容
    • regexp:正则表达式,用于查找文件中的内容
# 把web1组中主机上/etc/issue文件中的chi,替换成he
[root@control ansible]# ansible web1 -m replace -a "path=/etc/issue regexp='chi' replace='he'"

3.7 文件操作综合练习

  • 所有操作均对web1组中的主机生效
  • 在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777
  • 将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600
  • 替换目标主机/tmp/mydemo/hosts文件中的node5为server5
  • 将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录
在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777
[root@control ansible]# ansible web1 -m file -a "path=/tmp/mydemo owner=adm group=adm mode='0777' state=directory"
将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600
[root@control ansible]# ansible web1 -m copy -a "src=/etc/hosts dest=/tmp/mydemo owner=adm group=adm mode='0600'"
[root@node1 ~]# cd /tmp/mydemo/
[root@node1 mydemo]# ls
hosts
[root@node1 mydemo]# cat hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.199.51 control
192.168.199.52 node1
192.168.199.53 node2
[root@node1 mydemo]# 

替换目标主机/tmp/mydemo/hosts文件中的node1为server1
[root@control ansible]# ansible web1 -m replace -a "path=/tmp/mydemo/hosts regexp='node1' replace='server1'"
[root@node1 mydemo]# cat hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.199.51 control
192.168.199.52 server1
192.168.199.53 node2
[root@node1 mydemo]# 

将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录
[root@control ansible]# ansible web1 -m fetch -a "src=/tmp/mydemo/hosts dest=."
node1 | CHANGED => {
    "changed": true, 
    "checksum": "442afbbcbd4539223c68db745e45cc99fdbf4382", 
    "dest": "/root/ansible/node1/tmp/mydemo/hosts", 
    "md5sum": "79d1195a2aa818f6dbfb940121402e57", 
    "remote_checksum": "442afbbcbd4539223c68db745e45cc99fdbf4382", 
    "remote_md5sum": null
}

[root@control ansible]# cd node1/tmp/mydemo/
[root@control mydemo]# ls
hosts
[root@control mydemo]# 

3.8 user模块

  • 实现linux用户管理
  • 常用选项:
    • name:待创建的用户名
    • uid:用户ID
    • group:设置主组
    • groups:设置附加组
    • home:设置家目录
    • password:设置用户密码
    • state:状态。present表示创建,它是默认选项。absent表示删除
    • remove:删除家目录、邮箱等。值为yes或true都可以。
 在web1组中的主机上,创建tom用户
[root@control ansible]# ansible web1 -m user -a "name=tom"
# 在web1组中的主机上,创建jerry用户。设置其uid为1010,主组是adm,附加组是daemon和root,家目录是/home/jerry
[root@control ansible]# ansible web1 -m user -a "name=jerry uid=1010 group=adm groups=daemon,root home=/home/jerry"

# 设置tom的密码是123456
# {
   
   {}}是固定格式,表示执行命令。password_hash是函数,sha512是加密算法,则password_hash函数将会把123456通过sha512加密变成tom的密码
[root@control ansible]# ansible web1 -m user -a "name=tom password={
   
   {'123456'|password_hash('sha512')}} "

# 删除tom用户,不删除家目录
[root@control ansible]# ansible web1 -m user -a "name=tom state=absent"

# 删除jerry用户,同时删除家目录
[root@control ansible]# ansible web1 -m user -a "name=jerry state=absent remove=yes"

3.9 group模块

  • 创建、删除组
  • 常用选项:
    • name:待创建的组名
    • gid:组的ID号
    • state:present表示创建,它是默认选项。absent表示删除
# 在web1组中的主机上创建名为devops的组
[root@control ansible]# ansible web1 -m group -a "name=devops"

# 在web1组中的主机上删除名为devops的组
[root@control ansible]# ansible web1 -m group -a "name=devops state=absent"

3.10 yum模块

  • 用于rpm软件包管理,如安装、升级、卸载
  • 常用选项:
    • name:包名
    • state:状态。present表示安装,如果已安装则忽略;latest表示安装或升级到最新版本;absent表示卸载。
#在test组中的主机上安装tar
[root@control ansible]# ansible web1 -m yum -a "name=tar state=present"
# 在web1组中的主机上卸载wget
[root@control ansible]# ansible web1 -m yum -a "name=wget state=absent"

3.11 service

  • 用于控制服务。启动、关闭、重启、开机自启。
  • 常用选项:
    • name:控制的服务名
    • state:started表示启动;stopped表示关闭;restarted表示重启
    • enabled:yes表示设置开机自启;no表示设置开机不要自启。
# 在web1主机上安装httpd
[root@control ansible]# ansible web1 -m yum -a "name=httpd state=latest"

#  在web1主机上启动httpd,并设置它开机自启
[root@control ansible]# ansible web1 -m service -a "name=httpd state=started enabled=yes"

3.12 mount模块

  • 用于挂载文件系统
  • 常用选项:
    • path:挂载点。如果挂载点不存在,自动创建。
    • src:待挂载的设备
    • fstype:文件系统类型
    • state:mounted,表示永久挂载
# 在web1组中的主机上,把/dev/myvg/mylv永久挂载到/data
[root@control ansible]# ansible web1 -m mount -a "path=/data src=/dev/myvg/mylv state=mounted fstype=xfs"


# 在web1组中的主机上,卸载/dev/myvg/mylv
[root@control ansible]# ansible web1 -m mount -a "path=/data state=absent"

猜你喜欢

转载自blog.csdn.net/xiaolong1155/article/details/131170655
今日推荐