ansible的两种命令执行方式 : ad-hoc / playbook以及通过setup模块获取系统参数
一.什么是ad-hoc和playbook
ad-hoc : 如果我们敲入一些命令去快速的完成一些操作,而不需要将这些执行过的命令刻意保存下来,这样的命令就叫做as-hoc命令,这里不做过多赘述.
playbook : 简单的说,playbook是一种简单的配置管理系统与多机器部署系统的基础.与现有的其它系统有不同之处,且非常适用于复杂的应用部署.playbook可适用于声明配置,更强大的地方在于playbook中可以编排有序的执行过程,甚至于做到在多组机器间来回有序的执行特别指定的步骤,并且可以同步或异步的发起任务,playbook的文件通常以.yaml或.yml结尾,文件中的数据以字典(key:value)或数组([ ]或-)的形式存在.
二.playbook的命令格式及主要参数
anshible-playbook -h
Usage: ansible-playbook [options] playbook.yml [playbook2 ...]
-C, --check # 检查但是不会真的执行
-f FORKS, --forks=FORKS # 并发,默认是5个
--list-hosts #列出匹配的主机
--syntax-check # 检查语法
三.playbook中的关键字
hosts
tasks
name
register
handlers 正常情况下不会被执行
when 条件判断
with_items 循环执行,不管多少循环,都是item
notify 触发handlers 定义的任务
tags 标签
vars 参数
示例 : 将本机上/etc/fstab文件复制到web组中所有主机的/tmp/fs目录下
- hosts: web #指定目标组(在hosts文件中定义的分组)
remote_user: root #在目标主机上执行时的用户身份
tasks:
- name: copyfile #为操作命名
copy: src=/etc/fstab dest=/tmp/fs #指定使用的模块,对应要进行的操作
四.playbook的特性
1.playbook是支持多任务的,但这些任务会按顺序执行,即第一个任务所有机器都执行完,才会执行第二个任务.
示例 :
- hosts: web
remote_user: root
tasks:
- name: copyfile #任务一
copy: src=/etc/fstab dest=/tmp/fs
- name: createuser #任务二
user: name=alex11
执行结果:
PLAY [web] *********************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************** #收集信息 ok: [192.168.169.131] ok: [192.168.169.136] TASK [copyfile] ****************************************************************************************************** #先依次执行copyfile任务 changed: [192.168.169.136] changed: [192.168.169.131] TASK [createuser] **************************************************************************************************** #再执行createuser任务 changed: [192.168.169.136] changed: [192.168.169.131] PLAY RECAP *********************************************************************************************************** #所有变动 192.168.169.131 : ok=3 changed=2 unreachable=0 failed=0 192.168.169.136 : ok=3 changed=2 unreachable=0 failed=0
2.幂等性,即不管执行多少次,等到的结果永远是一样的.
幂等性参考 : https://www.jianshu.com/p/ccfd13191cf0
五.playbook的五种传参方式
1.通过-e向.yaml文件中传入参数
-e EXTRA_VARS, --extra-vars=EXTRA_VARS
set additional variables as key=value or YAML/JSON, if filename prepend with @
- hosts: web
tasks:
- name: create{{user}} #基于jinja2的引用方式,用双大括号
user: name={{user}}
ansible-playbook -e user=xiaohua 1.yml #执行时使用-e传入参数
2.在hosts文件中ip地址后边写入参数,唯一一种可以设置不同参数的方式
10.0.0.[132:133] user=xiaohua 10.0.0.135 user=xiaohua2 ansible-playbook p1.yml #执行方式
3.在host文件里面写[web:vars]
[web:vars]
user=xiaohua
ansible-playbook p1.yml #执行方式
4.在playbook文件里面写vars
- hosts: web
vars: #指定user
- user: xiaohua
tasks:
- name: create{{user}}
user: name={{user}}
5.register 取值
- hosts: web
tasks:
- name: yumbc
yum: name=bc
- name: sum #定义一个新的任务
shell: echo 8+9|bc #得到一个数字
register: user #注册并命名为user
- name: echo
shell: echo {{user}} >/tmp/sum.txt #查看user的结构
- name: createuser{{user.stdout}} #通过点方法取出想要的内容
user: name=xiaohua{{user.stdout}}
*传参方式优先级 : -e传参 > playbook中的vars > hosts文件
六.通过setup模块获取系统参数
执行命令 : ansible all -m setup|more #获取所有hosts中所有绑定过的主机信息
ansible localhost -m setup|more #获取本地主机的系统参数
ansible_all_ipv4_addresses # 所有的ipv4地址 ansible_all_ipv6_addresses # 所有的ipv6的地址 ansible_bios_version # 主板bios的版本 ansible_architecture # 架构信息 ansible_date_time # 系统的时间 ansible_default_ipv4 # IPv4默认地址 address #ip地址 alias #网卡名称 broadcast #广播地址 gateway # 网关 macaddress #mac地址 netmask #子网掩码 network #网段 ansible_distribution #系统的版本 ansible_distribution_file_variety # 系统的基于对象 ansible_distribution_major_version # 系统的主版本 ansible_distribution_version #系统的版本 ansible_domain #系统的域 ansible_dns #系统的dns ansible_env #系统的环境变量 ansible_hostname #系统的主机名 ansible_fqdn #系统的完整主机名 ansible_machine #系统的架构 ansible_memory_mb #系统的内存信息 ansible_os_family #系统的家族 ansible_pkg_mgr #系统的包管理工具 ansible_processor_cores #cpu的核数 ansible_processor_count #每颗cpu上的颗数 ansible_processor_vcpus #cpu的总核数=cpu的颗数*每颗cpu上的核数 ansible_python #系统的python版本
可以通过ansible 10.0.0.132 -m setup -a "filter='*关键字*'" 类似的命令进行搜索.
补充 : grep "^\(.*\):.*\1$" /etc/passwd \1表示前边分组中的信息,前后一致
grep -E "^(.*):.*\1$" /etc/passwd -E表示扩展匹配
grep匹配 : https://www.cnblogs.com/tian880820/p/5985056.html
七.通过定义tags执行指定任务
如果在playbook中有多条任务,现在只想执行某个任务,可以在任务中定义tags,在执行操作时指定-t即可单独执行此任务.
示例 :
- hosts: web tasks: - name: install yum: name=redis - name: copyfile copy: dest=/etc/redis.conf src=/etc/redis.conf tags: copyfile #在copyfile任务中定义tags(后边名字什么的无所谓) - name: start service: name=redis state=started ansible-playbook -t copyfile p2.yml #操作时通过-t指定copyfile单独执行
八.playbook中handlers的用法
handlers 用法如下,表示当 tasks 执行成功之后再执行 handlers,相当于 shell 中的 && 用法,如果 tasks 执行失败是不会执行 handlers 语句的.
- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
copy: dest=/etc/redis.conf src=/etc/redis.conf
tags: copy
notify: restart #通过定义notify,在copyfile成功执行后才会执行restart
- name: start
service: name=redis state=started
handlers:
- name: restart
service: name=redis state=restarted
注意 : 如果handlers依赖的任务没有完成,则不会执行handlers中的任务.copy任务中如果目标地址中该文件已经存在,并且源文件没有发生变化,copy任务不会执行(幂等性原则),会导致handlers不执行.
九.template模块的使用
在playbook中如果想使用相对路径,则需要在本地目录下创建templates目录,templates模块指向动态文件.
- name: copyfile
template: dest=/etc/redis.conf src=redis.conf #源文件采用相对路径
十.playbook中when的使用
此处的when相当于python中的if条件语句,判断条件执行任务.
- hosts: web
tasks:
- name: file
copy: content="大弦嘈嘈如急雨" dest=/opt/file
when: ansible_distribution_major_version=="7" #引用setup中的参数,centos7
- name: file
copy: content="小弦切切如私语" dest=/opt/file
when: ansible_distribution_major_version=="6" #centos6
十一.with_items实现循环执行任务
当需要执行多个相同的任务时可以采用循环执行的操作.
- hosts: web
tasks:
- name: file
user: name={{item}} #使用大括号接收参数,item是固定写法
with_items: #固定格式
- xiaohua1
- xiaohua2
通过执行多个循环实现循环嵌套.
- hosts: web
tasks:
- name: creategroup
group: name={{item}}
with_items: #循环创建分组
- xiaohua1
- xiaohua2
- name: file
user: name={{item.name}} group={{item.group}}
with_items: #循环创建用户并指定用户的属组,完成嵌套
- {"name":xiaoming1,"group":xiaohua1}
- {"name":xiaoming2,"group":xiaohua2}
十二.linux命令补充
u 撤销
p 粘贴
#yy 复制#行
d$ 从当前位置删除
o 当前位置下面增加空白行,并切换到编辑模式
r 替换