昔我往矣

ansible-playbook的用法笔记

2019年12月13日

ansible是十分值得运维学习的技术,作为一个自动化处理工具,用好ansible可以让你你事半功倍。下面通过几个例子来演示ansible playbook的用法。例子中会有不同ansible playbook的写法,只是为了展现ansible playbook的灵活性,使用的时候,不用拘泥其中的任何一种。最基础的方法就忽略了,可以查看官方文档。

ansible-playbook.jpg

使用debug模块查看变量的值

查看playbook执行过程中变量的内容,可以使用debug模块,debug-name.yaml的内容如下

---
- name: show name value
  hosts: all
  user: root
  vars:
    name: "{{ name }}"
  tasks:
    - name: show name var
      debug: var=name

执行方法如下:

# ansible-playbook  debug-name.yaml -e name='Hello,Xnow' -i localhost,

这里执行过程有几个点需要注意:

  1. 这个playbook没有提供inventory文件,而是使用-i来指定了一个localhsot地址
  2. 使用-e把变量name传到了playbook里

使用uri请求一个网页

uri模块可以用来请求http接口,并且对接口进行成功性校验。get-index-content.yml

- hosts: all 
  user: root
  gather_facts: no
  tasks:
  - name: 请求主页
    uri:
      url: "http://xnow.me"
      method: GET
      return_content: yes
      timeout: 120
    register: response
    failed_when: response.status != 200

  - debug: var=response.content

执行方法如下:

# ansible-playbook get-index-content.yml -i localhost,

本案例有如下几点需要注意:

  1. gather_facts: no 这一条指明在ssh后之后,不用收集系统信息。可以大大加快执行速度。
  2. register可以把结果注册到response变量里,在后面的task里可以接着处理这个变量
  3. failed_when可以进行请求是否成功的判断,这里是根据返回码是否为200来判断
  4. 最后debug输出了响应的content部分。

使用uri模块POST一个json数据

post-json.yml的格式内容如下

- hosts: localhost
  user: root
  gather_facts: no
  tasks:
    - name: create a user
      uri:
        url: http://localhost:5000
        method: POST
        headers:
          Accept: "application/json"
        body:
          name: xnow
          age: 18
          skills:
          - Linux
          - Python
        body_format: json
        return_content: yes

执行方式:

$ ansible-playbook post-json.yml -i 192.168.4.203,

这个playbook等价于下面的curl命令

$ curl -X POST -H"content-type: application/json" http://localhost:5000 -d '{"skills": ["Linux", "Python"], "age": 18, "name": "xnow"}'

ansible-playbook 处理字符串

根据主机的IP地址生成一串主机名。假设有如下的主机ip列表,hosts.list

10.1.2.3
172.16.100.200
192.168.20.30

创建如下的ansible playbook来生成主机名:

- hosts: all
  gather_facts: no
  user: root
  vars: 
    hostname : "server-{{ inventory_hostname.split('.')[1:] | join('-') }}"

  tasks:
  - debug: var=hostname

执行过程如下:

ansible-playbook -i hosts.list string-handle.yml

这里的playbook需要关注如下几点:

  1. inventory_hostname 是ansible的内置变量,就是inventory清单文件里的主机地址,不需要执行ssh就可以取到。
  2. 这里的hostname生成过程是把主机地址先使用.分割,然后取后3段,使用-拼接,最后在新的字符串前面加上serser-字符串,生成的字符串如下:server-1-2-3server-16-100-200server-168-20-30

ansible-playbook变量

  • 获取inventory清单文件里定义的主机变量

如下清单文件,我们给每个主机,定义一些变量,比如类型,或者主机的vip地址。

10.1.2.3  type=master vip=10.1.100.100
172.16.100.200  type=slave                                                                                                                                                                             
192.168.20.30  type=slave

使用如下的playbook来获取变量:

- hosts: all
  gather_facts: yes
  user: root
  
  tasks:
  - debug: var=ansible_host
  - debug: var=hostvars[ansible_host].vip
  - debug: var=hostvars[ansible_host]["ansible_os_family"]

指向方式如下:

ansible-playbook  -i hosts.list inventory-vars.yml 

playbook的变量含义如下:

  1. 要获取主机的系统变量,需要开启gather_facts: yes
  2. ansible_host是清单文件中的资产列表名称,如果是ip,则是对应ip,如果是域名,则是对应的域名
  3. hostvars[ansible_host].vip, 获取主机的自定义变量vip,如果没有定义这个变量,则输出:"hostvars[ansible_host].vip": "VARIABLE IS NOT DEFINED!"
  4. hostvars[ansible_host]["ansible_os_family"],这个是获取主机的操作系统类型,如果直接debug hostvars可以看到所有的系统配置变量。
  5. hostvas是以json格式组织的,可以通过hostvars[ansible_host]这种字典的方式来获取,也可以通过hostvars[ansible_host].vip这种类成员的方式来获取。

使用with_items循环

with_items可以用来遍历列表,如下的playbook把配置文件挨个copy到目标机器的过程。

- hosts: all
  user: root
  gather_facts: no
  tasks:
  - name: copy system file to remote
    copy: src={{ item }} dest={{ item }}
    with_items:
    - /tmp/app.log
    - /tmp/test.py

  - name: nginx file to remote
    copy: src={{ item.src }}  dest={{ item.dest }}
    with_items:
    - src: nginx.conf
      dest: /etc/nginx/nginx.conf
    - src: index.html
      dest: /var/html/index.html

执行方法:略。

这个playbook里有2个task,分别把本地的四个文件复制到对应主机的对应目录下,两个task中的item有些微的差别,可注意观察下。

当前暂无评论 »

添加新评论 »