playbook 剧本
一, 操作都是幂等的
即操作过后就不会操作了
ymal
配置文件
格式为:
字典:
key: value (冒号后面必须有空格)
列表
-
playbook 的格式
- Usage: ansible-playbook [options] playbook.YAML [playbook2 ...]
- -C --check #白跑, 执行代码但不会有结果
- --list-hosts #列出符合的主机
- -f FORKS --forks=FORKS #做并发
- --syntax-check #检查语法
- -k --ask-pass #输入密码
了解了 playbook 的命令的格式接下来看看怎么使用吧
首先新建一个文件里面写咱们的代码, 文件结尾为. YAML 的文件
touch pb.YAML
VIM pb.YAML
单个的 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.YAML
上面是传参的第一种方式, 关于 playbook 的传参有 5 种方式, 首先我们需要打开 /etc/ansible/hosts 文件
vi /etc/ansible/hosts
然后找到上次咱们分组的地方
改成下面这样的:
然后执行
ansible-playbook pb.YAML
下面是介绍第三种传递参数的方法
还是在 / etc/ansible/hosts 文件, 只是改成这样的
再去执行上面的 playbook 命令运行 pb.yuml 文件
下面是第四种方法, 是在写 bp.YAML 文件的时候写入到文件中去:
- - 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.YAML
那么问题又来比如我们像上面一样把主控机的 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}
这种就是一个列表中套了三个字典
来源: http://www.bubuko.com/infodetail-3050171.html