自动化运维工具Ansible常用模块

Posted 资本家的鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动化运维工具Ansible常用模块相关的知识,希望对你有一定的参考价值。

Ansible Ad-Hoc 命令

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

如果我们敲入一些命令去比较快的完成一些事情,而不需要将这些执行的命令特别保存下来, 这样的命令就叫做 ad-hoc 命令。

Ansible提供两种方式去完成任务,一是 ad-hoc 命令,一是写 Ansible playbook(这部分在高级课程中会详细阐释)。

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

命令格式

ansible pattern [-i inventory] -m module -a argument
  • `pattern` 资产选择器
  • `-i` 指定资产清单文件的位置
  • `-m`   指定本次Ansible ad-hoc 要执行的模块。可以类别成SHELL 中的命令。
  • `-a` 模块的参数. 可以类比成SHELL 中的命令参数


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


常用帮助参数

列举出所有的核心模块和附加模块

ansible-doc -l

查询某个模块的使用方法

ansible-doc modulename

查询某个模块的使用方法,比较简洁的信息

ansible-doc -s modulename


常用模块

command & shell 模块

  • 两个模块都是在远程服务器上去执行命令。
  • 但command模块是ad-hoc的默认模块,在执行ad-hoc时,若不指定模块的名字则默认使用此模块。

演示和操作

[root@localhost home]# vim hosts

自动化运维工具Ansible(3)常用模块_Ansible

[root@localhost home]# ansible all -i hosts -a "echo hello"

自动化运维工具Ansible(3)常用模块_centos7_02

[root@localhost home]# ansible all -i hosts -m shell -a "echo hello"

自动化运维工具Ansible(3)常用模块_centos7_02

两个模块的差异

  • shell   模块可以执行SHELL 的内置命令和 特性(比如管道符)。
  • command 模块无法执行SHELL 的内置命令和特性
[root@localhost home]# ansible all -i hosts -m shell -a "echo hello|grep -o e"

自动化运维工具Ansible(3)常用模块_centos7_04

[root@localhost home]# ansible all -i hosts  -a "echo hello|grep -o e"

自动化运维工具Ansible(3)常用模块_centos7_05


script 模块

  • 将管理节点上的脚本传递到被管理节点(远程服务器)上进行执行。

管理节点上的一个脚本

[root@localhost home]# vim /root/a.sh
touch /tmp/testfile
[root@localhost home]# ansible webservers -i hosts -m script -a "/root/a.sh"

自动化运维工具Ansible(3)常用模块_centos7_06

验证

[root@localhost home]# ansible webservers -i hosts -m shell -a "ls /tmp/testfile"

自动化运维工具Ansible(3)常用模块_linux_07


copy 模块

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

常用参数

  • src    指定拷贝文件的源地址
  • dest   指定拷贝文件的目标地址
  • backup 拷贝文件前,若原目标文件发生了变化,则对目标文件进行备份
  • woner  指定新拷贝文件的所有者
  • group  指定新拷贝文件的所有组
  • mode   指定新拷贝文件的权限

演示和操作

  • 准备文件
[root@localhost home]# vim nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true


copy文件

[root@localhost home]# ansible all -i hosts -m copy -a "src=/home/nginx.repo dest=/etc/yum.repos.d/nginx.repo"

自动化运维工具Ansible(3)常用模块_常用模块_08


对原文件进行备份backup

[root@localhost home]# echo "hello" >> nginx.repo   //改变源文件
[root@localhost home]# ansible all -i hosts -m copy -a "src=/home/nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes"
//加backup参数备份
[root@localhost home]# ansible all -i hosts -m shell -a "ls /etc/yum.repos.d/ |grep "nginx""
//查看目标主机目录

自动化运维工具Ansible(3)常用模块_常用模块_09

成功备份


用户及用户组设置owner&group

[root@localhost home]# ansible all -i hosts -m copy -a "src=/home/nginx.repo dest=/etc/yum.repos.d/nginx.repo owner=nobody group=nobody"

权限设置mode

[root@localhost home]# ansible all -i hosts -m copy -a "src=/home/nginx.repo dest=/etc/yum.repos.d/nginx.repo mode=755"

查看结果

[root@localhost home]# ansible all -i hosts -m shell -a "ls -l  /etc/yum.repos.d/ |grep "nginx""

自动化运维工具Ansible(3)常用模块_linux_10

自动化运维工具Ansible(3)常用模块_centos7_11


yum_repsitory模块

  • 添加 YUM 仓库

常用参数

  • `name` 仓库名称,就是仓库文件中第一行的中括号中名称,必须的参数。
  • `description` 仓库描述信息,添加时必须的参数
  • `baseurl` yum存储库 “repodata” 目录所在目录的URL,添加时必须的参数。它也可以是多个URL的列表。
  • `file` 仓库文件保存到被管理节点的文件名,不包含 `.repo`。 默认是 `name` 的值。
  • `state`   preset  确认添加仓库文件, absent 确认删除仓库文件。
  • `gpgcheck` 是否检查 GPG  yes|no, 没有默认值,使用`/etc/yum.conf` 中的配置。

添加 epel 源

[root@localhost home]# ansible dbservers -i hosts -m yum_repository -a "name=epel baseurl=https://download.fedorapro.ject.org/pub/epel/$releaserver/$basearch/ description=EPEL YUMrepo"

自动化运维工具Ansible(3)常用模块_Ansible_12

检查源文件

[root@localhost home]# ansible dbservers -i hosts -m shell -a "cat /etc/yum.repos.d/epel.repo"

自动化运维工具Ansible(3)常用模块_常用模块_13


删除源文件

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

自动化运维工具Ansible(3)常用模块_centos7_14

  • 仅可以管理yum_repsitory模块修改过的源路径


yum 模块

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

常用参数:

  • name    要安装的软件包名, 多个软件包以英文逗号(,) 隔开
  • state   对当前指定的软件安装、移除操作(present installed latest absent removed)

支持的参数  

  1. present 确认已经安装,但不升级
  2. installed 确认已经安装
  3. latest   确保安装,且升级为最新
  4. absent 和 removed  确认已移除


安装软件包

[root@localhost home]# ansible dbservers -i hosts -m yum -a "name=nginx state=present"

自动化运维工具Ansible(3)常用模块_linux_15

[root@localhost home]# ansible dbservers -i hosts -m yum -a "name=nginx state=latest"

自动化运维工具Ansible(3)常用模块_linux_16

[root@localhost home]# ansible dbservers -i hosts -m yum -a "name=nginx state=installed"

自动化运维工具Ansible(3)常用模块_Ansible_17


移除软件包

[root@localhost home]# ansible dbservers -i hosts -m yum -a "name=nginx state=removed"

自动化运维工具Ansible(3)常用模块_常用模块_18


安装软件包组

[root@localhost home]# ansible dbservers -i hosts -m yum -a "name=@Development tools state=present"  
//注意@符号


systemd 模块

  • Centos6 之前的版本使用 `service` 模块,用 `ansible-doc  service` 命令自行查看帮助信息。
  • 管理远程节点上的 systemd 服务,就是由 systemd 所管理的服务。

常用参数:

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


重新加载 systemd

root@localhost home]# ansible dbservers -i hosts -m systemd -a "daemon_reload=yes"

启动/关闭/重启/重新加载/自启动

启动服务

[root@localhost home]# ansible dbservers -i hosts -m systemd -a "name=nginx state=started"

自动化运维工具Ansible(3)常用模块_常用模块_19

关闭服务

[root@localhost home]# ansible dbservers -i hosts -m systemd -a "name=nginx state=stopped"

自动化运维工具Ansible(3)常用模块_centos7_20

重启服务

[root@localhost home]# ansible dbservers -i hosts -m systemd -a "name=nginx state=restarted"

自动化运维工具Ansible(3)常用模块_centos7_21

重新加载服务

[root@localhost home]# ansible dbservers -i hosts -m systemd -a "name=nginx state=reloaded"

自动化运维工具Ansible(3)常用模块_linux_22

将服务设置开机自启动

[root@localhost home]# ansible dbservers -i hosts -m systemd -a "name=nginx enabled=yes"

自动化运维工具Ansible(3)常用模块_linux_23


user 模块

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

常用参数:

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


创建用户并设置密码

[root@localhost home]# pass=$(echo "123456" | openssl passwd -1 -stdin)  //先生成加密密码
[root@localhost home]# ansible all -i hosts -m user -a "name=foo password=$pass"


创建用户, 并且为其创建密钥对,并且密钥类型为: ecdsa

[root@localhost home]# ansible all -i hosts -m user -a "name=yangge generate_ssh_key=yes ssh_key_type=ecdsa"


创建用户, 并且设置其有效期到 2020年4月15日, 加入到组 db_admin 中, 不改变用户原有假如的组。

[root@localhost home]# ansible dbservers -i hosts -m user -a "name=tom expires=$(date +%s -d 20200415)"


验证:

[root@localhost home]# ansible all -i hosts -m shell -a "tail -3 /etc/passwd"
[root@localhost home]# ansible all -i hosts -m shell -a "tail -3 /etc/shadow"

自动化运维工具Ansible(3)常用模块_linux_24

自动化运维工具Ansible(3)常用模块_centos7_25


date 命令说明

// 计算 3 小时之后是几点几分
# date +%T -d 3 hours
// 任意日期的前 N 天,后 N 天的具体日期
# date +%F -d "20190910 1 day"
# date +%F -d "20190910 -1 day"

// 计算两个日期相差天数, 比如计算生日距离现在还有多少天
# d1=$(date +%s -d 20180728)
# d2=$(date +%s -d 20180726)
# echo $(((d1-d2)/86400))


file 模块

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

常用参数:

  • owner  定义文件/目录的属主
  • group  定义文件/目录的属组
  • mode   定义文件/目录的权限
  • path   必选项,定义文件/目录的路径
  • recurse  递归的设置文件的属性,只对目录有效
  • src    链接(软/硬)文件的源文件路径,只应用于state=link的情况
  • dest   链接文件的路径,只应用于state=link的情况
  • state =
  • directory  如果目录不存在,创建目录
  • file     文件不存在,则不会被创建,存在则返回文件的信息,常用于检查文件是否存在。
  • link     创建软链接
  • hard    创建硬链接
  • touch   如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
  • absent   删除目录、文件或者取消链接文件

创建文件/目录

创建文件

[root@localhost home]# ansible dbservers -i hosts -m file -a "path=/tmp/foo.conf state=touch"

创建目录

[root@localhost home]# ansible dbservers -i hosts -m file -a "path=/tmp/testdir state=directory"

改变文件所有者及权限

[root@localhost home]# ansible dbservers -i hosts -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"


创建/取消链接

创建软链接

[root@localhost home]# ansible dbservers -i hosts -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"

取消链接

[root@localhost home]# ansible dbservers -i hosts -m file -a "path=/tmp/link.conf state=absent"


删除文件

[root@localhost home]# ansible dbservers -i hosts -m file -a "path=/tmp/foo.conf state=absent"


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)


新建任务

[root@localhost home]# ansible dbservers -i hosts -m cron -a "name=create new job minute=0 job=0 job=ll > /dev/null"

客户端验证

[root@localhost ~]# crontab -l

自动化运维工具Ansible(3)常用模块_Ansible_26


删除任务

  • 删除时,一定要正确指定job 的name参数,以免误删除。
[root@localhost home]# ansible dbservers -i hosts -m cron -a "name=create new job state=absent"


template 模块

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

常用参数:

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

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

1. 建立一个 template 文件, 名为 hello_word.j2

[root@localhost home]# vim hello_word.j2
Hello var !

2. 执行命令,并且设置变量 var 的值为 world

[root@localhost home]# ansible dbservers -i hosts -m template -a "src=hello_word.j2 dest=/tmp/hello_word.word" -e "var=world"

3. 在被控主机上验证

[root@localhost home]# cat /tmp/hello_word.word
Hello world !


lineinfile 模块

常用参数:

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


删除被控节点文件里的某一条内容

[root@localhost home]# ansible dbservers -i hosts -m lineinfile -a "path=/etc/sudoers regexp=^%wheel state=absent"

替换某一行

[root@localhost home]# ansible dbservers -i hosts -m lineinfile -a "path=/etc/selinux/config regexp=^SELINUX= line=SELINUX=disabled state=present"


以上是关于自动化运维工具Ansible常用模块的主要内容,如果未能解决你的问题,请参考以下文章

自动化运维—Ansible工具的使用

自动化运维—Ansible工具的使用

自动化运维—Ansible工具的使用

Ansible 自动化运维工具之inventory和常用模块介绍

ansible自动化运维工具和常用模块介绍

自动化运维工具--Ansible常用模块