1.Ansible基本概述

Ansible是一个IT自动化的配置管理工具,自动化主要体现在Ansible集成了丰富模块,丰富的功能组件,
可以通过一个命令行完成一系列的操作。进而能减少我们重复性的工作和维护成本,以提高工作的效率。

2.Ansible的功能

1)批量执行远程命令,可以对N多台主机同时进行命令的执行
2)批量配置软件服务,可以进行自动化的方式配置和管理服务。
3)实现软件开发功能,jumpserver底层使用ansble来实现的自动化管理0
4)编排高级的IT任务,Ansible的playbook是一门编程语言,可以用来描绘一套IT架构。

3.Ansible的特点

1.容易学习,无代理模式,不像saltstack既要学服务端又要学习客户端,还要学习服务端与客户端之间的通讯协议
2.操作灵活,体现在Ansible有较多的模块,提供了丰富的功能,playbook则提供了类似于编程语言的复杂功能
3.简单易用,体现在Ansible —个命令可以完成很多事情
4.安全可靠,因为Ansible使用了SSH协议进行通汛,既稳定又安全
5.可移植性高,可以将写好的playbook拷贝至任意机器进行执行

4.Ansible 基础架构

控制端 被控端 inventory ad-hoc playbook 连接协议

5.Ansible的安全配置

2.1.Ansible安装

外网地址 内网地址 角色
10.0.0.61 172.16.1.61 Ansible控制端
10.0.0.7 172.16.1.7 Ansible被控端
10.0.0.8 172.16.1.8 Ansible被控端

1.先安装epel源(提供最新的ansible)

[root@cheng ~]#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

2.安装Ansible

1.通过yum进行安装
[root@manager ~]# yum install ansible -y 2.查看ansible的版本
[root@manager ~]# ansible --version
ansible 2.8.5
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Jun 20 2019, 20:27:34) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

3.ansible的配置文件,配置文件可以随意放,但有查找顺序

$ANSIBLE_CONFIG
ansible.cfg #当前目录下面查找
.ansible.cfg #当前用户的家目录下查找
/etc/ansible/ansible.cfg [root@m01 ~]# cat /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口
host_key_checking = False #跳过检查主机指纹
log_path = /var/log/ansible.log #ansible日志 [privilege_escalation] #如果是普通用户则需要配置提权
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

4.ansible 优先级验证

[root@manager ~]# export
ANSIBLE_CONFIG="/tmp/ansible.cfg"
[root@manager ~]# touch /tmp/ansible.cfg [root@manager ~]# mkdir /project1
[root@manager ~]# cd /project1/
[root@manager project1]# touch ansible.cfg
[root@manager project2]# ansible --version
ansible 2.8.5
config file = /project1/ansible.cfg [root@manager /]# mkdir /project2
[root@manager /]# cd /project2/
[root@manager project2]# touch ansible.cfg
[root@manager project1]# ansible --version
ansible 2.8.5
config file = /project2/ansible.cfg [root@manager tmp]# touch ~/.ansible.cfg
[root@manager tmp]# ansible --version
ansible 2.8.5
config file = /root/.ansible.cfg

6.Ansible Ineventory主机清单

1.场景一:基于ip+密码连接

[root@manager project1]# cat hosts
#方式一、主机+端口+密码
[webservers]
172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
172.16.1.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456' #方式二、主机+端口+密码
[webservers]
web[1:2].cheng ansible_ssh_pass='123456' #方式三、主机+端口+密码
[webservers]
web[1:2].cheng
[webservers:vars]
ansible_ssh_pass='123456'

2.场景二:基于密钥连接,需要先创建公钥和私钥,并下发公钥至被控端

1.先创建公钥和私钥
[root@manager project1]# ssh-keygen -C manger@qq.com
2.下发公钥至被控端
[root@manager ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub
root@172.16.1.7
[root@manager ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub
root@172.16.1.8 #方式一、主机+端口+密钥
[root@manager ~]# cat hosts
[webservers]
172.16.1.7
172.16.1.8 #方式二、别名+主机+端口+密钥
[webservers]
web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=22
web02 ansible_ssh_host=172.16.1.8 ansible_ssh_port=22

3.场景三:主机组使用方式

[lbservers] #定义lbservers组
172.16.1.5
172.16.1.6
[webservers] #定义webserver组
172.16.1.7
172.16.1.8
[servers:children] #定义servers组包括两个子组
[lbservers,webserver]
lbservers
webserver [root@manager project1]# ansible webservers --list-hosts -i hosts
hosts (2):
172.16.1.7
172.16.1.8 PS:如果控制端和被控制端第一次通讯,需要先添加指纹信息,那如果机器特别多少的情况下怎么办?
仅需开启ansible中的 host_key_checking = False

7.Ansible Ad-Hoc

1.常用模块

command 		#执行命令  默认 不支持管道
shell #执行命令 支持管道
yum_reposity #yum仓库配置
yum #yum安装软件
get_url #和linux的wget一致
copy #拷贝配置文件
service|systemd #启动服务
user #属主
group #属组
file #创建目录 创建文件 递归授权
mount #挂载
cron #定时任务
firewalld #防火墙
selinux #selinux

2.使用过程中需要先了解ansible-doc帮助手册

[root@manager project1]# ansible-doc -l        # 查看所有模块说明
[root@manager project1]# ansible-doc copy # 表示指定模块方法
[root@manager project1]# ansible-doc -s copy # 表示指定模块参数

3.command默认执行bash命令模块,模块不支持重定向或管道

ansible webservers -a "ps axu|grep nginx" -i hosts #不支持管道(简单命令)

4.shell模块,如果需要一些管道操作,则使用shell

ansible webservers -m shell -a "ps axu|grep nginx" -i hosts #支持管道

5.yum安装软件模块

yum:
state:
present 安装
absent 卸载
latest 最新
enablerepo #指定使用按个仓库
disablerepo #排除使用哪个仓库 1.安装最新的httpd服务
[root@manager project1]# ansible webservers -m yum -a "name=httpd state=latest disablerepo=webtatic-php" -i hosts 2.移除httpd服务
[root@manager project1]# ansible webservers -m yum -a "name=httpd state=absent disablerepo=webtatic-php" -i hosts 3.安装httpd指定从按个仓库安装
- name: install the latest version of Apache from
the testing repo
[root@manager project1]# ansible webservers -m yum -a "name=httpd state=latest enablerepo=testing" -i hosts 4.通过URL方式进行安装
[root@manager project1]# ansible webservers -m yum -a "name=https://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-agent-3.0.0-1.el7.x86_64.rpm state=present disablerepo=webtatic-php" -i hosts - name: install nginx rpm from a local file (软件包必须在被控端主机)
5.在本地做软件升级操作
[root@manager project1]# ansible webservers -m yum -a "name=/root/zabbix-agent-4.0.0-2.el7.x86_64.rpm state=present disablerepo=webtatic-php" -i hosts

6.copy文件拷贝模块

copy:
src #本地路径,可以是相对,可以是绝对
dest #目标位置
owner #属主
group #属组
mode #权限
backup #备份 1.拷贝文件至被控节点【前提必须在控制端准备好对应的文件】
[root@manager project1]# ansible webservers -m copy -a "src=./file/ansible.cheng.com.conf dest=/etc/nginx/conf.d/ansible.cheng.com.conf owner=root group=root mode=644" -i hosts 2.对远端已有文件进行备份,按照时间信息备份【控制端可作修改】
[root@manager project1]# ansible webservers -m copy -a "src=./file/ansible.cheng.com.conf dest=/etc/nginx/conf.d/ansible.cheng.com.conf owner=root group=root mode=644 backup=yes" -i hosts 3.向被控端主机写入数据,并且会覆盖远端文件内原有数据信息
[root@manager project1]# ansible webservers -m copy -a "content='hello word' dest=/tmp/test.html" -i hosts

7.ansible管理服务的启动与停止,使用service、systemd

state:
started #启动
stopped #停止
restarted #重启
reloaded #重载
enabled #是否开机自启
yes #是
no #否 1.启动nginx服务并加入开机自启
[root@manager project1]# ansible webservers -m systemd -a "name=nginx state=restarted enabled=yes" -i hosts 2.停止http服务
[root@manager project1]# ansible webservers -m systemd -a "name=httpd state=stopped" -i hosts

8.file文件创建模块

1.创建 /code/ansible
path: #指定远程主机目录或文件
recurse: #递归授权 yes|no
state: #状态
directory #在远端创建目录
touch #在远端创建文件
link #创建链接文件
absent #表示删除文件或目录
mode #设置文件或目录权限
owner #设置文件或目录属主
group #设置文件或目录属组 2.准备站点
[root@manager project1]# ansible webservers -m file -a "path=/code/ansible state=directory mode=755 owner=www group=www" -i hosts 3.准备站点代码【前提在控制端准备index.html文件】
[root@manager project1]# ansible webservers -m copy -a "src=./file/index.html dest=/code/ansible/index.html owner=www group=www mode=644" -i hosts

9.group组模块、user模块

#group  整数int  小数 flot dasdsa str  真|假 bool
#user
name #名称
uid #uid
group #组名或gid
create_home #是否创建家目录
system #是否作为系统组
shell #指定登录shell
state
present
absent
remove
groups
append
password #给用户添加密码(记得单引号 1.创建gid为666的www组
[root@manager project1]# ansible webservers -m group -a "name=www gid=666 state=present" -i hosts 2.程序使用 www 666 666 /sbin/nologin 不创建家目录/home
[root@manager project1]# ansible webservers -m user -a "name=www uid=666 group=666 create_home=no shell=/sbin/nologin state=present" -i hosts 3.正常用户 xiang 1000 1000 /bin/bash /home/xiang
[root@manager project1]# ansible webservers -m user -a "name=xiang" -i hosts 4.移除用户xiang,并删除家目录所有内容
[root@manager project1]# ansible webservers -m user -a "name=xiang state=absent remove=yes" -i hosts 5.创建 other用户.有两个附加组root bin,创建家目录,指定登录shell,设定密码123
5.1将明文密码进行hash加密,然后进行用户创建
[root@manager project1]# ansible all -i localhost, -m debug -a "msg={{ '123'| password_hash('sha512', 'mysecretsalt') }}"
localhost | SUCCESS => {
"msg": "$6$mysecretsalt$gIIYs0Xgc7sSQkH.zKaz8/AfaMomYzR1QZYtccwmJcUt8VpLq4D055UCCX4MlwgePOP80ZRwhppvBF72RIAVi/"
}
5.2创建
[root@manager project1]# ansible webservers -m user -a 'name=other groups='root,bin' create_home=yes shell=/bin/bash password="$6$mysecretsalt$gIIYs0Xgc7sSQkH.zKaz8/AfaMomYzR1QZYtccwmJcUt8VpLq4D055UCCX4MlwgePOP80ZRwhppvBF72RIAVi/"' -i hosts

10.mount挂载模块

1.提前准备好nfs服务端【web进行测试】
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data/zrlog 172.16.1.0/24
/data/zh 172.16.1.0/24
/data/edu 172.16.1.0/24 2.用管理端操作被控端,让被控端挂载nfs存储数据
state:
present #写入/etc/fstab【开机挂载,仅将挂载配置写入/etc/fstab】
absent #卸载/etc/fstab【卸载设备,会清理/etc/fstab写入的配置】
mounted #临时挂载【挂载设备,并将配置写入/etc/fstab】
unmounted #卸载当前挂载【卸载设备,不会清除/etc/fstab写入的配置】 3.挂载过程中,如果目录不存在,则会创建该目录
[root@manager project1]# ansible webservers -m mount -a "src=172.16.1.31:/data/word path=/test_wordpress fstype=nfs opts=defaults state=mounted" -i hosts 4.卸载当前挂载的
[root@manager project1]# ansible webservers -m mount -a "src=172.16.1.31:/data/word path=/test_wordpress fstype=nfs opts=defaults state=unmounted" -i hosts 5.卸载/etc/fstab
[root@manager project1]# ansible webservers -m mount -a "src=172.16.1.31:/data/word path=/test_wordpress fstype=nfs opts=defaults state=absent" -i hosts

11.crond定时任务模块

minute 	#分
hour #时
day #日
month #月
week #周
job #写具体执行的任务【执行+脚本路径】 1.使用ansible添加一条定时任务
[root@manager project1]# ansible webservers -m cron -a 'name=test_jop minute=00 hour=02 job="/bin/bash /server/scripts/client_data_server.sh && >/dev/null/"' -i hosts [root@web01 ~]# crontab -l
#Ansible: test_jop
00 02 * * * /bin/bash /server/scripts/client_data_server.sh && >/dev/null/ 2.使用ansible添加每分钟执行的定时任务
[root@manager project1]# ansible webservers -m cron -a 'name=test job="/bin/bash /server/scripts/test.sh &> /dev/null"' -i hosts [root@web01 ~]# crontab -l
#Ansible: test
* * * * * /bin/bash /server/scripts/test.sh &> /dev/null 3.删除test定时任务
[root@manager project1]# ansible webservers -m cron -a 'name=test job="/bin/bash /server/scripts/test.sh &> /dev/null" state=absent' -i hosts

12.Firewalld模块

firewalld:
service #指定开放或关闭的服务名称
port #指定开放或关闭的端口
masquerade #开启地址伪装
immediate #临时生效
permanent #是否添加永久生效
state #开启或是关闭 zone #指定配置某个区域
rich_rule #配置富规则
source #指定来源IP 1.启动firewalld防火墙
[root@manager project1]# ansible webservers -m systemd -a "name=firewalld state=started" -i hosts 2.开放http服务
[root@manager project1]# ansible webservers -m firewalld -a "service=http state=enabled" -i hosts 3.开放8888端口
[root@manager project1]# ansible webservers -m firewalld -a "port=8888/tcp state=enabled" -i hosts 4.只允许172.16.1.31网段
[root@manager project1]# ansible webservers -m firewalld -a "source=172.16.1.31/32 zone=trusted state=enabled permanent=no" -i hosts ansible webservers -m firewalld -a 'rich_rule="rule family=ipv4 source address=10.0.0.1/32 service name=http accept" state=enabled' -i hosts 5.使用端口方式 2222
[root@manager project1]# ansible webservers -m firewalld -a 'rich_rule="rule family=ipv4 source address=10.0.0.1/32 port port="2222" protocol=tcp accept" state=enabled' -i hosts

13.selinux模块

1.关闭selinux
[root@manager project1]# ansible webservers -m selinux -a "state=disabled" -i hosts 2.官方语法:
- name: Disable SELinux
selinux:
state: disabled

14.get_url文件下载模块

url         #文件在网络上的具体位置
dest #下载到被控端的哪个目录下
checksum #校验(md5 sha256) 1.通过get_url下载文件或者软件
[root@manager project1]# ansible webservers -m get_url -a "url=https://mirrors.tuna.tsinghua.edu.cn/centos/8.0.1905/BaseOS/x86_64/os/Packages/dejavu-serif-fonts-2.35-6.el8.noarch.rpm dest=/tmp mode=777" -i hosts 2.下载一个文件前先进行md5校验,通过则下载,不通过则失败
[root@manager project1]# wget https://mirrors.tuna.tsinghua.edu.cn/centos/8.0.1905/BaseOS/x86_64/os/Packages/ed-1.14.2-4.el8.x86_64.rpm
[root@manager project1]# md5sum ed-1.14.2-4.el8.x86_64.rpm
[root@manager project1]# ansible webservers -m get_url -a "url=https://mirrors.tuna.tsinghua.edu.cn/centos/8.0.1905/BaseOS/x86_64/os/Packages/ed-1.14.2-4.el8.x86_64.rpm dest=/tmp mode=777 checksum=md5:7f0d0501be51652645704f3f551cbdba" -i hosts

15.yum_repository模块

yum_repository模块可以管理远程主机上的yum仓库。

模块参数

参数 说明
name 必须参数,用于指定要操作的唯一的仓库ID,也就是".repo"配置文件中每个仓库对应的"中括号"内的仓库ID
baseurl 设置yum仓库的baseurl
description 设置仓库的注释信息,也就是".repo"配置文件中每个仓库对应的"name字段"对应的内容。
file 设置仓库的配置文件名称,即设置".repo"配置文件的文件名前缀,在不使用此参数的情况下,默认以name参数的仓库ID作为".repo"配置文件的文件名前缀,同一个'.repo'配置文件中可以存在多个yum源
enabled 设置是否激活对应的yum源,此参数默认值为yes,表示启用对应的yum源,设置为no表示不启用对应的yum源。
gpgcheck 设置是否开启rpm包验证功能,默认值为no,表示不启用包验证,设置为yes表示开启包验证功能。
gpgcakey 当gpgcheck参数设置为yes时,需要使用此参数指定验证包所需的公钥
state 默认值为present,当值设置为absent时,表示删除对应的yum源
1.自定义下载源并设置仓库的名称【在被控主机上设置ID为aliEpel的yum源,
仓库配置文件路径为/etc/yum.repos.d/aliEpel.repo】 [root@manager project1]# ansible webservers -m yum_repository -a 'name=aliEpel description="alibaba EPEL" baseurl=http://mirrors.aliyun.com/epel/7/$basearch' -i hosts
172.16.1.8 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "aliEpel",
"state": "present"
}
172.16.1.7 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "aliEpel",
"state": "present"
} 2.检验下载的阿里源 [root@manager project1]# ansible webservers -a "ls /etc/yum.repos.d/" -i hosts
172.16.1.8 | CHANGED | rc=0 >>
aliEpel.repo
CentOS-Base.repo
epel.repo
nginx.repo
php.repo 172.16.1.7 | CHANGED | rc=0 >>
aliEpel.repo
CentOS-Base.repo
epel.repo
nginx.repo
php.repo 3.删除/etc/yum.repos.d文件中的aliEpel源 [root@manager project1]# ansible webservers -m yum_repository -a "name=aliEpel file=aliEpel state=absent" -i hosts
172.16.1.7 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "aliEpel",
"state": "absent"
}
172.16.1.8 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "aliEpel",
"state": "absent"
}

最新文章

  1. Linux 6.5(oracle 11.2.0.4)单实例ASM安装
  2. 自己动手写插件底层篇—基于jquery移动插件实现
  3. JAVA反射其实就是那么一回事
  4. php反射机制获取未知类的详细信息
  5. 【bzoj1003】[ZJOI2006]物流运输
  6. js_sl 延迟菜单
  7. Citrix 服务器虚拟化之二十七 XenApp6.5发布服务器桌面
  8. Spring事务管理--多个ORM框架在使用时的情况分析
  9. windows8一直更新不了的问题————解决方案
  10. Oracle11G 数据库 expdp、impdp使用示例
  11. lvs keepalived 安装配置详解【转】
  12. C# 数据实现设计模式
  13. 认识Junit
  14. Unix/Linux环境C编程入门教程(27) 内存那些事儿
  15. UITableView性能优化及手工绘制UITableViewCell
  16. Markdown转pdf
  17. javascript字符串对象
  18. ubuntu15.04下sublime text不能输入中文的解决
  19. 20145325张梓靖 《网络对抗技术》 Web安全基础实践
  20. Web 页面性能分析笔记

热门文章

  1. 创建raid10(五块磁盘)
  2. 求亿级记录中搜索次数Top N的搜索词(MapReduce实现)
  3. springboot执行延时任务-DelayQueue的使用
  4. Git与GitHub 学习笔记
  5. luogu P1356 数列的整数性 |动态规划
  6. [AHOI2017初中组]guide
  7. Objective-C面试题(精心整理的,附答案)
  8. MVC 入门 自动生成 增删改查所有功能
  9. shell脚本调用python模块
  10. Day 10 面向对象基础