突突突突突突

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ansible 剧本(playbooks)

1.什么是Playbooks?

ansible命令可以创建远程操控我们的主机,虽然ansible的功能已经很ok了,但是面对大型自动化项目,几句简单的ansible命令还是上不了台面.

这时就需要ansible-playbook的登场了. 规范化,按照配置说明配合ansible命令来应对大型复杂的自动化服务器运维工作.

2.Playbooks Language example

Playbooks 语言是以YAML 格式表示,并且有最小的语法,有意的说明它不是一个编程或者脚本语言,它是一种写配置文件的语言。简洁可读性高。类似于java的xml

yaml 语法示例 p1.yml

- hosts: web
  tasks:
  - name: creategroup
    group: name=tse
  - name: createuser
    user: name=treasure
3.ansible-palybooks命令格式

​ 执行顺序:从上往下

​ 特性:幂特性, 不管执行多少遍,结果都是一样的

ansibel-playbook [options] playbook.yml
-C, --check # 检查 检查并不会落实到实际操作上
-f FORKS, --forks=FORKS # 用来做并发
--list-hosts # 列出主机列表
--syntax-check #语法检查
4.简单用法
ansible-playbook p1.yml
5.传参

p2.yml

- hosts: web
  task: 
  - name: create{{ user }}
    user: name={{user}} 

第一种方式

ansible-playbook -e 'user=t1' p2.yml

第二种方式

修改ansible的host文件
[web]
192.168.13.130 user=t21
192.168.13.130 user=t22

第三种方式

[web:vars] # 表示被控机组的参数
user=t3

第四种方式

p2.yml

- hosts: web
  vars: 
  - user: t4
  task: 
  - name: create{{ user }}
    user: name={{user}} 

第五种方式

p3.yml

ps: bc就是linux的计算器

- hosts: web
  task: 
  - name: sum
    shell: echo 1+2|bc
    register: user
  - name: createuser
    user: name={{user.stdout}} 
传参方式的优先级

-e > playbook文件中的 vars > ansible中的host文件中的参数

Setup

ansible_all_ipv4_addresses # ipv4的所有地址
ansible_all_ipv6_addresses # ipv6的所有地址
ansible_date_time # 获取到控制节点时间
ansible_default_ipv4 # 默认的ipv4地址
ansible_distribution # 系统
ansible_distribution_major_version # 系统的大版本
ansible_distribution_version # 系统的版本号
ansible_domain #系统所在的域
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 cache -m setup -a 'filter=*processor*' # 用来搜索

正则补充:

# * 匹配数量,表示0次或多次
# ? 匹配数量,表示0次或者一次
# . 除换行符以外的所有字符
# + 至少一次
# [123abc] 匹配内容 匹配其中一个
# () 分组
# {m} 次数,出现m次
# {m,} 至少出现m次
# {m,n} 出现m-n次

Playbook中的条件判断

- hosts: web
  remote_user: root
  tasks: 
  - name: createfile1
    copy: content="Playbook真的牛批" dest=/tmp/a.txt
    when: a=="3" 
  - name: createfile2
    copy: content="yaml语法真的很严格" dest=/tmp/a.txt
    when: a=="4"

当传入的参数a为3时 执行createfile1

当传入的参数a为4时 执行createfile2

Tags

- hosts: web
  remote_user: rott
  tasks:
  - name: installnginx
    yum: name=nginx
  - name: copyfile
    copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf
    tags: copyfile
  - name: start
    service: name=nginx state=started

ansible-playbook -t copyfile p7.yml

-t 后面加上tags

循环 with_items

一次创建多个用户怎么办呢?

- hosts: web
  tasks:
  - name: createusers
    user: name={{item}}
    with_items:
    - t1
    - t2 
    - t3
  - name: creategroups
    group: name={{item}}
    with_item:
    - tse1
    - tse2
    - tse3

创建多个用户,创建多个用户组

嵌套循环
- hosts: web
  tasks:
  - name: createusers
    user: name={{item.user}} group={{item.group}}
    with_items:
    - {'user': t4, 'group': tse1}
    - {'user': t5, 'group': tse2}
    - {'user': t6, 'group': tse3}
    

创建用户并指定他们的用户组

Handlers

- hosts:
  tasks:
  - name: installredis
    yum: name=redis
  - name: copyfile
    template: src=redis.conf dest=/etc/redis.conf
    tags: copyfile
    notify: restart
  - name: start
    service: name=redis state=started
  handlers:
  - name: restart
    service: name=redis state=restarted

当copyfile任务被执行时候,会触发notify指向的Handlers中的restart

Roles

  • 目录清晰

  • 可以相互调用

roles文件夹
# 文件夹中里面是要创建的每一个角色,每一个角色一个文件夹
# 每一个角色的文件中里面都要有
# task(必须),templates,files,handlers,vars目录
# 每个目录都要有main.yml文件,通过import_tasks来调用
# 其中templates文件夹中的文件可以通过相对路径来调用

补充

setenforce 0 # 临时关闭selinux
iptables -F # 临时关闭防火墙
/etc/selinux/config # 永久关闭
posted on 2019-02-20 17:18  徐建0304  阅读(125)  评论(0编辑  收藏  举报