二Ansible基础之模块篇
Posted 锦书致南辞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二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.144
和192.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
确保安装,且升级为最新 -
absent
和removed
确认已经删除
练习
- 安装一个软件包
[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|noname
必选项,服务名称,比如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,默认是nostate
删除组 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
指定用户的shellcomment
用户的描述信息create_home
在创建用户时,是否创建其家目录。默认创建,假如不创建,设置为nogroup
设置用户的主组groups
将用户加入到多个其他组中,可以用逗号隔开。默认会把用户从其他已经加入的组中删除append
yes|no 和groups配合使用,yes时,不会把用户已经加入的其他组删除system
设置为yes时,将会创建一个新的系统账号expires
设置用户过期时间,值为时间戳,会转为多少天后,放在shadow的第八个字段里generate_ssh_key
设置成yes将会为用户产生秘钥,不会覆盖原来的秘钥ssh_key_type
指定用户的秘钥类型,默认rsa,具体的类型取决于被管理的节点state
删除或者添加用户,present为添加,absent为删除,默认为presentremove
当与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"
Ansible安装部署和模块之基础篇
Anasible 是基于Python2-Paramiko 模块开发的自动化维护工具,实现了批量系统配置、部署、运行等功能。Ansible是基于模块工作的,本身不具备批量部署的功能,如果想要实现批量自动化部署,是Ansible自身的各种模块的集合。
可以与 Ansible 同台竞技的运维工具( pupet、cfengine、chef、func、fabric、saltstack )
- Ansible 发展史
- ansible 作者:
Michael DeHaan
同时他也是 Cobbler 与 Func
作者。 - 2012-03-09 发布 0.0.1 版本。
- 2015-10-17 被
Red Hat
收购。 - GitHub
- ansible 特性
- Python 开发
- 模块化: 调用特定的模块(如: Paramiko、PyYAML、jinja2 等), 完成特定的任务。
- 自定义模块
- 简单部署
- 支持编排任务(PlayBook)
- 冥等性: 任务重复执行等于只执行一次, 不会重复执行多次相同命令。
- 支持多语言编写模块
- YAML 格式编排任务,支持丰富的数据结构.
Ansible 架构与执行流程
ansible-arch
ansible-flow
ansible
主要组成部分:
- Users: 管理 Ansible Playbook 和 Ansible 引擎。
- Ansible playbook: Ansible 引擎和CMDB做交互。
- Public or Private cloud: 便于所有模块 和 API 以及云的交互。
- Inventory: Ansible 执行主机的列表清单,默认读取配置为/etc/ansible/hosts。
- API: 提供端到端交互的API接口。
- Modules: Ansible 执行命令的功能模块, 一般为 Ansible 内置模块, 也可以自定义第三方模块。
- Plugins: 用于补充模块的功能,可以自行编写插件。
Ansible 安装
# Centos
yum -y install ansible
# Ubuntu
apt install -y ansible
# 源码安装
git clone https://github.com/ansible/ansible
# 使用 pip 命令安装
pip install ansible
Ansible 配置说明:
/etc/ansible/ansible.cfg
主配置文件, 配置ansible
的工作特性.
/etc/ansible/hosts
主机列表清单.
/etc/ansible/roles/
存放(roles)角色的目录.
/usr/local/bin/ansible
二进制执行文件, ansible
主程序.
/usr/local/bin/ansilbe-doc
配置文档, 模块功能查看工具.
/usr/local/bin/ansible-galaxy
用于上传/下载 roles
模块到官方平台的工具.
/usr/local/bin/ansible-playbook
自动化任务、编排剧本工具/usr/bin/ansible-pull
远程执行命令的工具.
/usr/local/bin/ansible-vault
文件(如: playbook 文件) 加密工具.
/usr/local/bin/ansible-console
基于 界面的用户交互执行工具.
/etc/ansible/hosts
创建SSH秘钥
ssh-keygen -t rsa -C "deniss.wang"
拷贝公钥到其他被服务器
ssh-copy-id -i ubuntu@ubuntu20-bj01
hosts
[codo-cluster]
demo.opendevops.cn ansible_ssh_user=root
www.opendevops.cn ansible_ssh_user=root
[k3s-cluster]
ubuntu20-bj01 ansible_user=ubuntu
ubuntu20-bj02 ansible_user=ubuntu
ubuntu20-bj03 ansible_user=ubuntu
ubuntu20-sh04 ansible_user=ubuntu
-m
指定模块执行。如:ping、yum、copy、file等,此处使用模块ping测试。
-k
使用米玛方式,默认是使用SSH-KEY登录。
基本示例:
# ansible 通过 单主机进行操作 ( -k 为用户米玛方式, 默认为 ssh-key )
ansible 10.0.8.2 -m ping -k
# ansible 通过 : 组合进行操作
ansible "10.0.8.2:10.0.8.3" -m ping -k
# ansible 通过 通配符加主机 进行操作
ansible 10.0.8.* -m ping -k
# ansible 通过 hosts 组名称 进行操作
ansible codo -m ping -k
# ansible 通过 : 组合组进行操作
ansible codo-cluster:k3s-cluster -m ping -k
# ansible 通过 通配符 进行操作
ansible *-cluster -m ping -k
# ansible 通过 :& 逻辑与 (两个组中都包含的主机)
ansible codo-cluster:&k3s-cluster -m ping -k
# ansible 通过 :! 逻辑非 (codo-cluster 但不在 k3s-cluster的主机)
ansible codo-cluster:!k3s-cluster -m ping -k
# ansible 也支持多逻辑的组合
ansible webservers:dbserver:&appserver:!ftpservers -m ping -k
# ansible 也支持正则表达式
ansible ~(codo|k3s)-cluster -m ping -k
# ansible 通过 all 对 hosts 清单下所有主机进行操作
ansible all -m ping -k
# ansible 通过 通配符 对 hosts 清单下所有主机进行操作
ansible * -m ping -k
执行结果:
# ansible k3s -m ping
ubuntu20-bj03 | SUCCESS =>
"ansible_facts":
"discovered_interpreter_python": "/usr/bin/python"
,
"changed": false,
"ping": "pong"
ubuntu20-bj02 | SUCCESS =>
"ansible_facts":
"discovered_interpreter_python": "/usr/bin/python"
,
"changed": false,
"ping": "pong"
ubuntu20-bj01 | SUCCESS =>
"ansible_facts":
"discovered_interpreter_python": "/usr/bin/python"
,
"changed": false,
"ping": "pong"
ubuntu20-sh04 | SUCCESS =>
"ansible_facts":
"discovered_interpreter_python": "/usr/bin/python"
,
"changed": false,
"ping": "pong"
/etc/ansible/ansible.cfg
# defaults 为默认配置
[defaults]
# 主机清单的路径, 默认为如下
# inventory = /etc/ansible/hosts
# 模块存放的路径
# library = /usr/share/my_modules/
# utils 模块存放路径
# module_utils = /usr/share/my_module_utils/
# 远程主机脚本临时存放目录
# remote_tmp = ~/.ansible/tmp
# 管理节点脚本临时存放目录
# local_tmp = ~/.ansible/tmp
# 插件的配置文件路径
# plugin_filters_cfg = /etc/ansible/plugin_filters.yml
# 执行并发数
# forks = 5
# 异步任务查询间隔 单位秒
# poll_interval = 15
# sudo 指定用户
# sudo_user = root
# 运行 ansible 是否提示输入sudo米玛
# ask_sudo_pass = True
# 运行 ansible 是否提示输入米玛 同 -k
# ask_pass = True
# 远程传输模式
# transport = smart
# SSH 默认端口
# remote_port = 22
# 模块运行默认语言环境
# module_lang = C
# roles 存放路径
# roles_path = /etc/ansible/roles
# 不检查 /root/.ssh/known_hosts 文件 建议取消
# host_key_checking = False
# ansible 操作日志路径 建议打开
# log_path = /var/log/ansible.log
ansible执行过程
- load配置文件 /etc/ansible/ansible.cfg
- Load 模块配置文件
- 通过 Ansible 将调用的模块或PlayBook生成对应的临时 py文件, 并将该临时文件传输至远程服务器的对的执行用户目录下
$HOME/.ansible/tmp/ansible-tmp-2123/xxxxxxx.py
>文件. - 对生成的文件添加可执行权限.
- 执行生成文件,并返回对应的结果.
- 删除生成文件,退出.
执行返回状态:
- 绿色:执行成功,无更改操作。如 ping模块
- 黄色:执行成功,更新过主机的操作。如执行shell模块执行ifconfig命令。
- 红色:执行失败返回结果。如FAILED、UNREACHABLE状态。
Ansible-Doc
显示帮助信息
使用参数:
-l --list
显示可用模块
-s --snippet
显示指定模块的 playbook
阶段
Demo
# Demo
ansible-doc -l
# ...略过
ansible-doc ping
# 模块ping显示文档
ansible-doc -s ping
Ansible
ansible <host-pattern> [-m module_name] [-a args]
-
host-pattern
: 主机ip、主机名、主机组。 -
module_name
: 模块的名称。默认为 -m command
。 -
args
: 模块的参数, 需要加上 -a
进行指定模块的参数。如: `ansible all -a ‘hostname’ -
-v、-vv、-vvv
: 显示详细的命令输出日志, v 越多越详细。如: ansible all -m ping -vvv
-
--list
: 显示主机的列表。如: ansible all --list
-
-k / --ask-pass
: 提示输入ssh连接米玛, 默认为 ssh-key 认证。如: ansible all -m ping -k
-
-K / --ask-become-pass
: 提示输入 sudo 的米玛。 -
-C / --check
: 检查命令操作, 并不会执行。如: ansible all -m ping -C
-
-T / --timeout
: 执行命令的超时时间, 默认为 10s。如: ansible all -m ping -T=2
-
-u / --user
: 执行远程操作的用户. 如: ansible all -m ping -u=root
-
-b / --become
: 代替旧版的 sudo
切换。
ansible 常用模块
截止 2021-10-12 ansible 模块为 6006 个. 不可谓不强大!人生苦短,我用Python!
command 模块
在远程主机上执行命令, 支持条件判断. ansible 默认模块, 可忽略 -m
参数直接操作.
注意: command
模块 不支持 $VARNAME
<
>
|
;
&
等符号.
Demo
# 停止docker服务
ansible k3s-cluster -m command -a systemctl stop docker
# 查看所有docker镜像
ansible k3s-cluster -a docker ps -a
# 如果 /opt/ansible 不存在 就不执行 df -h 操作, 如果 /opt/ansible 存在, 就执行 df -h 操作.
ansible k3s-cluster -a removes=/mnt/ansible df -h
# 如果 /opt/ansible 不存在 就执行 df -h 操作, 如果存在 /opt/ansible 就不执行 df -h 操作.
ansible k3s-cluster -a creates=/mnt/ansible df -h
# 切换目录, 等同于 cd /mtn && ls -lt 操作
ansible k3s-cluster -a chdir=/mnt ls -lt
shell 模块
shell
模块: shell 模块支持 command 所有的操作, 而且支持 $VARNAME
<
>
|
;
&
等符号操作.
Demo:
# 查看docker进程
ansible k3s-cluster -m shell -a ps -ef|grep docker
scripts 模块
script
模块: 执行脚本. 只需要调用 ansible 的宿主机存放的脚本文件就可以在选择主机上面执行脚本.
Demo
# shell
cat /tmp/deniss.sh
#!/bin/bash
echo "测试 shell"
ansible k3s-cluster -m script -a /tmp/deniss.sh
# python
cat /tmp/deniss.py
#!/usr/bin/python
import sys
print (Deniss_Wang )
print (sys.version)
ansible k3s-cluster -m script -a /tmp/deniss.py
# 其他脚本也是可以的,只需要配置好环境语言解释即可。
copy 模块
copy
模块: 复制ansible宿主机文件到目标主机.
Demo
# src="" 宿主机路径 dest="" 目标主机路径 backup=yes 如果目标主机文件存在, 会备份, 再覆盖.
ansible k3s-cluster -m copy -a ‘src=/tmp/deniss.py dest=/tmp/deniss.py backup=yes
# mode="" 修改权限, owner="" 修改用户, group="" 修改用户组
ansible k3s-cluster -m copy -a src=/root/deniss.py dest=/root/deniss.py mode=0644 owner=deniss group=deniss
# content="" 将内容写入到目标文件中
ansible k3s-cluster -m copy -a content="hello\\nworld\\n" dest=/tmp/deniss.txt
Fetch 模块
fetch
模块: 将目标远程主机的文件, 下载到本地, 下载成功会存放在以 IP/NAME的目录中, 包含原文件的整体路径.
注意:只能下载单个文件, 不支持目录, 想下载完整路径,可以压缩后在下载。
Demo
# src="" 目标远程主机的文件路径 dest="" 本地目录
ansible k3s-cluster -m fetch -a src=/var/log/syslog dest=/tmp/
file 模块
file
模块: 操作远程目标主机的文件. 如: touch
、 absent
等.
Demo
# mode="" 修改权限 owner="" 修改用户 group="" 修改用户组 recurse=yes 递归授权
ansible k3s-cluster -m file -a name=/tmp/deniss.txt owner=ubuntu group=ubuntu mode=0755 recurse=yes
# dest、name、path: 指定远程主机的文件路径,state: 文件操作类型,默认为 absent,touch: 创建空文件.
ansible k3s-cluster -m file -a name=/tmp/deniss.txt state=touch
# directory: 创建文件夹, absent: 递归删除文件夹/文件,link: 创建软连接.
ansible k3s-cluster -m file -a src=/tmp/deniss.txt dest=/tmp/deniss.link state=link
Cron 模块
cron
模块: 为远程主机添加定时任务
-
day
: 表示 天. 支持 ( 1-31, *, */2 ) 写法 -
hour
: 表示 小时. 支持 ( 0-23, *, */2 ) 写法 -
minute
: 表示 分钟. 支持 ( 0-59, *, */2 ) 写法 -
month
: 表示 月. 支持 ( 1-12, *, */2 ) 写法 -
weekday
: 表示 星期. 支持 ( 0-6, Sunday-Saturday, * )写法 -
job
: 表示 计划任务的内容. -
name
: 表示 计划任务名称. 相同的计划任务名称会覆盖.
Demo
# day: 表示 天. 支持 ( 1-31, *, */2 ) 写法
# hour: 表示 小时. 支持 ( 0-23, *, */2 ) 写法
# minute: 表示 分钟. 支持 ( 0-59, *, */2 ) 写法
# month: 表示 月. 支持 ( 1-12, *, */2 ) 写法
# weekday: 表示 星期. 支持 ( 0-6, Sunday-Saturday, * )写法
# job: 表示 计划任务的内容.
# name: 表示 计划任务名称. 相同的计划任务名称会覆盖.
ansible k3s-cluster -m cron -a weekday=1-5 job="echodate>> /tmp/1.txt" name=echocron
# disabled= (true/false、yes/no)注释掉计划任务 关闭、启动计划任务 必须指定job和name.
ansible k3s-cluster -m cron -a disabled=true job="echodate>> /root/1.txt" name=echocron
# state=absent 删除计划任务。
ansible k3s-cluster -m cron -a name=echocron state=absent
Yum 模块
yum
模块: 利用 yum 操作软件包, 如 安装、查询、卸载等.
Demo
# name: 软件包的名称, 或者rpm包, 远程服务器必须存在 rpm 包. 安装多个软件使用 ,号隔开. 如 name=nginx,php,mysql
# state="present/installed/absent/removed"
# present、installed: 安装软件.
# absent、removed: 卸载/删除软件.
# update_cache=yes: 更新 yum 缓存后 在安装软件 disable_gpg_check=yes: 禁用 gpg 检查.
ansible k3s-cluster -m yum -a name=mysql state=present
ansible k3s-cluster -m yum -a name=/tmp/nginx-xx.x.x-x.x.x86_64.rpm
ansible k3s-cluster -m yum -a name=nginx update_cache=yes disable_gpg_check=yes
# list="updates/installed/available/repos" 指定获取状态
# 状态释义: installed: 已安装的软件 updates: 可以升级的软件 available: 可以安装的软件 repos: yum 源
ansible k3s-cluster -m yum -a list=installed
Service 模块
service
: 软件服务管理模块. 启动、关闭、重启 等操作.
# name="",安装名字
# state="started/stopped/restarted/reloaded" 启动、停止、重启、重载
# enable="yes/no、true/false" 设置是否开机自启
ansible k3s-cluster -m service -a name=nginx state=started enabled=yes
User 模块
user
: 管理系统用户的模块
Demo
# name"" 用户名
# shell="" 指定用户的shell类型
# system="yes/no" 指定是否为 系统用户
# home="" 指定用户额外的home目录, 默认/home/user .
# groups="" 用户额外的 groups 组.
# uid="" 指定用户的UID.
# comment="" 用户描述
ansible k3s-cluster -m user -a name=deniss shell=/sbin/nologin system=yes home=/tmp/deniss groups=root uid=777 comment="deniss user"
# state="present/absent"
# present: 创建用户 (默认为present) absent: 删除用户
ansible k3s-cluster -m user -a name=deniss state=absent remove=yes
ansible k3s-cluster -m user -a name=nginx state=absent remove=yes
Group 模块
group
: 管理系统用户组的模块.
Demo
# name"" 用户名
# system="yes/no" 指定是否为 系统用户
# home="" 指定用户额外的home目录, 默认/home/user .
# gid="" 指定GID.
# state="present/absent"
# present: 创建用户组 (默认为present) absent: 删除用户组
# 创建
ansible all -m group -a name=deniss system=yes gid=777
# 删除
ansible all -m group -a name=deniss state=absent
ansible-galaxy
官网 https://galaxy.ansible.com/
ansible-galaxy 工具用于下载对应的roles
# list 查看本地的 roles 角色。
ansible-galaxy list geerlingguy.nginx
# install 下载 roles 角色存放到$HOME/.ansible/roles/目录下。
ansible-galaxy install geerlingguy.nginx
# remove 删除已下载的 roles 角色,也可以在存放目录中删除。
ansible-galaxy remove geerlingguy.nginx
以上是关于二Ansible基础之模块篇的主要内容,如果未能解决你的问题,请参考以下文章