Ansible
Ansible 是一种自动化工具,用于配置管理、应用程序部署、任务自动化等。它基于 YAML 格式的简单语法,无需编写复杂的脚本或程序即可完成各种自动化任务。下面是一些关于 Ansible 的简要介绍:
什么是 Ansible?
自动化工具: Ansible 是一种自动化工具,可用于自动执行各种系统管理任务,如配置管理、软件部署、应用程序管理等。
基于 SSH: Ansible 使用 SSH 协议来与远程主机通信,并在远程主机上执行任务。
基于 YAML: Ansible 使用 YAML 格式来定义任务和剧本,这使得编写和理解 Ansible 配置变得非常简单。
无代理: Ansible 无需在远程主机上安装代理,只需在控制节点上安装 Ansible 即可进行远程管理。
用途
Ansible 可以用于各种自动化任务,包括但不限于:
系统配置管理: 自动化配置管理,例如设置主机名、安装软件包、配置文件等。
应用程序部署: 自动化应用程序部署,例如将代码部署到多台服务器上并启动服务。
持续集成/持续部署(CI/CD): 在持续集成和持续部署流程中使用 Ansible 自动化构建、测试和部署应用程序。
云基础设施管理: 使用 Ansible 来管理云基础设施,例如在云服务提供商上创建虚拟机、配置网络和存储等。
生活中的例子
假设您是一家公司的系统管理员,您的任务是管理公司的 IT 基础设施。以下是一些生活中可能用到 Ansible 的例子:
系统配置管理: 使用 Ansible 自动化配置公司所有服务器的软件包安装、用户账户管理和系统配置。
应用程序部署: 当公司开发团队开发新的网站或服务时,您可以使用 Ansible 自动化部署应用程序到测试和生产环境中。
故障排除和修复: 当某个服务器出现故障时,您可以使用 Ansible 进行快速修复,例如重启服务、修复配置文件等。
企业案例
一些企业案例示例:
Netflix: Netflix 使用 Ansible 来自动化其基础设施的配置管理和应用程序部署,以便实现快速、可靠的服务交付。
Atlassian: Atlassian 使用 Ansible 来自动化其软件产品的测试和部署流程,以便更快地交付软件更新和修复。
NASA: NASA 使用 Ansible 来管理其计算机集群和云基础设施,以支持其科学研究和任务。
ansible常用模块
1. ping 模块
功能: 用于测试Ansible能否与目标主机正常通信。
示例:
yaml
复制代码
- name: 检查所有主机是否可到达
hosts: all
tasks:
- name: ping测试
ping:
2. command 模块
功能: 在目标主机上执行任意的命令。
示例:
yaml
复制代码
- name: 执行命令
hosts: web_servers
tasks:
- name: 获取主机名
command: hostname
register: hostname_output
- debug:
msg: "主机名是 {{ hostname_output.stdout }}"
3. copy 模块
功能: 将文件从控制节点复制到目标主机。
示例:
yaml
复制代码
- name: 复制文件到目标主机
hosts: all
tasks:
- name: 复制配置文件
copy:
src: /path/to/local/file.conf
dest: /path/to/remote/file.conf
4. template 模块
功能: 根据Jinja2模板在控制节点上渲染文件,并将结果复制到目标主机。
示例:
yaml
复制代码
- name: 渲染并复制配置文件
hosts: all
tasks:
- name: 渲染模板并复制文件
template:
src: /path/to/template.j2
dest: /path/to/remote/file.conf
5. apt 模块
功能: 在Debian/Ubuntu系统上管理软件包。
示例:
yaml
复制代码
- name: 安装nginx
hosts: web_servers
tasks:
- name: 安装nginx
apt:
name: nginx
state: present
6. yum 模块
功能: 在CentOS/RHEL系统上管理软件包。
示例:
yaml
复制代码
- name: 安装nginx
hosts: web_servers
tasks:
- name: 安装nginx
yum:
name: nginx
state: present
7. service 模块
功能: 管理系统服务的状态(启动、停止、重新启动等)。
示例:
yaml
复制代码
- name: 启动nginx服务
hosts: web_servers
tasks:
- name: 启动nginx
service:
name: nginx
state: started
8. user 模块
功能: 管理系统用户和用户属性。
示例:
yaml
复制代码
- name: 创建用户
hosts: all
tasks:
- name: 创建用户
user:
name: john
state: present
shell: /bin/bash
9. file 模块
功能: 管理文件和目录的属性。
示例:
yaml
复制代码
- name: 创建目录
hosts: all
tasks:
- name: 创建目录
file:
path: /path/to/directory
state: directory
10. lineinfile 模块
功能: 在文件中添加、修改或删除一行。
示例:
yaml
复制代码
- name: 添加一行到文件
hosts: all
tasks:
- name: 添加一行到配置文件
lineinfile:
path: /path/to/config/file
line: 'new_line_to_add'
insertafter: EOF
11. wait_for 模块
功能: 等待条件满足后继续执行任务。
示例:
yaml
复制代码
- name: 等待端口开启
hosts: web_servers
tasks:
- name: 等待端口开启
wait_for:
port: 80
12. debug 模块
功能: 打印调试信息。
示例:
yaml
复制代码
- name: 打印调试信息
hosts: all
tasks:
- name: 调试输出
debug:
msg: "这是一个调试消息"
13. git 模块
功能: 克隆Git存储库或在目标主机上进行Git操作。
示例:
yaml
复制代码
- name: 克隆Git存储库
hosts: all
tasks:
- name: 克隆代码仓库
git:
repo: https://github.com/example/repo.git
dest: /path/to/local/directory
14. cron 模块
功能: 管理cron作业。
示例:
yaml
复制代码
- name: 添加cron作业
hosts: all
tasks:
- name: 添加cron作业
cron:
name: "daily_backup"
minute: "0"
hour: "2"
job: "/path/to/backup_script.sh"
15. shell 模块
功能: 在目标主机上执行shell命令。
示例:
yaml
复制代码
- name: 在目标主机上执行shell命令
hosts: all
tasks:
- name: 运行shell命令
shell: |
echo "Hello, World!"
ls -l
16. block 和 include 模块
功能: 创建包含多个任务的块,并在不同的主机、角色或条件下重用这些块。
示例:
yaml
复制代码
- name: 包含块
hosts: all
tasks:
- name: 执行多个任务
block:
- name: 任务1
debug:
msg: "这是任务1"
- name: 任务2
debug:
msg: "这是任务2"
17. assert 模块
功能: 断言某些条件是否为真,如果条件不满足,则任务失败。
示例:
yaml
复制代码
- name: 断言文件存在
hosts: all
tasks:
- name: 检查文件是否存在
assert:
that:
- "ansible_facts['file_exists'] == true"
18. uri 模块
功能: 向指定的URI发送HTTP或HTTPS请求。
示例:
yaml
复制代码
- name: 发送HTTP GET请求
hosts: localhost
tasks:
- name: 发送GET请求
uri:
url: https://api.example.com/data
method: GET
absible-Playbook
Playbook基本语法
随着你面临的机器越多,配置的需求越复杂,你可能需要了解后面介绍的一些稍微复杂逻辑的语句。
执行Playbook语法
$ ansible-playbook deploy.yml
查看输出的细节
ansible-playbook playbook.yml --verbose
查看该脚本影响哪些hosts
ansible-playbook playbook.yml --list-hosts
并行执行脚本
ansible-playbook playbook.yml -f 10
完整的playbook脚本示例
最基本的playbook脚本分为三个部分:
在什么机器上以什么身份执行
hosts
users
…
执行的任务是都有什么
tasks
善后的任务都有什么
handlers
deploy.yml文件
---
- hosts: webservers
vars:
http_port: 80
max_clients: 200
user: root
tasks:
- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
执行的任务(Tasks)
tasks是从上到下顺序执行,如果中间发生错误,那么整个playbook会中止。你可以改修文件后,再重新执行。
每一个task的对module的一次调用。使用不同的参数和变量而已。
每一个task最好有name属性,这个是供人读的,没有实际的操作。然后会在命令行里面输出,提示用户执行情况。
语法
task的基本写法:
tasks:
- name: make sure apache is running
service: name=httpd state=running
其中name是可选的,也可以简写成下面的例子。
tasks:
- service: name=httpd state=running
写name的task在playbook执行时,会显示对应的名字,信息更友好、丰富。写name是个好习惯!
TASK: [make sure apache is running] *************************************************************
changed: [yourhost]
没有写name的task在playbook执行时,直接显示对应的task语法。在调用同样的module多次后,不同意分辨执行到哪步了。
TASK: [service name=httpd state=running] **************************************
changed: [yourhost]
参数的不同写法
最上的代码展示了最基本的传入module的参数的方法 key=value
tasks:
- name: make sure apache is running
service: name=httpd state=running
当需要传入参数列表太长时,可以分隔到多行:
tasks:
- name: Copy ansible inventory file to client
copy: src=/etc/ansible/hosts dest=/etc/ansible/hosts
owner=root group=root mode=0644
或者用yml的字典传入参数
tasks:
- name: Copy ansible inventory file to client
copy:
src: /etc/ansible/hosts
dest: /etc/ansible/hosts
owner: root
group: root
mode: 0644
TASK的执行状态
task中每个action会调用一个module,在module中会去检查当前系统状态是否需要重新执行。
如果本次执行了,那么action会得到返回值changed;
如果不需要执行,那么action得到返回值ok
module的执行状态的具体判断规则由各个module自己决定和实现的。例如,”copy” module的判断方法是比较文件的checksum,代码如下:
https://github.com/ansible/ansible-modules-core/blob/devel/files/copy.py
状态示例
以一个copy文件的task为例子:
tasks:
- name: Copy the /etc/hosts
copy: src=/etc/hosts dest=/etc/hosts
第一次执行,它的结果是这个样子的:
TASK的状态是changed
第二次执行是下面这个样子的:
TASK的状态是ok,由于第一次执行copy_hosts.yml的时候,已经拷贝过文件,那么ansible目标文件的状态避免重复执行.
下面我更改vm-rhel7-1的/etc/hosts, 再次执行看看:
Ansible-Playbook实操案例
案例细节
基础配置
1、关闭selinux、firewalld
2、删除系统自带yum
3、复制mysql-python包,安装mysql-python包
4、解压zabbix,zabbix-web包
5、挂载centos镜像包
6、配置centos zabbix zabbix-web的yum仓库
zabbix配置
1、安装zabbix所需服务工具
- zabbix-server-mysql
- zabbix-agent
- zabbix-java-gateway
- zabbix-get
- curl
- curl-devel
2、安装zabbix前端服务
- zabbix-web-mysql-scl
- zabbix-apache-conf-scl
3、安装mariadb数据库
4、配置数据库密码
5、创建数据库zabbix设置字符类型为utf8
6、创建数据库用户zabbix赋权
7、使用zabbix数据库工具 导入mariadb信息
8、配置zabbix配置文件DBPassword,DBHost
9、配置php时区php_value[date.timezone]为Asia/Shanghai
10、开启服务zabbix-server、zabbix-agent、httpd、rh-php72-php-fpm
ansible-playbook --syntax-check
检测playbook语法错误
ansible-playbook -C
测试yaml
ad hoc 命令方式
Ansible Ad-hoc是一种在Ansible中执行一次性任务的命令方式,无需创建和运行完整的Ansible剧本(playbook)。通过Ad-hoc命令,用户可以快速地对远程主机执行一些简单的管理任务,例如安装软件包、管理服务、执行shell命令等。
周五班
copy模块
功能:实现ansible主机向目标主机复制文件。
常用参数:
src #ansible主机分发文件的路径
dest #要将源文件复制到远程机器的绝对路径,必选项。
owner #文件复制过去后的所有者
group #文件复制过去后的所属组
mode #文件的权限设定
backup #默认为no,当文件内容不一致时会直接覆盖文件,开启为yes时会先备份文件,然后再拷贝。
force #默认是yes,当文件不一致时强制覆盖
content #指定文本内容直接在受控主机中生成文件
操作:
复制/root/ansible/shell_1.sh到远程主机/root下。
ansible node -m copy -a "src=/root/shell_1.sh dest=/root/"
拷贝文件,设置权限:
ansible node -m copy -a "src=/root/shell_1.sh dest=/root/ mode=600"
在传输数据文件信息时对远程主机源文件进行备份:
[root@ansible ~]# echo 'ls' > /root/shell_1.sh
[root@ansible ~]# ansible node -m copy -a "src=/root/shell_1.sh dest=/root backup=yes"
在传输文件时修改文件的属主和属组信息:
[root@master ~]# ansible client -m copy -a "src=/root/ansible/shell_1.sh dest=/root owner=nobody group=nobody"
创建一个文件并直接编辑文件的信息:
[root@master ~]# ansible client -m copy -a " content='# This file was moved to /root/other.conf' dest=/root/other.conf"
file 模块
周三
file 模块可以帮助我们完成一些对文件的基本操作。比如,创建文件或目录、删除文件或目录、修改文件权限等。
常用参数:
mode #定义文件/目录的权限
group #定义文件/目录的属组
owner #定义文件/目录的属主
path #必选项,定义文件/目录的路径
recurse #递归设置文件的属性,只对目录有效
src #被链接的源文件路径,只应用于state=link的情况
dest #被链接到的路径,只应用于state=link的情况
force #需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链接,然后创建新的软链接,有两个选项:yes|no
state #状态
=directory:如果目录不存在,就创建目录
=file:即使文件不存在,也不会被创建
=link:创建软链接
=hard:创建硬链接
=touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
=absent:删除目录、文件或者取消链接文件
操作:
创建一个目录,如果目录存在,则不做任何操作。
[root@master ~]# ansible client1 -m file -a 'path=/root/work state=directory'
创建一个文件,如果文件存在,则更新文件时间,与touch命令相同
[root@master ~]# ansible client1 -m file -a 'path=/root/shell_1.sh state=touch'
创建软链接文件信息
[root@master ~]# ansible client1 -m file -a 'src=/root/shell_1.sh dest=/root/work/shell-1.sh state=link'
创建硬链接文件信息
[root@master ~]# ansible client1 -m file -a 'src=/root/shell_1.sh dest=/root/work/shell-2.sh state=hard'
删除远程文件或者是目录
[root@master ~]# ansible client1 -m file -a 'path=/root/work/shell-2.sh state=absent'
创建文件时,指定权限或者修改权限和属主
[root@master ~]# ansible client1 -m file -a 'path=/root/text1 state=touch owner=nobody mode=666'
fetch 模块
从远程主机把文件复制到ansible主机,但不支持目录
常用参数:
src #远程系统上要获取的文件。
dest #保存文件的目录,例如:dest目录是/backup,主机host.example上名为/etc/profile的src文件将保存到/backup/host.example/etc/profile。
flat #允许您覆盖将主机名/path/to/文件追加到目标的默认行为。如果dest以’/'结尾,它将使用源文件的基名,类似于copy模块。如果使用单个主机,或者检索每个主机唯一命名的文件,这可能很有用。如果使用多个具有相同文件名的主机,则每个主机的文件将被覆盖。
实例:
将/root/text1拉取到ansible管理端本地的/root目录下:
[root@master ~]# ansible client1 -m fetch -a 'src=/root/text1 dest=/root '
使用flat
[root@master ~]# ansible client1 -m fetch -a 'src=/root/text1 dest=/root/text1 flat=yes'
lineinfile模块
lineinfile 模块:类似linux工具中的sed工具,确保某一行文本存在于指定的文件中,或者确保从文件中删除指定的文本(即确保指定的文本不存在于文件中),还可以根据正则表达式,替换修改某一行文本。
常用参数:
path #必须参数,指定要操作的文件。2.3版本之前,只能使用 dest, destfile, name指定要操作的文件,2.4版本中,仍然可以使用这些参数名,这些参数名作为 path 参数的别名使用。
line #使用此参数指定文本内容。
regexp #使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
state #当想要删除对应的文本时,需要将state参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present。
insertafter #借助insertafter参数可以将文本插入到“指定的行”之后,参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
insertbefore #借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
backup #是否在修改文件之前对文件进行备份。
create #当要操作的文件并不存在时,是否创建对应的文件,两个值false和true,默认为false
实例:
向text1文件末尾添加文本
[root@client1 ~]# cat text1
hello ansible
test test
lineinfile
Shared connection to client1 close
[root@master ~]# ansible client1 -m lineinfile -a "path=/root/text1 line='test1 test1' "
再次执行,命令执行成功,结果并不会改变
[root@master ~]# ansible client1 -m lineinfile -a "path=/root/text1 line='test1 test1' "
正则表达式-删除稳重以line开头的文件
[root@master ~]# ansible client1 -m lineinfile -a "path=/root/text1 regexp='^line' state=absent"
替换test开头的行为test222,只能替换最后一行
[root@master ~]# ansible client1 -m lineinfile -a "path=/root/text1 regexp="^test" line='test222'"
replace模块
replace模块:可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被匹配到的字符串都会被替换。
常用参数
path #必须参数,指定要操作的文件,2.3版本之前,只能使用 dest, destfile, name指定要操作的文件,2.4版本中,仍然可以使用这些参数名,这些参数名作为 path 参数的别名使用。
regexp #必须参数,指定正则表达式,文件中与正则匹配的字符串将会被替换。
replace #指定最终要替换成的字符串。
backup #是否在修改文件之前对文件进行备份。
Remote 设置true为表示归档文件已经在远程系统上,而不是 Ansible 控制器的本地。选择:false ← (default)true
实例:
[root@client1 ~]# cat text1
hello ansible
test test
Shared connection to client1 close
test222
[root@master ~]# ansible client1 -m replace -a "path=/root/text1 regexp="^test" replace='test333'"
替换前备份
[root@master ~]# ansible client1 -m replace -a "path=/root/text1 regexp="^test" replace='text' backup=yes"
get_url模块
该模块主要用于从http、ftp、https服务器上下载文件(类似于wget)
常用参数:
dest #下载到哪里(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称。
url #文件的下载地址(网址)—必须
url_username #用于http基本认证的用户名
url_password #用于http基本认证的密码
validate_certs #如果否,SSL证书将不会验证。这只应在使用自签名证书的个人控制站点上使用
owner #指定属主
group #指定属组
mode #指定权限
timeout #下载超时时间,默认10s
checksum #对下载的资源进行校验,支持sha256、md5等方式,以确保其完整性
实例:
下载文件
[root@master ~]# ansible client2 -m get_url -a "url=https://mirrors.aliyun.com/openssh/ dest=/root"
archive模块
archive是压缩命令的模块
常用参数
path :需要压缩的文件或目录
dest :压缩后的文件位置
format:bz2, gz, tar, xz, zip :指定打包的类型
owner #指定属主
group #指定属组
mode #指定权限
实例:
ansible 10.1.1.60 -m archive -a 'path=/var/log dest=/tmp/system_log.tar.gz'
unarchive解压
tar -czvf exam.tar.gz example
ansible 10.1.1.60 -m unarchive -a "dest=/tmp/boysec src=test.tar.gz" # 解压远程的包到受控端
ansible 10.1.1.60 -m unarchive -a 'src=/package/test.tar.gz dest=/tmp/ copy=no' # 解压受控端本地的包到本地目录
安装模块
yum_repository
yum_repository模块管理远程主机上的yum仓库
ame :相当于.repo文件定义中括号的[仓库ID]
baseurl :相当于.repo文件中baseurl
description :相当于.repo文件中的name
file :相当于.repo文件的名称,不使用时默认以name加.repo命令
enabled=yes|no :相当于.repo文件中enabled
gpgcheck=yes|no :相当于.repo文件中gpgcheck
gpgkey :前提是gpgcheck=yes,相当于.repo文件中gpgkey,验证gpg公钥
state=present|absent :默认present,absent表示删除
实例:
创建阿里云epel源
ansible all -m yum_repository -a 'name=epel baseurl=https://mirrors.aliyun.com/epel/7/x86_64/ enabled=yes gpgcheck=no gpgcakey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7 state=present file=AlicloudEpel'
删除阿里云epel源
ansible all -m yum_repository -a 'file=AlicloudEpel name=epel state=absent'
使用yum软件包管理器安装,升级,降级,删除和列出软件包和组。
name --- 指定安装软件名称
state --- 指定是否安装软件
installed --- 安装软件
present
latest
absent --- 卸载软件
removed
latest --- 安装最新的软件
安装软件:
ansible 10.1.1.20 -m yum -a "name=iotop state=installed"
用户模块
group
远程批量创建用户组信息
gid :指定创建的组ID信息name : 指定创建组名称信息
state
absent : 删除指定的用户组
present : 创建指定的用户组
创建用户组:
ansible 10.1.1.12 -m group -a "name=boysec gid=1111"
删除用户组:
ansible 10.1.1.12 -m group -a "name=boysec gid=1111 state=absent"
user
远程批量创建用户信息
name 指定用户名信息
uid 指定用户uid信息
group 指定用户主要属于哪个组
groups 指定用户属于哪个附加组信息
shell 指定是否能够登录
create_home 是否创建家目录信息
home 指定家目录创建在什么路径默认/home
password * 设置密码时不能使用明文方式,只能使用密文方式
可以给用户设置密码还可以给用户修改密码
实例:
# 普通用法
ansible 10.1.1.60 -m user -a "name=boysec01"
# 指定用户uid信息
ansible 10.1.1.60 -m user -a "name=boysec02 uid=1111"
# 指定用户组信息
ansible 10.1.1.60 -m user -a "name=boysec03 group=boysec02"
ansible 10.1.1.60 -m user -a "name=boysec04 groups=boysec02"
# 创建虚拟用户
ansible 10.1.1.60 -m user -a "name=boysec create_home=no shell=/sbin/nologin"
# 给指定用户创建密码
# 方法一PS: 利用ansible程序user模块设置用户密码信息,需要将密码明文信息转换为密文信息进行设置
生成密文密码信息方法:[root@zabbix ]# ansible 10.1.1.60 -m debug -a "msg={{ '123456' | password_hash('sha512', 'boysec01') }}" 10.1.1.60 | SUCCESS => {
"msg": "$6$boysec01$OE3fthAQpwCRsNwaSZbFN0/CW/aJSAOVtDqK1KoyZ.IdfcfcdNSWTStWydm/pCxH3UlF0NsRngNOSsP1LvvQi."}
# 方法二
yum install -y python-pip
pip install passlib
python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"Password: $6$rJJeiIerQ8p2eR82$uE2701X7vY44voF4j4tIQuUawmTNHEZhs26nKOL0z39LWyvIvZrHPM52Ivu9FgExlTFgz1VTOCSG7KhxJ9Tqk.
ansible 10.1.1.60 -m user -a "name=boysec password='$6$rJJeiIerQ8p2eR82$uE2701X7vY44voF4j4tIQuUawmTNHEZhs26nKOL0z39LWyvIvZrHPM52Ivu9FgExlTFgz1VTOCSG7KhxJ9Tqk'"
# 删除用户
ansible 10.1.1.60 -m user -a "name=boysec02 state=absent"
service模块
用于管理服务运行状态
name: --- 指定管理的服务名称state: --- 指定服务状态
started 启动
restarted 重启
stopped 停止
enabled --- 指定服务是否开机自启动
启动服务
ansible 10.1.1.60 -m service -a "name=nfs state=started enabled=yes"
cron模块
cron模块主要用于添加、删除、更新操作系统的crontab任务计划
cron模块使用详解:
name:任务计划名称
cron_file:替换客户端该用户的任务计划的文件
minute:分(0-59, * ,*/2)
hour:时(0-23, * ,*/2)
day:日(1-31, * ,*/2)
month:月(1-12, * , */2)
weekday:周(0-6或1-7, *)
job:任何计划执行的命令,state要等于present
backup:是否备份之前的任务计划
user:新建任务计划的用户
state:指定任务计划present、absent
实例:
ansible all -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='sync time' backup=yes job='/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1'"
也可以简写
ansible all -m cron -a "minute=0 name='time1' job='/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1'" #其他默认为*
# 删除
ansible all -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='sync time' state=absent"
# 注释定时任务
ansible all -m cron -a "minute=0 name='time1' job='/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1' disabled=yes"
mount模块
用于批量管理主机进行挂载卸载操作
mount模块参数:
src: 需要挂载的存储设备或文件信息path: 指定目标挂载点目录fstype: 指定挂载时的文件系统类型
state
present/mounted --- 进行挂载
present: 不会实现立即挂载,修改fstab文件,实现开机自动挂载
mounted: 会实现立即挂载, 并且会修改fstab文件,实现开机自动挂载 *****
absent/unmounted --- 进行卸载
absent: 会实现立即卸载, 并且会删除fstab文件信息,禁止开机自动挂载
unmounted: 会实现立即卸载, 但是不会会删除fstab文件信息 *****
实例:
# 实现远程批量挂载操作
ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=present"
## 以上信息只是在/etc/fstab文件中添加了配置信息,不会真正进行挂载
ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=mounted"
## 以上信息是在/etc/fstab文件中添加了配置信息,并且也会真正进行挂载
# 卸载
ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=absent"
ansible 10.1.1.20 -m mount -a "src=10.1.1.60:/data path=/mnt/test fstype=nfs state=unmounted"
获取主机信息及调试
setup
可以用来查看远程主机的一些基本信息:
ansible 10.1.1.20 -m setup
只将主机某个信息打印出来
ansible rsync -m setup -a "filter=ansible_all_ipv4_addresses"
常用主机信息:
ansible_all_ipv4_addresses: 仅显示ipv4的信息。
ansible_devices: 仅显示磁盘设备信息。
ansible_distribution: 显示是什么系统,例:centos,suse等。
ansible_distribution_major_version: 显示是系统主版本。
ansible_distribution_version: 仅显示系统版本。
ansible_machine: 显示系统类型,例:32位,还是64位。
ansible_eth0: 仅显示eth0的信息。
ansible_hostname: 仅显示主机名。
ansible_kernel: 仅显示内核版本。
ansible_lvm: 显示lvm相关信息。
ansible_memtotal_mb: 显示系统总内存。
ansible_memfree_mb: 显示可用系统内存。
ansible_memory_mb: 详细显示内存情况。
ansible_swaptotal_mb: 显示总的swap内存。
ansible_swapfree_mb: 显示swap内存的可用内存。
ansible_mounts: 显示系统磁盘挂载情况。
ansible_processor: 显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus: 显示cpu个数(只显示总的个数)。
debug
使用 Ansible 最痛苦的就是远程命令没有生效,但又看不到报错信息,Debug 就是为了解决这个烦恼。
msg:调试输出的消息var:将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity:debug的级别(默认是0级,全部显示)
区别:
shell:
[root@ansible ~]# ansible node -m command -a 'echo 000000 | passwd --stdin admin4'
node1 | CHANGED | rc=0 >>
000000 | passwd --stdin admin4
node2 | CHANGED | rc=0 >>
000000 | passwd --stdin admin4
[root@ansible ~]# ansible node -m shell -a 'echo 000000 | passwd --stdin admin4'
node1 | CHANGED | rc=0 >>
Changing password for user admin4.
passwd: all authentication tokens updated successfully.
node2 | CHANGED | rc=0 >>
Changing password for user admin4.
passwd: all authentication tokens updated successfully.
command
[root@ansible ~]# ansible node -m command -a 'useradd admin1'
node1 | CHANGED | rc=0 >>
node2 | CHANGED | rc=0 >>
[root@ansible ~]# ansible node -m command -a 'echo 000000 | passwd --stdin admin1'
node1 | CHANGED | rc=0 >>
000000 | passwd --stdin admin1
node2 | CHANGED | rc=0 >>
000000 | passwd --stdin admin1
标准输入 --stdin
可以看到返回了命令
并更改,系统以为这一串命令是字符串,而不是特殊符号,
command只认识符号,不认识特殊字符
script
远程执行脚本
vi test.sh
#!/bin/bash
ifconfig
df -hT
[root@ansible ~]# ansible node -m script -a 'test.sh'
shell VS command
command 模块命令将不会使用 shell 执行. 因此,像 $HOME 这样的变量是不可用的。还有像<,>,,&都将不可用。
shell 模块通过shel程序执行,默认是/in/s,,,,;,&可用。但这样有潜在的 shel 注入风险
因为他不受用户环境的影响。 也很大的避免command 模块更安全,了潜在的 shel 注入风险
模块选择
两个模块都要避免使用,你应该优先考虑更具体的 ansible 模块。比如用 command 或者 shell 执行 yum 命令前,应该先了解到直接的 yum模块。使用具体模块比执行命令要优雅很多,因为这些模块设计都是具有幂等性的,并满足其他标准,如异常处理等.
I(Ansible包含众多的模块,大部分模块都能够保证操作的幂等性,即相关操作的多次执行能够达到相同结果这一特性)
如果没有更具体的模块, 相对来说 command 更安全点。
如果您需要用户环境和流式操作,则只能使用 shell 模块
Ansible-AD hoc实操案例
案例细节
1、关闭selinux、firewalld
3、删除系统自带yum
4、挂载镜像包
5、配置yum
6、安装httpd
7、更换http网页文件
8、更改服务端口号为666
9、启动httpd
10、执行,测试网页
网页文件
[root@ansible ~]# vi index.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>济南职业技术学院云计算ansible</title>
</head>
<body>
<h1>济南职业技术学院云计算ansible</h1>
</body>
</html>
评论区