ansible(playbook)

一、YAML语法简介 .yaml .yml

playbook由YAML语言编写。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。  
YAML格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。

以下为playbook常用到的YAML格式:
  1、文件的第一行应该以 "---" (三个连字符)开始,表明YAML文件的开始。
  2、在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
  3、YAML中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。
  4、同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。
  5、play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增加一个空格。

二、字符类型

字符串:
ipaddress: 192.168.10.12

列表:
colors:
- red
- green
- yellow
- blue
- orange

字典或MAP
user:
name: jerry
state: present

三、语法检测

语法检测:
    # ansible-playbook --syntax-check /path/to/playbook.yaml
 测试运行
    # ansible-playbook -C /path/to/playbook.yaml

四、 常用语法结构

1.基本语法

---
- hosts: web1
  tasks:
  - name: create user ljz
    user:
      name: ljz
      state: present
  - name: create file /root/ljz
    file:
      path: /root/ljz
      state: directory
- hosts: 192.168.100.90
  tasks:
  - name: delete /root/a.txt
    file:
      path: /root/a.txt
      state: absent

注意:
hosts参数指定了对哪些主机进行操作;
tasks指定了任务列表,其下面的name参数是任务的ID,在执行过程中会打印出来。 

2. 变量定义及使用 :

---
- hosts: web1
  gather_facts: false
  vars:
  - UserName: jerry
  - FileName: jerry.txt
  tasks:
  - name: create user "{{UserName}}"
    user:
      name: "{{UserName}}"
      state: present
  - name: create file "/root/{{FileName}}"
    file:
      path: "/root/{{FileName}}"
      state: touch
      owner: "{{UserName}}"

注意:
name参数对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 ,可以省略;
gather_facts参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用到setup获取的信息时用到;
vars参数指定了变量,这里指字一个user变量,其值为test ,需要注意的是,变量值一定要用引号引住;
user提定了调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。

3.条件判断:

---
- hosts: web1
  user: root
  gather_facts: True
  tasks:
  - name: use when
    file:
      path: /root/when.txt
      state: touch
    when:
    - "'192.168.100.80' in ansible_all_ipv4_addresses"

类型为字符串: ansible_distribution == "CentOS"
类型为列表: "'192.168.10.12' in ansible_all_ipv4_addresses"
类型为字典: ansible_memory_mb.real.free >= 500 (也可写作 ansible_memory_mb["real"]["free"])

如果要从ansible_facts中取数据, 一定要从顶层字段取起

注意:
(1)要求多条件同时满足可用and连接或写成列表的形式;
(2)变量要先定义才能进行比较

4.循环 :

---
- hosts: web1
  gather_facts: no
  tasks:
  - name: test loop
    file:
      name: "/root/{{item}}"
      state: touch
    loop:
    - 1.txt
    - 2.txt
    - 3.txt
- hosts: 192.168.100.80
  gather_facts: no
  tasks:
  - name: create two hard links
    file:
      src: "/etc/{{item.src}}"
      dest: "/root/{{item.dest}}"
      state: hard
    loop:
    - { src: passwd, dest: 123 }
    - { src: hosts, dest: 456 }

说明:
循环:迭代,需要重复执行的任务;  
对迭代项的引用,固定变量名为"item",而后使用 loop 给定要迭代的元素列表

5.register

register 是个寄存器,接收任务的返回值或者状态.
register 用于获取task输出,检测是否执行正常或失败。可以通过使用 register 关键字来实现获取输出。
register 关键字可以存储指定task的输出结果到一个自定义的变量中,我们通过访问这个自定义变量就可以获取到task的输出结果。

# 例1
---
- hosts: 192.168.10.21
  gather_facts: false
  tasks:
  - name: 获取当前日期
    shell: date +%F
    register: day
  - name: 查看变量内容
    debug:
      var: day

# 例2
---
- hosts: 192.168.10.21
  gather_facts: false
  tasks:
  - name: 获取当前星期
    shell: date +%w
    register: week_day
  - name: 星期三在/tmp目录下创建记录日期的文件a.txt
    shell: date > /tmp/a.txt
    when: week_day.stdout == "3"

6. handlers

---
- hosts: 192.168.10.12
  vars:
  - user_name: "hello"
  tasks:
  - name: create user hello
    user:
      name: "{{ user_name }}"
      state: present
    notify: change owner to file                    # notify后面是handler的ID
  - name: create file /tmp/test.txt
    file:
      path: /tmp/test.txt
      state: touch
  handlers:
  - name: change owner to file
    file:
      name: /tmp/a.txt
      owner: "{{ user_name }}"
      state: touch

(1)任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;

(2)当所有任务执行完毕后才会执行handlers  

以上只有 user 模块真正执行后,才会去调用下面的 handlers 相关的操作,追加内容。所以这种比较适合配置文件发生更改后,需要重启服务的操作。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值