二、Ansible基础之模块篇

1. Ansible Ad-Hoc 命令

Ad-Hoc 命令是什么呢? 这其实是一个概念性的名词,是相对于写Ansible playbook 来说的,类似于在命令行敲shell命令和,写shell scripts 两者之间的关系,可以用于执行一些临时命令。

如果我们敲入一些命令去比较快的完成一些事情,而不需要将这个命令保存下来,这样的命令就叫 Ad-Hoc 命令。

Ansible 提供两种方式去完成任务 一是Ad-Hoc 命令,另一个就是写ansible playbook。

前者解决简单的任务,后者解决比较复杂的任务,比如做配置管理或部署。

1.1 命令格式

在快速入门中执行的 Ansible 命令,类似于批量执行命令。

在 Ansible 中统称为 Ad-Hoc 命令。

格式如下:

ansible pattern [-i inventory] -m module -a argment
  • pattern 资产选择器

  • -i 指定资产清单文件的位置

  • -m 指定本次Ansible ad-hoc 要执行的模块,可以类比成shell中的命令

  • -a 模块的参数,可以类比成shell中的命令参数

1.2 模块类型

Ansible 模块分为三种类型:核心模块(core module)、附加模块(extra module)、用户自定义模块(consume module)。

核心模块是由Ansible官方提供的

附加模块是由各社区提供的。如OPENSTACK社区、DOCKER社区等。

当核心模块和附加模块都无法满足你的需求时,用户可以自定义模块。

默认情况下,安装ansible的时候核心模块和附加模块都已经安装完成无需用户干预。

1.3 联机帮助

Ansible 的核心模块和附加模块,数量有1000+,这样庞大的模块量,对任何一个接触Ansible的人都不可能完成记住、掌握使用。因此能够顺利使用Ansible的帮助文档,对我们来说很重要,Ansible 的帮助文档,由它本身提供的命令 ansible-hoc 实现。

1.3.1 常用帮助参数

  • 列举出所有的核心模块和附加模块
# ansible-doc -l
  • 查询某个模块的使用方法
# ansible-doc mdulename
  • 查询某个模块的使用方法,比较简介的信息
# ansible-doc -s modulename

练习:

# ansible-doc  yum
# ansible-doc -s yum

1.4 常用模块

为了便于演示和操作,现在把之前的测试主机ip192.168.10.144192.168.10.145,保存在当前目录下新建的hosts文件中。

[root@ansible-01 ~]# cat hosts 
[dbservers]
192.168.10.144

[webservers]
192.168.10.145

1.4.1 command & shell 模块

两个模块都在远程服务器上执行命令。

但command模块是ad-hoc的默认模块,在执行ad-hoc时,若不指定模块的名子,则默认使用此模块。

[root@ansible-01 ~]# ansible all -i hosts -a "echo hello"
192.168.10.145 | CHANGED | rc=0 >>
hello
192.168.10.144 | CHANGED | rc=0 >>
hello

[root@ansible-01 ~]# ansible all -i hosts -m shell -a "echo hello"
192.168.10.145 | CHANGED | rc=0 >>
hello
192.168.10.144 | CHANGED | rc=0 >>
hello

两个模块的差异:

  • shell 模块可以执行shell的内置命令和特征(比如管道符)

  • command 模块无法执行shell 的内置命令和特征

练习

# shell 模块
[root@ansible-01 ~]# ansible all -i hosts -m shell -a "echo 'hello' | grep -o 'e'"
192.168.10.145 | CHANGED | rc=0 >>
e
192.168.10.144 | CHANGED | rc=0 >>
e

# command 模块
[root@ansible-01 ~]# ansible all -i hosts -a "echo 'hello' | grep -o 'e'"
192.168.10.145 | CHANGED | rc=0 >>
hello | grep -o e
192.168.10.144 | CHANGED | rc=0 >>
hello | grep -o e

1.4.2 script 模块

将管理节点上的脚本传递到被管理节点(远程服务器)上进行执行,理论上此模块的执行完全不需要被管理服务器上有python

练习
管理节点上的一个脚本

[root@ansible-01 ~]# cat /root/a.sh 
touch /tmp/testfile

执行

[root@ansible-01 ~]# ansible webservers -i hosts -m script -a "/root/a.sh"
192.168.10.145 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.10.145 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 192.168.10.145 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
}

1.4.3 copy 模块

copy 模块只要用于管理节点和被管理节点之间的文件拷贝。

常用参数:

  • src 指定拷贝文件的源地址

  • dest 指定拷贝文件的目标地址

  • backup 拷贝文件前,若原目标文件发生了变化,则对目标文件进行备份

  • woner 指定新拷贝文件的所有者

  • group 指定新拷贝文件的所有组

  • mode 指定新拷贝文件的权限

练习

  • copy 管理节点上的epel.repo 到被管理节点上。
[root@ansible-01 ~]# cat epel.repo 
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
 
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=http://mirrors.aliyun.com/epel/7/$basearch/debug
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0
 
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=http://mirrors.aliyun.com/epel/7/SRPMS
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0

# 执行
[root@ansible-01 ~]# ansible webservers -i hosts -m copy -a "src=./epel.repo dest=/tmp/epel.repo"

# 查看
[root@ansible-01 ~]# ansible webservers -i hosts -m shell -a "ls -l /tmp/"
192.168.10.145 | CHANGED | rc=0 >>
total 4
-rw-r--r--. 1 root root   0 Oct  2 22:02 a.conf
drwx------. 2 root root  41 Oct  3 21:21 ansible_command_payload_5XcIxi
-rw-r--r--. 1 root root 665 Oct  3 21:20 epel.repo       # 拷贝的文件
-rw-r--r--. 1 root root   0 Oct  3 21:03 testfile
drwx------. 2 root root   6 Oct  2 21:36 vmware-root_708-2998936538
drwx------. 2 root root   6 Oct  3 20:12 vmware-root_716-2965513684
  • copy前,会在被管理节点上备份
[root@ansible-01 ~]# ansible webservers -i hosts -m copy -a "src=./epel.repo dest=/tmp/epel.repo backup=yes"
  • copy 文件的同时对文件进行用户及用户组操作
[root@ansible-01 ~]# ansible all -i hosts -m copy -a "src=./epel.repo dest=/tmp/epel.repo owner=nobody group=nobody"
  • copy文件的同时,对文件进行权限设置
[root@ansible-01 ~]# ansible all -i hosts -m copy -a "src=./epel.repo dest=/tmp/epel.repo mode=0755"

1.4.4 yum_repsitory

添加yum仓库

常用参数:

  • name 仓库名称,就是仓库中第一行中括号里面的内容,必须是参数

  • description 仓库描述信息,添加时必须的参数

  • baseurl yum 存储库“repodata”,目录所在目录的url,必须添加的参数

  • file 仓库文件保存到被管理节点的文件名,不包含.repo,默认是name的指

  • state preset 确认添加仓库文件,absent确认删除仓库文件

  • gpgcheck 是否检查 GPG yes|no ,没有默认值,使用/etc/yum.conf中的配置

练习

添加epel源

[root@ansible-01 ~]# ansible dbservers -i hosts -m yum_repository -a "name=epel baseurl='http://mirrors.aliyun.com/epel/7/$basearch' description='EPEL YUM repo'"

删除epel源

[root@ansible-01 ~]# ansible dbservers -i hosts -m yum_repository -a "name=epel state=absent"

1.4.5 yum 模块

等同于Linux上的yum命令,对远程服务器上的RPM包进行管理

常用参数

  • name 要安装的软件包名,多个软件包可以用英文逗号隔开

  • state 对当前指定的软件进行安装、移除操作(present、installed、latest absent removed)

支持的参数

  • present 确认已经安装,但不升级

  • installed 确认已经安装

  • latest 确保安装,且升级为最新

  • absentremoved 确认已经删除

练习

  • 安装一个软件包
[root@ansible-01 ~]# ansible webservers -i hosts -m yum -a "name=vim state=present"
[root@ansible-01 ~]# ansible webservers -i hosts -m yum -a "name=vim state=latest"
[root@ansible-01 ~]# ansible webservers -i hosts -m yum -a "name=vim state=installed"
  • 移除一个软件包
[root@ansible-01 ~]# ansible webservers -i hosts -m yum -a "name=vim state=absent"
[root@ansible-01 ~]# ansible webservers -i hosts -m yum -a "name=vim state=removed"
  • 安装一个软件包组
[root@ansible-01 ~]# ansible all -i hosts -m yum -a "name='@Development tools' state=present"

1.4.6 systemd 模块

Centos6以前的版本是service 模块
请使用ansible-doc service 命令自行查看帮助

管理远程节点上的systemd服务,就是由systemd管理的服务

常用参数

  • daemon_reload 重新载入systemd 扫描新的或者有变动的单元
  • enabled 是否开机自启动 yes|no
  • name 必选项,服务名称,比如httpd、vsftpd等
  • state 对当前服务执行启动、重启、停止、重新加载等操作(started、stopped、restarted、reloaded)

练习

  • 重新加载systemd服务
[root@ansible-01 ~]# ansible webservers -i hosts -m systemd -a "daomon_reload=yes"
  • 重启nginx服务
[root@ansible-01 ~]# ansible webservers -i hosts -m systemd -a "name=nginx state=started"
  • 关闭nginx服务
[root@ansible-01 ~]# ansible webservers -i hosts -m systemd -a "name=nginx state=stopped"
  • 重启nginx服务
[root@ansible-01 ~]# ansible webservers -i hosts -m systemd -a "name=nginx state=restarted"
  • 重新加载nginx服务
[root@ansible-01 ~]# ansible webservers -i hosts -m systemd -a "name=nginx state=reloaded"
  • 加入开机自启
[root@ansible-01 ~]# ansible webservers -i hosts -m systemd -a "name=nginx enabled=yes"

1.4.7 group 模块

在被管理节点上,对组进行管理

常用参数

  • name 组名称,必须有
  • system 是否为系统组 yes|no,默认是no
  • state 删除组 present/absent

练习

  • 创建普通组
[root@ansible-01 ~]# ansible dbservers -i hosts -m group -a "name=group_admin"

1.4.8 user 模块

用于在被管理节点上对用户进行管理

常用参数

  • name 用户名,必须有
  • password 设置用户的密码,这里接收的是一个加密的指,因为直接存到shadow,默认不设置密码
  • update_password 假如设置的密码不同于原始密码
  • home 指定的家目录
  • shell 指定用户的shell
  • comment 用户的描述信息
  • create_home 在创建用户时,是否创建其家目录。默认创建,假如不创建,设置为no
  • group 设置用户的主组
  • groups 将用户加入到多个其他组中,可以用逗号隔开。默认会把用户从其他已经加入的组中删除
  • append yes|no 和groups配合使用,yes时,不会把用户已经加入的其他组删除
  • system 设置为yes时,将会创建一个新的系统账号
  • expires 设置用户过期时间,值为时间戳,会转为多少天后,放在shadow的第八个字段里
  • generate_ssh_key 设置成yes将会为用户产生秘钥,不会覆盖原来的秘钥
  • ssh_key_type 指定用户的秘钥类型,默认rsa,具体的类型取决于被管理的节点
  • state 删除或者添加用户,present为添加,absent为删除,默认为present
  • remove 当与 state=absent 一起使用,删除一个用户及其关联的目录,比如家目录、邮箱目录、可选值为 yes|no

练习

  • 创建用户并设置密码
# 1. 先生成加密密码
[root@ansible-01 ~]# pass=$(echo "123456" | openssl passwd -l -stdin

# 2. 执行ansible命令,创建用户foo并设置密码
[root@ansible-01 ~]# ansible all -i hosts -m user -a "name=foo password=${pass}"

# 3. 创建用户mage,并为其设置密钥对,秘钥类型为ecdsa
[root@ansible-01 ~]# ansible all -i hosts -m user -a "name=mage generate_ssh_key=yes ssh_key_type=ecdsa}"

# 4. 创建tom,并设置其有效期到2021-10-5,并加入到组db_admin中(添加的组在被管理节点上要有),不改变用于原有组
[root@ansible-01 ~]# ansible dbservers -i hosts -m user -a "name=tom expires=$(date +%s -d 20211005) groups=db_admin append=yes"

date命令说明

# 计算3小时后是几点几分
[root@web-01 ~]# date +%T -d '3 hours'

# 任意日期的前N天,后N天的具体日期
[root@web-01 ~]# date +%F -d "20190910 1 day"
2019-09-11
[root@web-01 ~]# date +%F -d "20190910 -1 day"
2019-09-09

# 计算两个日期相差几天,比如计算生日距离现在还有多少天
[root@web-01 ~]# d1=$(date +%s -d 20180728)
[root@web-01 ~]# d2=$(date +%s -d 20180726)
[root@web-01 ~]# echo $(((d1-d2)/86400))
2

1.4.9 file 模块

file 模块主要用于远程主机上的文件操作.

常用参数:

  • group 定义文件/目录的属组

  • mode 定义文件/目录的权限

  • owner 定义文件/目录的属主

  • path 必选项,定义文件/目录的路径

  • recurse 递归的设置文件的属性,只对目录有效

  • src 链接(软/硬)文件的源文件的路径

  • dest 被链接到的路径,只应用于state=link 的情况

  • state

    • directory 如果目录不存在,则创建目录
    • file 文件不存在,则不会创建,存在返回文件的信息,常用于检测文件是否存在
    • link 创建软连接
    • hard 创建硬链接
    • touch 如果文件不存在,则会创建一个新的文件,如果文件已经存在,则更新其最后修改的时间
    • absent 删除目录/文件,或者软连接

练习

# 创建一个文件
[root@ansible-01 ~]# ansible all -i hosts -m file -a "path=/tmp/foo.conf state=touch"

# 改变文件所有者和权限
[root@ansible-01 ~]# ansible all -i hosts -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=644"

# 创建一个软连接
[root@ansible-01 ~]# ansible all -i hosts -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"

# 创建一个目录
[root@ansible-01 ~]# ansible all -i hosts -m file -a "path=/tmp/testdir state=directory"

# 取消链接
[root@ansible-01 ~]# ansible all -i hosts -m file -a "path=/tmp/link.conf state=absent "

# 删除一个文件
[root@ansible-01 ~]# ansible all -i hosts -m file -a "path=/tmp/foo.conf state=absent"

1.4.10 cron 模块

管理远程节点的CRON 服务, 等同于Linux的计划任务。

注意:使用Ansible 创建的计划任务,是不能在本地用crontab -e 去编辑的,否则Ansible 无法再次编辑此计划任务

常用参数:

  • name 指定一个cron job 的名字,一定要指定,以便以后删除

  • minute 指定分钟,可以设置成(0-59,* ,*/2)等格式,默认是 *,也就是每分钟

  • hour 指定小时,可以设置成(0-23,/2)等格式,默认是 *,也就是每小时

  • day 指定天,可以设置成(1-31,/2)等格式,默认是 * ,也就是每天

  • month 指定月,可以设置成(1-12,/2)等格式,默认是 * ,也就是每月

  • weekday 指定星期,可以设置成(0-6 for Sunday-Saturday,*)等,默认是 * ,也就是每星期

  • job 指定要执行的内容,通常可以写一个脚本,或者一段内容

  • state 指定这个job的状态,可以是新增(present)或者是删除(absent)默认为新增(present)

练习:

# 1.创建一个cron job 任务
[root@ansible-01 ~]# ansible all -i hosts -m cron -a "name='create new job' minute='0' job='ls -alh > /dev/null'"

# 登录任何一台管理机验证
[root@web-01 ~]# crontab -l 
#Ansible: create new job
0 * * * * ls -alh > /dev/null

# 2.删除一个cron job 任务,删除是一定要指定job的name参数,以免误删。
[root@ansible-01 ~]# ansible all -i hosts -m cron -a "name='create new job' state=absent"

1.4.11 debug 模块

debug 模块主要用于调试时使用,通常的作用是将一个变量的指打印出来。

常用参数:

  • var:直接打印一个指定的变量
  • msg:打印一段可以格式化的字符串

练习:
这里引入了变量,我们只需要了解debug即可,后面会在学习剧本时,更加深刻的了解

[root@ansible-01 ~]# ansible all -i hosts -m debug -a "var=role" -e "role=web"

[root@ansible-01 ~]# ansible all -i hosts -m debug -a "msg='role is {{role}}'" -e "role=web"

1.4.12 template 模块

template 模块使用了jinjia2格式作为文件模块,可以进行文档内的变量替换。文件以.j2 结尾。

常用参数:

  • src 指定 ansible 控制端的,文件路径
  • dest 指定 ansible 被控制端的,文件路径
  • owner 指定文件的属主
  • group 指定文件的属组
  • mode 指定文件的权限
  • backup 创建一个包含时间戳信息的备份文件,这样您以一种错误的方式破环了原始文件,就可以将其恢复原状,yes/no

练习:

其用法和copy模块一样,template 模块的强大之处,就是使用变量替换,就是可以把传递给 ansible 的变量的值替换到模板文件中。

# 1.建立一个 template 文件,名为 hello_world.j2
# cat hello_world.j2
Hello {{var}} !

# 2.执行命令,并设置变量var的值为world
[root@ansible-01 ~]# ansible all -i hosts -m template -a "src=hello_world.j2 dest=/tmp/hello_world" -e "var=world"

# 3.在被控制主机验证
[root@web-01 ~]# cat /tmp/hello_world 
Hello world !

1.4.13 lineinfile 模块

在被管理节点上,用正则匹配的方式对目标文件的一行内容 删除等操作。

如果是在一个文件中把所有匹配到的多行都进行统一处理,请参考replace模块。

如果想对一个文件的多行进行添加/更新/删除等操作,参考blockinfile模块。

常用参数:

  • path 在被管理节点的文件路径,必须存在
  • state 可选值absent删除,present替换(默认值)
  • regexp 在文件的每一行中查找的正则表达式,对于state=present 仅找到的最后一行被替换
  • line 要在文件中插入/替换的行,需要state=present
  • create 文件不存在是创建,是否要创建文件并添加内容,yes|no

练习:

# 1.删除被控节点文件里的某一条内容
[root@ansible-01 ~]# ansible dbservers -i  hosts -m lineinfile -a "path=/etc/sudoers regexp='^%wheel' state=absent"

# 2.替换某一行
[root@ansible-01 ~]# ansible dbservers -i hosts -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled' state=present"
posted @ 2021-10-20 22:14  锦书致南辞  阅读(218)  评论(0编辑  收藏  举报