分享交流
合作共赢!

Ansible定义和引用变量及基本使用方法总结【二】

参考琼杰笔记文档:

Ansible定义和引用变量方法总结【一】

一.什么是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
执行结果:

View Code
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 替换
赞(2) 打赏
未经允许不得转载:琼杰笔记 » Ansible定义和引用变量及基本使用方法总结【二】

评论 抢沙发

评论前必须登录!

 

分享交流,合作共赢!

联系我们加入QQ群

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏