Hello Ansible
Hello Ansible
1 环境初始化
根据参会人数初始化环境,分配IP , 分别确认连接。 One master & One node --失败
2 Ansible 基础知识讲解
2.1 ansible 特性
- 基于模块运行,有丰富的内置模块支持
- Parmiko (python 对ssh的实现), PyYAML, Jinja2(模板语言) 三个关键模块
- 基于Python开发,方便二次开发
- 基于SSH交互,被管机器不用安装agent
- 无Server, 在任何安装ansible的机器上执行命令即可
- 脚本用YAML编写,易读和易维护
- 幂等性: 一个任务执行一遍和N遍效果一样,不因重复执行带来意外情况
2.2 演示 ansible 安装
yum install ansible
ansible --version
2.3 ansible 架构及工作原理
-
ansible
(ad hoc) 单条命令 -
ansible-playbook playbook01.yml
(playbook) 有很多单条命令组成的脚本 -
ansible-playbook roles.yml
(roles)是有复杂任务调度与安排的playbook 的集合
- 连接插件connection plugins:负责和被监控端实现通信;
- host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
- 各种模块核心模块、command模块、自定义模块;
- 借助于插件完成记录日志邮件等功能;
- playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务
使用各产品详细介绍: 主流Ansible Web UI的部署与使用
2.4 ansible相关目录
- /etc/ansible/ansible.cfg
主配置文件,配置 ansible 工作特性
- /etc/ansible/hosts
主机清单
- /etc/ansible/roles/
存放角色的目录
ll /etc/ansible
番外: 讲解 copy 模块需要用到
-rw-r--r-- 什么意思?
drwxr-xr-x , 什么意思?
2.5 ansible 主配置文件介绍
[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
#主机列表配置文件
remote_port = 22
host_key_checking = False
#检查对应服务器的host_key, 建议取消注释
log_path = /var/log/ansible.log
#日志文件,建议启用
module_name = command
#默认模块,可以修改为shell模块
2.6 ansible 命令执行
2.6.1 ssh 简介
-
查询openssl软件
rpm -qa openssh openssl
-
查询sshd进程
ps -ef | grep ssh
-
查看ssh端口
netstat -lntup | grep ssh
ss | grep ssh
(效果同上,同下,好用)
netstat -a | grep ssh
(记住这个)
netstat -lnt | grep 22
==> 查看22端口有没有开/ssh服务有没有开启
技巧:netstat -lnt | grep ssh | wc -l
-->只要大于2个就是ssh服务就是好的 -
查看ssh的秘钥目录
ll /root/.ssh/known_hosts
# 当前用户家目录的.ssh目录下 -
ssh的配置文件
cat /etc/ssh/sshd_config
-
ssh服务的关闭
service sshd stop
-
ssh服务的开启:
service sshd start
-
ssh服务的重启
service sshd reload
[停止进程后重启] -
ssh远程登录
ssh 192.168.1.100
# 默认利用当前宿主用户的用户名登录 -
sftp客户端连接
sftp -oPort=22 root@192.168.25.137
put /etc/hosts /tmp
get /etc/hosts /home/omd
2.6.2 ssh 免密设置
-
公钥
id_dsp.pub
和私钥id_dsa
所在位置- 普通用户omd:
/home/omd/.ssh
- root 用户:
/root/.ssh/
- 普通用户omd:
-
根据DSA 算法生成私钥和公钥 [默认建立在当前用户的 home 目录下]
ssh-keygen -t dsa
-
拷贝公钥给目标服务器
ssh-copy-id -i id_dsa.pub omd@192.168.1.1
-- 查看目标服务器生成的文件
ll /home/omd/.ssh/authorized_keys
2.6.3 ansible命令详解
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
-a MODULE_ARGS #模块的参数,如果执行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”等等
-k,--ask-pass #ask for SSH password。登录密码,提示输入SSH密码而不是假设基于密钥的验证
--ask-su-pass #ask for su password。su切换密码
-K,--ask-sudo-pass #ask for sudo password。提示密码使用sudo,sudo表示提权操作
--ask-vault-pass #ask for vault password。假设我们设定了加密的密码,则用该选项进行访问
-B SECONDS #后台运行超时时间
-C #模拟运行环境并进行预运行,可以进行查错测试
-c CONNECTION #连接类型使用
-f FORKS #并行任务数,默认为5
-i INVENTORY #指定主机清单的路径,默认为/etc/ansible/hosts
--list-hosts #查看有哪些主机组
-m MODULE_NAME #执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
-o #压缩输出,尝试将所有结果在一行输出,一般针对收集工具使用
-S #用 su 命令
-R SU_USER #指定 su 的用户,默认为 root 用户
-s #用 sudo 命令
-U SUDO_USER #指定 sudo 到哪个用户,默认为 root 用户
-T TIMEOUT #指定 ssh 默认超时时间,默认为10s,也可在配置文件中修改
-u REMOTE_USER #远程用户,默认为 root 用户
-v #查看详细信息,同时支持-vvv,-vvvv可查看更详细信息
2.6.4 执行过程
- ansible 单条命令 (也叫 ad hoc 的执行方式)
- 加载自己的配置文件 默认 /etc/ansible/ansible.cfg
- 加载自己对应的模块文件,如: command
- 通过 ansible 将模块或命令生成对应的临时py文件, 并将该文件传输 $HOME/.ansible/tmp/ansible-tmp-数字/xxx.py 文件
- 给文件 +x 执行
- 执行并返回结果
- 删除临时py文件,退出
2.6.5 命令执行结果
命令执行结果颜色意义:
- 绿色: 执行成功,未修改目标主机
- 黄色: 执行成功,修改了目标主机
- 红色: 执行失败
2.7 ansible 主机清单匹配模式
手动编辑 /etc/ansible/hosts里面的内容
vim /etc/ansible/hosts
ansible all --list-hosts
ansible 的 主机清单匹配模式
-
All : 表示所有Inventory 主机
ansible all -m ping
-
- : 通配符
ansible "*" -m ping
ansible 192.168.1.* -m ping
ansible "*srvs" -m ping
-
逻辑或
ansible "websrvs:appsrvs" -m ping
ansbile "192.168.1.10:192.165.1.20" -m ping
-
逻辑与
在websrvs组 并且在 dbsrvs 组中的主机
ansible "websrvs:&dbsrvs" -m ping
-
逻辑非
-
正则表达式
ansible "~(web | db)srvs" -m ping
ansible "~(web | db).*\.magedu\.com" -m ping
-
ansible-galaxy
下载优秀的roles模板 ansible-galaxy
ansible-galaxy list
2.8 ansible 常用工具
2.8.1 ansible-doc
ansible-doc --help
ansible-doc -l | wc -l
2.8.2 ansible-galaxy
下载优秀的roles模板 ansible-galaxy
ansible-galaxy list
ansible-galaxy collection install community.mysql
2.8.3 ansible-pull
此工具会推送 ansible的命令至远程,效率很大提升,有一定难度
2.8.4 ansible-playbook
此工具用于执行编写好的playbook 任务
范例如下: 特别注意缩进
ansible-plabook hello.yml
cat hello.yml
---hello world yml file
- hosts: websrvs
remote_user: root tasks: \- name: hello world
command: /user/bin/wall hello world
2.8.6 ansible-vault
此工具可用于加密解密 yml 文件
ansilbe-vault [create| decrypt| encrypt| rekey| view]
ansible-vault encrypt hello.yml
# 加密
ansible-vault decrypt hello.yml
# 解密
ansible-vault view hello.yml
# 查看
ansible-vault edit hello.yml
# 编辑加密文件
ansible-vault rekey hello.yml
# 修改口令
ansible-vault create hello.yml
#创建新文件
3 ansible 常用模块 (Module)
3.1 主机连通性测试
ansible web -m ping
目标服务器密码非
非sudoers 用户
3.2 command 模块
ansible web -m command -a 'ss -ntl'
不支持特殊符号, "<",">","|",";","&" 工作(需要使用(shell)模块实现这些功能
常用参数
chdir # 在执行命令之前,先切换到该目录
executable # 切换shell来执行命令,需要使用命令的绝对路径
free_form # 要执行的Linux指令,一般使用Ansible的-a参数代替。
creates # 一个文件名,当这个文件存在,则该命令不执行,可以
用来做判断
removes # 一个文件名,这个文件不存在,则该命令不执行
ansible web -m command -a 'chdir=/data/ ls'
ansible web -m command -a 'creates=/data/aaa.jpg ls'
#如果/data/aaa.jpg存在,则不执行“ls”命令
ansible web -m command -a 'removes=/data/aaa.jpg cat /data/a'
#如果/data/aaa.jpg存在,则执行“cat /data/a”命令
3.3 shell 模块
shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。
ansible web -m shell -a 'cat /etc/passwd |grep "keer"'
3.4 copy 模块
这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等
其相关选项如下:
src
#被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于"rsync"
content
#用于替换"src",可以直接指定文件的值
dest
#必选项,将源文件复制到的远程主机的绝对路径
backup
#当文件内容发生改变后,在覆盖之前把源文件备份,备份文件包含时间信息
directory_mode
#递归设定目录的权限,默认为系统默认权限
force
#当目标主机包含该文件,但内容不同时,设为"yes",表示强制覆盖;设为"no",表示目标主机的目标位置不存在该文件才复制。默认为"yes"
others
#所有的 file 模块中的选项可以在这里使用
-
复制文件
ansible web -m copy -a 'src=~/hello dest=/data/hello'
-
给定内容生成文件,并制定权限
ansible web -m copy -a 'content="I am keer\n" dest=/data/name mode=666'
-
关于覆盖
ansible web -m copy -a 'content="I am keerya\n" backup=yes dest=/data/name mode=666'
3.5 file 模块
该模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等
下面是一些常见的命令:force #需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group #定义文件/目录的属组。后面可以加上mode:定义文件/目录的权限
owner #定义文件/目录的属主。后面必须跟上path:定义文件/目录的路径
recurse #递归设置文件的属性,只对目录有效,后面跟上src:被链接的源文件路径,只应用于state=link的情况
dest #被链接到的路径,只应用于state=link的情况
state #状态,有以下选项:directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
-
创建目录
ansible web -m file -a 'path=/data/app state=directory'
-
创建链接文件
ansible web -m file -a 'path=/data/bbb.jpg src=aaa.jpg state=link''
-
删除文件
ansible web -m file -a 'path=/data/a state=absent''
3.6 fetch 模块
该模块用于从远程某主机获取(复制)文件到本地
有两个选项:dest:用来存放文件的目录
src:在远程拉取的文件,并且必须是一个file,不能是目录
我们可以在本机上查看一下文件是否复制成功。要注意,文件保存的路径是我们设置的接收目录下的被管制主机ip目录下:
ansible web -m fetch -a 'src=/data/hello dest=/data'