ansible-playbook的用法笔记
2019年12月13日
ansible是十分值得运维学习的技术,作为一个自动化处理工具,用好ansible可以让你你事半功倍。下面通过几个例子来演示ansible playbook的用法。例子中会有不同ansible playbook的写法,只是为了展现ansible playbook的灵活性,使用的时候,不用拘泥其中的任何一种。最基础的方法就忽略了,可以查看官方文档。
使用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,
这里执行过程有几个点需要注意:
- 这个playbook没有提供inventory文件,而是使用-i来指定了一个localhsot地址
- 使用-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,
本案例有如下几点需要注意:
gather_facts: no
这一条指明在ssh后之后,不用收集系统信息。可以大大加快执行速度。register
可以把结果注册到response变量里,在后面的task里可以接着处理这个变量failed_when
可以进行请求是否成功的判断,这里是根据返回码是否为200来判断- 最后
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需要关注如下几点:
- inventory_hostname 是ansible的内置变量,就是inventory清单文件里的主机地址,不需要执行ssh就可以取到。
- 这里的hostname生成过程是把主机地址先使用
.
分割,然后取后3段,使用-
拼接,最后在新的字符串前面加上serser-
字符串,生成的字符串如下:server-1-2-3
,server-16-100-200
,server-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的变量含义如下:
- 要获取主机的系统变量,需要开启
gather_facts: yes
ansible_host
是清单文件中的资产列表名称,如果是ip,则是对应ip,如果是域名,则是对应的域名- hostvars[ansible_host].vip, 获取主机的自定义变量vip,如果没有定义这个变量,则输出:
"hostvars[ansible_host].vip": "VARIABLE IS NOT DEFINED!"
hostvars[ansible_host]["ansible_os_family"]
,这个是获取主机的操作系统类型,如果直接debug hostvars可以看到所有的系统配置变量。- 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有些微的差别,可注意观察下。
当前暂无评论 »