Ansible 总结
ansible 的 Host-pattern 逻辑与正则
逻辑与
ansible "webservs:&dbservs" -m ping
在webservs组并且在dbservs组中的主机
逻辑非
ansible 'webservs:!dbservs' -m ping
在webservs组,单不在dbservs组中的主机
注意:此处为单引号
综合逻辑
ansible 'webservs:dbservs:&appservs:!ftpservs' -m ping
即在webservs 或在dbservs 且在appservs但是不在ftpservs里边的
注意:虽然ansible提供了这种综合逻辑的操作,但是我们生产环境中尽量避免复杂的综合逻辑,以免给线上生产环境带来负担
正则表达式
ansbile "webservs:&dbservs" -m ping
ansible "~(web|db).*" -m ping
⚠️:要用正则表达式,必须要用波浪符号(~),下边表示的意思和第一个意思是一样的;
ansible 命令执行过程
ansible 命令执行过程
- 家在自己的配置文件 默认/etc/ansible/ansible.cfg
- 家在自己对应的模块文件,入command
- 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/xxx.PY文件
- 给文件+x执行
- 执行并返回结果
- 删除临时py文件,sleep 0 退出
ansible 执行状态:
- 绿色:执行成功并且不需要做改变的操作
- 黄色:执行成功并且对目标主机做变更
- 红色:执行失败
ansible 使用示例
# 示例
# 以wang用户执行ping存活检测
ansible all -m ping -u wang -k
# 以wang sudo至root执行ping存活检测
ansible all -m ping -u wang -b -k
# 以wang sudo至mage用户执行ping存活检测
ansible all -m ping -u wang -b -k --become-user mage
# 以wang sudo至root用户执行ls
ansible all -m command -u wang --become-user=root -a 'ls /root' -b -k -K
ansible 常用模块
-
Command:在远程主机执行命令,默认模块,可忽略-m选项
ansible srv -m command -a 'service vsftpd start'
ansible srv -m command -a 'echo magedu | passwd --stdin wang' 不成功
此命令不支持$VARNAME <>|;&等,用shell模块实现
-
Shell:和command相似,用shell执行命令
ansbile srv -m shell -a 'echo magedu|passwd -stdin wang'
调用bash执行命令类似cat /tmp/stanley.md | awk -F '|' '{print $1 $2}' &> /tmp/example.txt 这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回到执行命令的机器
-
Script:运行脚本
ansible webserver -m script -a f1.sh
-
Copy:从服务器复制文件到客户端
ansbile srv -m copy -a "src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes"
如果目标存在,默认覆盖,此处指定先备份
ansible srv -m copy -a "content='test content\n' dest=/tmp/f1.txt"利用内容,直接生成目标文件
-
Fetch:从客户端去文件至服务器端,copy相反,目录可先tar
ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts'
-
File:设置文件属性
ansible srv -m file -a "path=/root/a.sh owner=wang mode=755"
ansible web -m file -a 'src=/app/testfile dest=/app/testfile-link state=link'
-
Hostname:管理主机名
ansible node1 -m hostname -a "name=webserv"
-
Cron:计划任务
支持时间:minute, hour, day, month, weekday
ansible srv -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 127.0.0.1 &>/dev/null' name=Synctime" 创建任务
ansible srv -m cron -a 'state=absent name=Synctime' 删除任务
-
Yum:管理包
ansible srv -m yum -a 'name=httpd state=latest' 安装
ansible srv -m yum -a 'name=httpd state=absent' 删除
ansible srv -m yum -a 'name=/root/vsftpd-3.0.2-22.el7.x86_64.rpm' 安装指定目录中的文件
-
Service: 服务管理
ansible srv -m service -a "name=vsftpd state=stopped enable=false" 关闭vsftpd服务,禁止开机启动
ansible srv -m service -a "name=httpd state=started" 开启服务
ansible srv -m service -a "name=httpd state=reloaded" 重载服务
ansible srv -m service -a "name=httpd state=restartd" 重新启动服务
-
User:管理用户
ansible srv -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
ansible srv -m user -a 'name=user1 shell=/sbin/nologin system=yes groups=root,bin uid=2048 home=/app/user1 group=root'
-
Group:组管理
ansible srv -m group -a "name=testgroup system=yes"
ansible srv -m group -a "name=testgroup state=absent"
ansible 命令系列
ansible-galaxy
- 列出所有已安装的galaxy
ansible-galaxy list
- 安装galaxy包
ansible-galaxy install geerlingguy.redis
- 删除galaxy包
ansible-galaxy remove geerlingguy.redis
ansible-pull
推送命令至远程,效率无限提升,对运维要求较高
anbsible-playbook
ansible-playbook hello.yml
cat hello.yml
# hello world yml file
- hosts: webservers
remote_user:root
tasks:
- name: hello world
command:/user/bin/wall hello world
ansible-vault
-
功能:管理加密解密yml文件
ansible-vault [create|decrypt|edit|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 new.yml 创建新文件
ansible-console:2.0+新增,可交互执行命令,支持tab
- root@test(2)[f:10]$
执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]$
- 设置并发数:forks n 例如:forks 10
- 切换组:cd 主机组 例如:cd web
- 列出当前组主机列表:list
- 列出所有的内置命令:?或help
-
示例:
root@all (2)[f:5]$ list
root@all (2)[f:5]$ cd appservs
root@appsrvs (2)[f:5]$ list
root@appsrvs (2)[f:5]$ yum name=httpd state=present
root@appsrvs (2)[f:5]$ service name=httpd state=started
playbook
- playbook是由一个火多个“play”组成的列表
- play的主要功能在于将实现归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,既可以让他们联同起来按事先编排的机制同唱一台大戏
- playbook采用yaml语言编写
yaml 介绍
- yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其他多种语言,包括xml、c语言、python、perl以及电子邮件格式RFC2882等。clark evans在2001年在首次发表了这种语言,另外ingy dot net 与 oren ben-kiki 也是这语言的共同设计者;
- yaml aint markup language,即yaml不是xml。不过,在开发的这种语言时,yaml的意思其实是:yet another markup language(仍是一种标记语言)
-
特性
yaml的可读性好
yaml和脚本语言的交互性好
yaml使用实现语言的数据类型
yaml有一个一直的信息模型
yaml易于实现
yaml可以基于流来处理
yaml表达能力强,扩展性好
yaml 语法简介
- 在单一档案中,可用连续三个连字号(-)区分多个档案。另外,还有选择性的连续三个点号(..) 用来表示档案结尾
- 次行开始正常写 Playbook 的内容,一般建议写明该 Playbook 的功能使用#号注释代码
- 使用#好注释代码
- 缩进必须是统一的,不能空格和 tab 混用
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判別配置的级别是通过缩进结合换行来实现的
- YAML文件内容和 Linux系统大小写判断方式保持一致,是区別大小写的,k/的值均需大小写敏感
- k/v 的值可同行写也可换行写。同行使用:分隔
- v 可是个字符串,也可是另一个列表
- 一个完整的代码块功能需最少元素需包括 name: task
- 一个 name 只能包括一个 task
- YAML 文件扩展名通常为 yml 或 yaml
- List:列表,其所有元素均使用“-“打头
-
示例
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango -
Dictionary:字典,通常由多个 key 与 value 构成
-
示例
---
# An employee recold
name: Example Developer
job Developer
skill: Elite
也可以将 key value 放置于仍中进行表示,用分隔多个 key value -
示例
---
# An emplovee record
[name: Example Developer, job Developer, skill: Elite) - YAML 的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用“-“来代表,Map 里的键值对用":"分隔
-
示例
name: John Smith age: 41 gender: Male spouse. name: Jane Smith age: 37 gender: Female children: - name: Jimmy Smith age: 17 gender: Male - name: Jenny Smith age 13 gender: Female
Playbook 核心元素
- Hosts 行的远程主机列表
- Tasks 任务集
- Variables 内置变量或自定义变量在 playbook 中调用
- Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
- Handlers 和 notity 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
- tags 标签指定某条任务执行,用于选择运行 playbook 中的部分代码。ansible 具有幕等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过 tags 跳过此些代码片断
ansible-playbook -t tagsname useradd.yml
playbook 基础组件
- Hosts:
-
playbook 中的每个 play 的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts 用于指定要执行指定任务的主机,须事先定义在主机清单中
可以是如下形式:
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1. *Websrys:dbsrvs 两个组的并集
Websrvs:&dbsrvs 两个组的交集
webservers:!phoenix 在 websrvs 组,但不在 dbsrvsa 组例 - hosts: websrvs:dbsrvs
-
-
Remote_user:可用于 Host 和 task 中。也可以通过指定其通过 sudo 的方式在远程主机上执行任务,其可用于 play 全局或某任务;此外,甚至可以在 sudo 时使用 sudo_user 指定 sudo 时切换的用户
- hosts: websrvs remote_user: root tasks: - name: test connection ping: remote_user: magedu sudo: yes 默认 sudo 为 ro sudo_user: Wang sudo 为 wang - Tasks:任务列表
-
格式:(1) action: module arguments
(2) module: arguments 建议使用
注意:shel ormandy 模块后面跟命令,而非 key=value - 某任务的状态在运行后为 changed 时,可通过 "notify" 通知给相应的handlers
-
任务可以通过“tags“打标签,而后可在 ansible-playbook 命令上使用-t指定进行调用
示例: tasks: - name: disable selinux command: /sbin/setenforce 0 -
如果命令或脚本的退出码不为零,可以使用如下方式替代
tasks: - name: run this command and ignore the result shell: /ust/bin/sbmecommand || /bin/true
-
或者使用 gnore_ errors 来忽略错误信息
tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignore errors: True
-
ansible 参考链接
链接如下:
http://galaxy.ansible.com
http://galaxy.ansible.com/explore#/
http://ansible.com.cn
https://github.com/ansible/ansible
https://github.com/ansible/ansible-examples
本文来自博客园, 作者:Star-Hitian, 转载请注明原文链接:https://www.cnblogs.com/Star-Haitian/articles/15224356.html


浙公网安备 33010602011771号