ansible简单用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible简单用法相关的知识,希望对你有一定的参考价值。
-
Ansible简介:
- ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
-
Ansible主要组成部分:
- USER,普通用户,即SYSTEM ADMINISTRATOR
- CMDB(资产管理系统) API 调用
- PUBLIC/PRIVATE CLOUD API调用
- USER-> Ansible Playbook -> Ansibile
- 利用ansible实现管理的方式:
- Ad-Hoc 即ansible命令,主要用于临时命令使用场景
- Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划
-
Ansible配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录
-
Ansible程序
/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具
/usr/bin/ansible-pull 远程执行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
-
Ansible配置文件
-
Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默认)
-
Ansible主机清单inventory
- /etc/ansible/hosts文件格式
- inventory文件遵循INI文件风格,中括号中的字符为组名。
- 可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明
- 例:
-
Ansible系列命令
ansible #主程序命令,临时执行命令用 ansible-doc #显示模块帮助 ansible-playbook #将一系列的任务写在一起,称为:剧本 ansible-vault #管理加密、解密yml文件 ansible-console #2.0+版本新增,可交互执行命令,支持tab ansible-galaxy #连接 https://galaxy.ansible.com 下载相应的roles ansible-pull #推送命令至远程,效率无限提升,对运维要求较高
- ansible
-
ansible-doc
- ansible-vault
-
ansible-console
- ansible
-
Ansible常用模块
- Command:在远程主机执行命令,默认模块,可忽略-m选项
ansible srvs -m command -a ‘service vsftpd start‘
ansible srvs -m command -a ‘echo bigboss | passwd --stdin wang‘ #执行失败
#此模块不支持 $VARNAME < > | ; & 等,用shell模块实现 - Shell:和command相似,用shell执行命令
(1)ansible srv -m shell -a ‘echo bigboss |passwd –stdin wang‘
(2)调用bash执行命令
#类似 cat /tmp/stanley.md | awk -F‘|‘ ‘{print $1,$2}‘ &> /tmp/example.txt
#这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器 - Script:运行脚本
ansible all -script -a "/PATH/TO/SCRIPT_FILE"
ansible all -m script -a test.sh - Copy:从服务器复制文件到客户端
ansible srv -m copy -a ‘src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes‘
#如目标存在,默认覆盖,backup=yes 指定先备份
ansible srv -m copy -a "content=‘test content\n‘ dest=/tmp/f1.txt"
#利用内容,直接生成目标文件 - Cron:计划任务
#支持时间:minute,hour,day,month,weekday
ansible srv -m cron -a "minute=*/5 job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null‘ name=Synctime" #创建任务
ansible srv -m cron -a ‘state=absent name=Synctime‘ #删除任务 -
Fetch:从客户端取文件至服务器端,copy相反,拉取目录可先tar打包
ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts‘ - File:文件管理
ansible all -m file -a ‘name=/app/a.txt state=touch‘
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 all -m hostname -a "name=websrv" -
Yum:管理包
ansible srv -m yum -a ‘name=httpd state=latest‘ #安装
ansible srv -m yum -a ‘name=httpd state=absent‘ #删除 -
Service:管理服务
ansible srv -m service -a ‘name=httpd state=stopped‘ #停止
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=restarted‘ #重启 -
User:管理用户
ansible srv -m user -a ‘name=user1 comment="test user" uid=2048 home=/app/user1 group=root‘
ansible srv -m user -a ‘name=sysuser1 system=yes home=/app/sysuser1 ‘
ansible srv -m user -a ‘name=user1 state=absent remove=yes‘
#删除用户及家目录等数据 -
Group:管理组
ansible srv -m group -a "name=testgroup system=yes"
ansible srv -m group -a "name=testgroup state=absent" - Setup: 远程主机信息变量
- Command:在远程主机执行命令,默认模块,可忽略-m选项
-
Ansible的playbook
- playbook是由一个或多个"play"组成的列表
- play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。
- 从根本上来讲,所谓task无非是调用ansible的一个module。
-
将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏
- Playbook采用YAML语言编写
- YAML是一个可读性高的用来表达资料序列的格式
- http://www.yaml.org
-
运行playbook:
ansible-playbook <filename.yml> ... [options] 选项: --check 只检测可能会发生的改变,但不真正执行操作 --list-hosts 列出运行任务的主机 --limit 主机列表 只针对主机列表中的主机执行 -v,-vv,-vvv 显示过程,更详细 例: ansible-playbook file.yml --check #只检测不运行 ansible-playbook file.yml ansible-playbook file.yml --limit websrvs
-
YAML语法简介
- (1)在单一档案中,可用连续三个连字号(——)区分多个档案。另外,还有选择性的连续三个点号( ... )用来表示档案结尾
- (2)次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
- (3)使用#号注释代码
- (4)缩进必须是统一的,不能空格和tab混用
- (5)缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
- (6)YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感
- (7)k/v的值可同行写也可换行写。同行使用:分隔
- (8)v可是个字符串,也可是另一个列表
- (9)一个完整的代码块功能需最少元素需包括 name: task
- (10)一个name只能包括一个task
- (11)YAML文件扩展名通常为yml或yaml **
-
Playbook核心元素
- Hosts #执行的远程主机列表
- Tasks #任务集
- Varniables #内置变量或自定义变量在playbook中调用
- Templates #模板,可替换模板文件中的变量并实现一些简单逻辑的文件
- Handlers #和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
- tags #标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
- Hosts:
- playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。
- hosts用于指定要执行指定任务的主机,须事先定义在主机清单中
-
可以是如下形式:
www.bigboss.com www.bigboss1.com:www.bigboss2.com 192.168.1.2 192.168.1.* web:db #两个组的交集 web:&db #两个组的并集 web:!db #在web组但不在db组中 例: - host: web:db
- remote_user:
- 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务
-
此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
- hosts: websrvs remote_user: root tasks: - name: test connection ping: remote_user: bigboss sudo: yes #默认sudo为root sudo_user:wang #sudo为wang
- tasks:任务列表
- 格式:
- (1) action: module arguments
- (2) module: arguments 建议使用
- 注意:shell和command模块后面跟命令,而非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: /usr/bin/somecommand || /bin/true #或者使用ignore_errors来忽略错误信息: tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: True
-
handlers和notify结合使用触发条件:
- hosts: websrvs remote_user: root tasks: - name: Install httpd yum: name=httpd state=present - name: Install configure file copy: src=files/httpd.conf dest=/etc/httpd/conf/ notify: restart httpd #当copy动作实现时,就会执行handlers的动作 - name: ensure apache is running service: name=httpd state=started enabled=yes handlers: - name: restart httpd service: name=httpd status=restarted
- tags使用:
http.yml - hosts: web remote_user: root task: - name: Install httpd yum: name=httpd - name: copy configure file copy: src=file/httpd.conf dest=/etc/httpd/conf/ tags: conf #设置tags名为conf - name: start httpd tags:service service: name=httpd state=started enabled=yes ansible-playbook -t conf httpd.yml #调用名为conf的tags
-
模板Templates
文本文件,嵌套有脚本(使用模板编程语言编写)
Jinja2语言,使用字面量,有下面形式
字符串:使用单引号或双引号
数字:整数,浮点数
列表:[item1, item2, ...]
元组:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布尔型:true/false
算术运算:+, -, *, /, //, %, **
比较操作:==, !=, >, >=, <, <=
逻辑运算:and, or, not
流表达式:For If When -
templates功能:根据模块文件动态生成对应的配置文件
- templates文件必须存放于templates目录下,且命名为 .j2 结尾
-
yaml/yml 文件需和templates目录平级,目录结构如下:
- 例:利用templates 同步nginx配置文件
[[email protected] ~]# cat nginx.conf.j2
user nginx;
worker_processes {{ ansible_processor_vcpus*2 }};
#setup模块中ansible_processor_vcpus变量为CPU核心数,[[email protected] ~]# vim temnginx.yml
- hosts: web remote_user: root tasks: - name: template config to hosts template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
ansible-playbook temnginx.yml
-
when: 条件测试
-
如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法格式在task后添加when子句即可使用条件测试;when语句支持Jinja2表达式语法
- 例:
#当setup模块中ansible_os_family等于RedHat时执行关机
tasks:-
name: shutdown redhat system
command: /sbin/shutdown -h now
when: ansible_os_family == ‘RedHat‘#根据系统版本来安装软件
tasks: - name: install nginx to centos7
yum: name=nginx
when: ansible_distribution_major_version == ‘7‘ - name: install httpd to centos6
yum: name=httpd
when: ansible_distribution_major_version == ‘6‘
-
-
-
迭代:with_items
- 迭代:当有需要重复性执行的任务时,可以使用迭代机制
- 对迭代项的引用,固定变量名为”item“
- 要在task中使用with_items给定要迭代的元素列表
- 列表格式:
- 字符串
- 字典
- 例:
- 迭代嵌套子变量:
-
想要深入了解请点击→Ansible中文权威指南
以上是关于ansible简单用法的主要内容,如果未能解决你的问题,请参考以下文章
ansible用法之ansible-playbook简单使用
inotify用法简介及结合rsync实现主机间的文件实时同步