Ansible功能
1、批量执行远程命令,可以对远程的多台主机同时进行命令的执行
2、批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务
3、编排高级的企业级复杂的IT架构任务, Ansible的Playbook和role可以轻松实现大型的IT复杂架构
4、提供自动化运维工具的开发API, 有很多运维工具,如jumpserver就是基于 ansible 实现自动化管理功能
Ansible架构
主机清单:Ansible管理主机的清单文件,默认为 /etc/ansible/hosts
调用模块:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
插件:模块功能的补充,如连接类型插件,循环插件,变量插件,过滤插件等,该功能不常用
API:供第三方程序调用的应用程序编程接口
Ansible安装
包安装:
apt -y install ansible (ubuntu不支持用ansuble管理rokey系统)
yum -y install ansible
pip安装:
yum -y install python39 rust
pip3 install ansible
[root@ubuntu2004 ~]#ansible --version
ansible 2.9.6
config file = /etc/ansible/ansible.cfg #配置文件
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
executable location = /usr/bin/ansible #命令
python version = 3.8.10 (default, Jun 22 2022, 20:18:18) [GCC 9.4.0] #python依赖版本
配置文件:/etc/ansible/ansible.cfg
[defaults]
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp = $HOME/.ansible/tmp #本机的临时命令执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo 用户
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass = True
#remote_port = 22
#host_key_checking = False#检查对应服务器的host_key,建议取消此行注释,实现第一次连 接自动信任目标主机 #log_path=/var/log/ansible.log #日志文件,建议启用
#module_name = command #默认模块,可以修改为shell模块
[privilege_escalation] #普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
管理主机清单:
配置文件:/etc/ansible/ansible.cfg定义了主机清单存放文件
管理主机清单:/etc/ansible/hosts
[webservers]
10.0.0.101
10.0.0.102
[appservers]
10.0.0.8
10.0.0.18
管理之前需要打通guk验证,打通脚本
管理之前需要打通guk验证
ssh-keygen 生成公钥私钥对然后拷贝过去
也可用脚本直接生成公私钥然后推送推送
ubuntu使用脚本前安装sshpass
[root@ubunt ~]# apt -y install sshpass
[root@ubunt ~]# cat ssh_key.sh
#!/bin/bash
IPLIST="
10.0.0.101
10.0.0.102
10.0.0.8
10.0.0.18"
#rpm -q sshpass &> /dev/null || yum -y install sshpass
[ -f /root/.ssh/id_rsa ] || ssh-keygen -f /root/.ssh/id_rsa -P ''
export SSHPASS=centos1
for IP in $IPLIST;do
{ sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $IP; } &
done
wait
执行完脚本查看是否打通
[root@ubunt ~]# ssh 10.0.0.18
Last login: Sun Oct 2 14:31:00 2022 from 10.0.0.1
查看被管理机器
[root@ubunt ~]# ansible all --list-hosts 全部的
hosts (4):
10.0.0.101
10.0.0.102
10.0.0.8
10.0.0.18
[root@ubunt ~]# ansible appservers --list-host 组的
hosts (2):
10.0.0.8
10.0.0.18
Ansible常用模块(ansible-doc 模块名,可查模块使用方法)
https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
列出所有模块并统计数量
[root@ubunt ~]# ansible-doc -l |wc -l
查看nginx相关模块
[root@ubunt ~]# ansible-doc -l |grep nginx
查看nginx状态页模块使用方法:
[root@ubunt ~]# ansible-doc nginx_status_info
简要使用方法
[root@ubunt ~]# ansible-doc -s nginx_status_info
1、ping模块
[root@ubunt ~]# ansible-doc -l |grep ping
用ping模块查看清单中被管理组的状态
如:[root@ubunt ~]# ansible webservers -m ping
2、command默认模块,允许后面加linux命令,可省略,但不支持通配符,可用shell模块带替,但都不支持幂等性
[root@ubunt ~]# ansible all -m command -a "sleep 100"
把默认模块设置成shell模块
vim /etc/ansible/ansible.cfg
module_name = shell
3、在远程主机上运行ansible服务器上的脚本script
script模块(在远程主机上运行ansible服务器上的脚本,不具备幂等性)
如:
[root@ubunt ~]# ansible all -m script -a 'test.sh' #写完整脚本路径
4、复制ansible服务器主控端或远程主机的文件到远程主机 copy模块
copy模块
功能:1、把ansible服务器主控端文件复制到远程主机。2、把远程主机上的文件复制到远程主机
src:控制端的源文件路径
content:源文件的内容
dest:被控制端的文件路径
owner:属主
group:属组
mode:权限
backup:是否备份
remote_src: no是默认值,表示src文件在ansible主机,yes表示src文件在远程主机 #重要的指令
范例
#如目标存在,默认覆盖,此处指定先备(没有写remote_src,表明文件在ansible主控端)
ansible webservers -m copy -a "src=/root/test1.sh dest=/tmp/test2.sh owner=wang mode=600 backup=yes"
#指定内容,直接生成目标文件
ansible webservers -m copy -a "content='fan 123456\nchao 654321\n' dest=/etc/rsync.pas owner=root group=root mode=0600"
#复制/etc目录自身,注意/etc/后面没有/
ansible webservers -m copy -a "src=/etc dest=/backup"
#复制/etc/下的文件,不包括/etc/目录自身,注意/etc/后面有/
ansible webservers -m copy -a "src=/etc/ dest=/backup"
#复制/etc/suders,并校验语法,下面的 %s 表示src指定的文件名
ansible webservers -m copy -a "src=/etc/sudoers dest=/etc/sudoers.edit remote_src=yes validate='/usr/sbin/visudo -csf'%s"
5、用于将文件从http、https或ftp下载到被管理机节点上 get_url模块
get_url模块
功能:用于将文件从http、https或ftp下载到被管理机节点上
url #下载文件的URL,支持HTTP,HTTPS或FTP协议
dest #下载到目标路径(绝对路径),如果目标是一个目录,就用原文件名,如果目标设置了名称就用目标 设置的名称 owner #指定属主
group #指定属组
mode #指定权限
force #如果yes,dest不是目录,将每次下载文件,如果内容改变替换文件.如果no,则只有在目标不存在 时才会下载 checksum #对目标文件在下载后计算摘要,以确保其完整性
#示例: checksum="sha256:D98291AC[...]B6DC7B97",
checksum="sha256:http://example.com/path/sha256sum.txt"
url_username #用于HTTP基本认证的用户名. 对于允许空密码的站点,此参数可以不使用 `url_password' url_password #用于HTTP基本认证的密码. 如果未指定`url_username'参数,则不会使用 `url_password'参数
validate_certs #如果“no”,SSL证书将不会被验证. 适用于自签名证书在私有网站上使用 timeout #URL请求的超时时间,秒为单位
范例
下载并MD5验证
ansible webservers -m get_url -a 'url=http://nginx.org/download/nginx-1.18.0.tar.gz dest=/usr/local/src/nginx.tar.gz checksum="md5:b2d33d24d89b8b1f87ff5d251aa27eb8"'
去webservers下的机器上去查看是否完成(下完不带版本号)
[root@ubuntu2004 ~]#ls /usr/local/src/
nginx.tar.gz
6、从被控制机上把文件拉到控制机上(不能拉文件夹,和copy相反)Fetch模块
Fetch模块
src #被控制端的源文件路径,只支持文件
dest #ansible控制端的目录路径
范例1:ansible all -m fetch -a 'src=/etc/os-release dest=/data/os'(目录无需创建,自动生成)
范例2:打包 ansible all -a 'tar cf /root/etc.tar /etc'
拉到控制端 ansible all -m fetch -a 'src=/root/etc.tar dest=/data/'
7、修改文件属性,创建文件、目录和软链接等 file模块
file模块
path #在被控端创建的路径 (和dest,name功能相同)
owner #属主
group #属组
mode #权限
recurse #yes表示递归授权
state #状态
=touch #创建文件
=directory #创建目录
=link #软链接
=hard #硬链接
src #创建软硬链接时,指定源文件
absent #删除
范例:创建文件夹
[root@ubunt ~]# ansible all -m file -a 'path=/data/ state=directory'
创建文件(如果没有文件夹,会失败)
[root@ubunt ~]# ansible all -m file -a 'path=/data/test.txt state=touch'
创建软链接(对/etc/hosts创建软连接为/data/hosts.links)
[root@ubunt ~]# ansible all -m file -a 'src=/etc/hosts dest=/data/hosts.links state=link'
删除软链接
[root@ubunt ~]# ansible all -m file -a 'path=/data/hosts.links state=absent'
递归修改目录属性,但不递归至自目录
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"
递归修改目录及自目录的属性
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql recurse=yes"
8、检查文件或文件系统的状态 stat模块
stat模块
path #文件/对象的完整路径(必须)
范例:ansible 127.0.0.1 -m stat -a 'path=/etc/passwd'
9、解包解压缩 unarchive模块
unarchive模块
将ansible主机上的压缩包传到远程主机后解压至特定目录,设置remote_src=no,此为默认值,可省略
将远程主机上或非ansible的其他主机的某个压缩包压缩到远程主机本机的指定路径下,需要设置remote_src=yes
remote_src #和copy功能一样且选项互斥,yes表示源文件在远程被控主机或其它非ansible的其它主机上如网上,no表示文件在ansible主机上,默认值为no, 此选项代替copy选项
copy #默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no, 会在远程主机上寻找src源文件,此选项已废弃
src #源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果 是远程主机上的路径,则需要设置remote_src=yes
dest #远程主机上的目标路径
owner #默认递归
group #默认递归
mode #设置解压缩后的文件权限,默认递归
creates=/path/file #当绝对路径/path/file不存在时才会执行
范例:把互联网上的包直接下载解包(要求被控制端需要有账号,存放目录需提前存在)
ansible all -m unarchive -a 'src=https://nginx.org/download/nginx-1.20.2.tar.gz dest=/data remote_src=yes owner=wang group=wang'
[root@ubuntu2004 ~]#ls /data/
nginx-1.20.2 test.txt
10、打包压缩保存在被管理节点 Archive模块
Archive 模块
path #需要压缩的文件或目录
dest #压缩后的文件
format #压缩格式,支持gz,bz2,xz,tar,zip
范例:
ansible webservers -m archive -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=wang mode=0600'
11、管理主机名 Hostname模块
Hostname 模块
name #修改后的主机名称
范例:
ansible 10.0.0.8 -m hostname -a 'name=web1'
12、计划任务 cron模块
cron 模块
支持时间:minute,hour,day,mouth,weekday
name #描述脚本的作用
minute #分钟
hour #小时
day #日
mouth #月
weekday #周
user #任务由哪个用户运行;默认root
job #任务
范例:
备份数据库脚本(需要提前把脚本放在被管理机上)
[root@centos8 ~]#cat /root/mysql_backup.sh
#!/bin/bash
mysqldump -A -F --single-transaction --master-data=2 -q -uroot |gzip> /data/mysql_`date +%F_%T`. sql.gz
创建任务
ansible 10.0.0.8 -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup mysql" job=/root/mysql_backup.sh'
查看任务:
[root@RS1 ~]#crontab -l
#Ansible: backup mysql
30 2 * * 1-5 /root/mysql_backup.sh
禁用计划任务(disabled=yes,启用disabled=no,删除state=absent)
ansible 10.0.0.8 -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup mysql" job=/root/mysql_backup.sh disabled=yes'
[root@RS1 ~]#crontab -l
#Ansible: backup mysql
#30 2 * * 1-5 /root/mysql_backup.sh
13、软件管理包 yum和apt模块
yum和apt模块
name #软件包名称
state #状态
=present #安装,此为默认值
=absent #删除
=latest #最新版
list #列出指定包 enablerepo #启用哪个仓库安装
disablerepo #不使用哪些仓库的包
exclude #排除指定的包
validate #是否检验,默认为yes
范例:
[root@ubunt ~]# ansible 10.0.0.102 -m apt -a 'name=apache2 state=present' #安装
[root@ubunt ~]# ansible 10.0.0.102 -m apt -a 'name=apache2 state=absent autoremove=yes purge=yes' #卸载
14、实现yum仓库配置管理 yum_repository模块
yum_repository 模块
name #仓库id
description #仓库描述名称,对应配置文件中的name=
baseurl #仓库的地址
gpgcheck #验证开启
gpgkey #仓库公钥路径
state
范例:创建zabbix agent仓库
ansible 10.0.0.8 -m yum_repository -a 'name=zabbix description="zabbix repo" baseurl="https://mirrors.aliyun.com/zabbix/zabbix/6.0/rhel/$releasever/$basearch /" gpgcheck=no'
删除zabbix agent仓库
ansible 10.0.0.8 -m yum_repository -a 'name=zabbix state=absent'
15、管理服务service(与systemd功能相似)
name #服务名称
state #服务状态
=started #启动
=stopped #停止
=restarted #重启
=reloaded #重载
enabled #开启自启动,yes开机启动,no开机不启动
daemon_reload #加载新的配置文件,适用于systemd模块
范例:[root@ubunt ~]# ansible 10.0.0.8 -m service -a 'name=apache2 state=started' #启动
[root@ubunt ~]# ansible 10.0.0.102 -m apt -a 'name=apache2 enabled=yes' #开机启动
16、管理用户 user模块
user 模块
name #创建的名称
uid #指定uid
group #指定基本组
shell #登录shell类型默认/bin/bash
create_home #是否创建家目录,默认会创建家目录,no不创建
password #设定对应的密码,必须是加密后的字符串才行,否则不生效
system #yes表示系统用户
groups #附加组
append #追加附加组使用,yes表示增加新的附加组
state #absen删除
remove #yes表示删除用户时将家目录一起删除
generate_ssh_key #创建私钥
ssh_keyu_bits #私钥位数
ssh_key_file #私钥文件路径
范例:
创建用户
[root@ubunt ~]# ansible all -m user -a 'name=nginx comment=nginx uid=88 group=nginx
groups="root,daemon" shell=/sbin/nologin system=yes create_home=no home=/data/nginx non_unique=yes'
删除用户(#remove=yes表示删除用户及家目录等数据,默认remove=no)
[root@ubunt ~]# ansible all -m user -a 'name=nginx state=absent remove=yes'
17、管理组 group模块
group 模块
name #指定组名称
gid #指定gid
state
= #创建,默认
= #删除
system #是否是系统组
范例:
创建组:
ansible all -m group -a 'name=nginx gid=88 system=yes'
删除组:
ansible all -m group -a 'name=nginx state=absent'
18、修改一行的文件内容 lineinfile模块(类似于sed)
path #被控端文件的路径
regexp #正则匹配语法格式,表示被替换的内容
line #替换为的内容
state #absent表示删除
insertafter insertbefore #插入到替换内容后面,如和regexp同时存在,只在没找到与regexp匹配时才使用
backrefs #支持后面引用,yes和no
backup #修改前先备份
create #如果文件不存在,则创建,默认不存在会出错
mode #指定权限
owner #指定用户
group #指定组
#注意
regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除.
范例:
修改监听端口
ansible webservers -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen' line='Listen 8080'"
修改SELinux
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"
19、多行修改替换 replace模块
replace模块 基于正则进行匹配和替换
path #被控端文件的路径
regexp #正则匹配语法格式,表示被替换的内容
replace #替换为的内容
after #插入到替换内容前面
before #插入到替换内容后面
backup #修改前先备份
mode #指定权限
owner #指定用户
group #指定组
范例:
ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'" ansible all -m replace -a "path=/etc/fstab regexp='^#(UUID.*)' replace='\1'"
20、管理SELinux策略 cat /etc/selinux/config
三种状态 enforcing,开启安全加固策略。permissive,报警但不阻止。disabled,关闭
policy #指定SELINUXTYPE=targeted
state #指定SELINUX=disabled
范例:ansible 10.0.0.8 -m selinux -a 'state=disabled' 只支持修改成disabled策略
21、重启 reboot模块
reboot 模块
msg #重启提示
pre_reboot_delay #重启前延迟时间的秒数
post_reboot_delay #重启后延迟时间的秒数后,再验证系统正常启动
reboot_timeout #重启后延迟时间再执行测试成功与否的命令
test_command #执行测试成功与否的命令
范例:修改SELinux策略后重启
ansible 10.0.0.8 -m reboot
22、挂载和卸载系统 mount模块
mount 模块
src #源设备路径,或网络地址
path #挂载至本地哪个路径下
fstype #设备类型;
nfs opts #挂载的选项
state #挂载还是卸载
=present #永久挂载,但没有立即生效
=absent #卸载临时挂载,并删除永久挂载
=mounted #永久和临时挂载
=unmounted #临时卸载
范例
修改fstab文件永久挂载,但不会立即生效
mount webservers -m mount -a 'src="UUID=b3e48f45-f933-4c8e-a700-22a159ec9077" path=/home fstype=xfs opts=noatime state=present'
取消临时挂载
mount webservers -m mount -a 'path=/home fstype=xfs opts=noatime state=unmounted'
永久挂载,并立即生效
ansible webservers -m mount -a 'src=10.0.0.8:/data/wordpress path=/var/www/html/wp-content/uploads opts="_netdev" state=mounted'
永久挂载,并立即生效
ansible webservers -m mount -a 'src=10.0.0.8:/data/wordpress path=/var/www/html/wp-content/uploads fstype=nfs state=absent'
23、收集主机的系统信息,可用gather_facts:no来禁止Ansible收集facts信息
setup 模块
filter 指定过滤条件
范例
ansible all -m setup(默认收集所有信息)
ansible all -m setup -a 'filter=ansible_processor_vcpus' 只找出cpu
还可以取IP
ansible all -m setup -a 'filter=ansible_all_ipv4_addresses'
24、输出信息,并且通过msg定制输出信息内容,功能类似于echo命令
debug 模块
msg #指定命令输出的信息
var #指定变量名,和msg互斥
verbosity #详细度
范例:没有指定命令输出的信息默认输出"Hello world"
ansible 10.0.0.8 -m debug
25、修改内核参数 sysctl 模块(内核优化)
sysctl 模块
name #内核参数
value #指定值
state #是否保存在sysctl.conf文件中,默认present
sysctl_set #使用sysctl -w验证值生效
范例:
26、管理资源限制 pam_limits模块
- name: Change Limit /etc/security/limit.conf
pam_limits:
domain: "*"
limit_type: "{{ item.limit_type }}"
limit_item: "{{ item.limit_item }}"
value: "{{ item.value }}"
loop:
- { limit_type: 'soft', limit_item: 'nofile',value: '100000' }
- { limit_type: 'hard', limit_item: 'nofile',value: '10000' }
标签:10.0,Ansible,src,安装,etc,ansible,模块,root
From: https://blog.51cto.com/mfc001/6405564