playbook 剧本
一、操作都是幂等的
即操作过后就不会操作了
ymal
配置文件
格式为:
字典:
key: value (冒号后面必须有空格)
列表
-
playbook的格式
Usage: ansible-playbook [options] playbook.yml [playbook2 ...] -C --check #白跑,执行代码但不会有结果 --list-hosts #列出符合的主机 -f FORKS --forks=FORKS #做并发 --syntax-check #检查语法 -k --ask-pass #输入密码
了解了playbook的命令的格式接下来看看怎么使用吧
首先新建一个文件里面写咱们的代码,文件结尾为.yml的文件
touch pb.yml
vim pb.yml
单个的playbook的实例文件如下,冒号后面要加空格
创建一个用户,用户名为IT01,家目录为/opt/IT01,用户id为4000
- hosts: all #指定要执行的主机组 remote_user: root #指定执行的用户,默认是root tasks: #任务列表 - name: createuser #任务名字,必须要有 user: name=IT01 home=/opt/IT01 uid=4000 #指定要使用的模块以及模块参数
多个playbook的实例文件内容如下
一个任务名称为createuser,一个任务名称为copyfile。playbook有幂等性不管执行多少次,得到的结果都是一样的可以在原有的基础上可以再写一个任务
- hosts: all remote_user: root tasks: - name: createuser user: name=IT01 home=/opt/IT01 uid=4000 - name:copyfile copy: src=/etc/fstab dest=/tmp/fs
接下来就有新的问题了如果我原来早先的机器是这样做,现在公司又来了一批新机器不设置用户为IT01,要设置成IT02,我是不是还要打开这个playbook再来一遍呢。太繁琐了,所以就需要用到传参了,比如:
- hosts: all tasks: - name: create{{user}} user: name={{user}} 然后在执行这个playbook的时候用 -e 指定上面代码中需要的user ansible-playbook -e user=IT02 pb.yml
上面是传参的第一种方式,关于playbook的传参有5种方式,首先我们需要打开 /etc/ansible/hosts 文件
vi /etc/ansible/hosts
然后找到上次咱们分组的地方
改成下面这样的:
然后执行
ansible-playbook pb.yml
下面是介绍第三种传递参数的方法
还是在/etc/ansible/hosts 文件,只是改成这样的
再去执行上面的playbook命令运行pb.yuml文件
下面是第四种方法,是在写bp.yml文件的时候写入到文件中去:
- hosts: web vars: #默认是root,可以省略 - user: IT02 tasks: - name: create{{user}} user: name={{user}}
第五种传递参数的方法:
如果我们想让Linux做数学计算怎么办呢?我们需要安装一个叫bc的包,正好我们用playbook安装下
- hosts: all tasks: - name: yum yum: name=bc - name: sum shell: echo 11+22|bc register: user - name: echo shell: echo {{user.stdout}} > /tmp/echo.txt #将结果写入到文件 - name: create{{user.stdout}} user: name=IT{{user.stdout}}
接下来就是五种传递参数的方式的优先级
-e > playbook > hosts
在执行playbook的时候我们会看到这样一条提示
TASK [Gathering Facts]
实质上这个是在收集信息,我们可以使用下面的命令来看收集的都有什么信息
ansible cache -m setup | more 以及他所收集的一些重要的信息 ansible_all_ipv4_addresses #所有的ipv4地址 ansible_all_ipv6_addresses #所有的ipv6地址 ansible_architecture #系统的架构 ansible_date_time #系统时间 ansible_default_ipv4 #默认的ipv4地址 address ip地址 alias 网卡名称 broadcast 广播地址 gateway 网关 netmask 子网掩码 network 网段 ansible_default_ipv6 #默认的ipv6地址 ansible_device_links #系统的磁盘信息 ansible_distribution #系统名称 ansible_distribution_file_variety #系统的基于公司 ansible_distribution_major_version #系统的主版本 ansible_distribution_version #系统的全部版本 ansible_dns #系统的dns 默认udp 端口53 ansible_domain #系统的域 ldap ipv4 #ipv4地址 ansible_env #系统的环境 ansible_fqdn #系统的完整主机名 ansible_hostname #系统的简写主机名 ansible_kernel #系统的内核版本 ansible_machine #系统的架构 ansible_memtotal_mb #系统的内存 ansible_memory_mb #系统的内存使用情况 ansible_mounts #系统的挂载信息 ansible_os_family #系统家族 ansible_pkg_mgr #系统的包管理工具 ansible_processor #系统的cpu ansible_processor_cores #每颗cpu的核数 ansible_processor_count #cpu的颗数 ansible_processor_vcpus #cpu的个数=cpu的颗数*每颗cpu的核数 ansible_python #系统python信息 ansible_python_version #系统python的版本 ansible_system #系统名字
接下来就是,如果我们之前执行过的命令因为幂等会有跳过不会再次执行但是即便是那样也会觉得很别扭比如我们写的有yum安装的命令和copy的命令,但是后面我们需要执行下playbook中的copy怎么办呢???那么就引出了我们的
tags标签
比如有如下一个playbook的文件:
- hosts: all tasks: - name: install yum: name=redis - name: copyfile copy: dest=/etc/redis.conf src=/etc/redis.conf tags: copy #我们可以是使用tags定义一个标签并取上名字 - name: start service: name=redis state=started
那么我们如果只是需要copy文件的命令的时候就直接使用 -t 加上标签名就执行了
ansible-playbook -t copy pb.yml
那么问题又来比如我们像上面一样把主控机的redis.conf文件修改后copy到被控机上了然后我们需要重启redis服务还需我们打开文件修改再运行什么的,或者还要手动重启redis,有么有一种方法可以直接在文件改变了就自动重启呢???就是下面的handlers了自动触发的命令
- hosts: web tasks: - name: install yum: name=redis - name: copyfile copy: dest=/etc/redis.conf src=/etc/redis.conf tags: copy
notify: restart #触发
- name: start service: name=redis state=started
handlers: #触发执行的命令 - name: restart service: name=redis state=restarted
当执行了copy命令后会触发去执行handlers下面的代码
template可以动态的传递参数,可以在setup中获取
绝对路径的写法
- hosts: all tasks: - name: install yum: name=redis - name: copyfile template: dest=/etc/redis.conf src=/etc/redis.conf tags: copy notify: restart - name: start service: name=redis state=started handlers: - name: restart service: name=redis state=restarted
当然相对的还有个相对路径的写法
- hosts: all tasks: - name: install yum: name=redis - name: copyfile template: dest=/etc/redis.conf src=redis.conf.j2 tags: copy notify: restart - name: start service: name=redis state=started handlers: - name: restart service: name=redis state=restarted
需要在当前目录下创建一个templates的目录,就可以使用相对路径了
如何在playbook中写判定语句
用 when
- hosts: all tasks: - name: copyfile copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt when: ansible_distribution_major_version=="7" #如果系统的主版本是7那么执行上面的代码 - name: copyfile copy: content="小弦切切如私语" dest=/tmp/a.txt when: ansible_distribution_major_version=="6" #如果系统的主版本是6那么执行上面的代码
如何在playbook中写循环语句
使用with_items就可以做到循环,是一个列表
- hosts: all tasks: - name: createuser user: name={{item}} with_items: - IT01 - IT02 - IT03 循环出来的元素都是写item是固定的写法
我是创建用户可以这样写每个机器上都创建三个用户,但是我不满足现状我想在创建用户的同时可以指定组名该怎么写呢???这样就用到了嵌套循环,具体写法如下
- hosts: web tasks: - name: crateuser user: name={{item.name}} group={{item.group}} with_items: - {"name":alex52,"group":alex60} - {"name":wusir52,"group":wusir60} - {"name":taibai52,"group":taibai60} 这种就是一个列表中套了三个字典