前言:
学习下ansible的playbooks的状态配置管理,说来puppet saltstack都有类似的叫法,只是ansible的叫法更犀利,我当时一看playbook还以为是花花公子的playboy。要使用ansible就要深入学习playbook配置及模板。playbook的模板使用python的jinja2模块来处理的。学习过saltsatck的朋友,应该对此模板是比较熟悉的。
注:到底是playbook还是playbooks。。。。
先把官网的简单几个语法给说明下。
#这个是你选择的主机
- hosts: webservers
#这个是变量
vars:
http_port: 80
max_clients: 200
#远端的执行权限
remote_user: root
tasks:
#利用yum模块来操作
- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
#触发重启服务器
notify:
- restart apache
- name: ensure apache is running
service: name=httpd state=started
#这里的restart apache 和上面的触发是配对的。这就是handlers的作用。相当于tag
handlers:
- name: restart apache
service: name=httpd state=restarted
如果有些系统做了相关的sudo限制,需要在playbooks里面开启sodu,或者直接偷懒,权限直接为root !
- hosts: web
remote_user: xiaorui
tasks:
- service: name=nginx state=started
sudo: yes
官网的基本完事了,这里就直接实战吧。先说一个简单的ansible playbook的例子。
- name: create user
hosts: web
user: root
gather_facts: false
vars:
- user: "xiaorui"
tasks:
- name: create {{ user }}
user: name="{{ user }}"
然后我们执行一下,Playbook 采用 YAML 语法结构,因此它们一般比较易于阅读并加以配置。 上面的意思已经很简单明了了,就是创建一个xiaorui的用户,里面引用了一个user的变量,用jinja2模板给赋值进去了。
原文地址为:blog.xiaorui.cc
下面的还用我说么? 多了一个service的调用,nginx的状态保持为启动。
- name: create user
hosts: web
user: root
gather_facts: false
vars:
- user: "xiaorui"
tasks:
- name: create {{ user }}
user: name="{{ user }}"
tasks:
- service: name=nginx state=started
原文地址为:blog.xiaorui.cc
使用copy传送文件的时候,经常出些问题,是ansible需要python-selinux包而已.
[root@67 ~]# ansible-playbook user.yaml
PLAY [create user] ************************************************************
TASK: [Copy file to client] ***************************************************
failed: [10.10.10.66] => {"failed": true, "md5sum": "1f18348f32c9a4694f16426798937ae2"}
msg: Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/root/user.yaml.retry
10.10.10.66 : ok=0 changed=0 unreachable=0 failed=1
yum install -y libselinux-python 就可以行了
copy是传送文件用的。
- name: create user
hosts: web
user: root
gather_facts: false
remote_user: root
vars:
- user: "xiaorui"
tasks:
- name: create {{ user }}
user: name="{{ user }}"
tasks:
- service: name=nginx state=started
tasks:
- name: Copy file to client
copy: src=/root/rs.sh dest=/root/ccc
根据一些特殊的情况,可以做更多的模板,比如这样
vars:
- user: "xiaorui"
- say: "xiaorui"
tasks:
- name: create {{ user }}
user: name="{{ user }}"
tasks:
- service: name=nginx state=started
tasks:
- name: Copy file to client
# copy: src=/root/rs.sh dest=/root/ccc
template: src=/root/testfile dest=/root/{{ say }}
不只是这样,我可以把刚才那个say变量传到文件里面。 爽吧? 其实和saltstack一样。。。。
原文地址: blog.xiaorui.cc
再来一个和puppet exec一样执行外部命令的模块
tasks: - name: "cmd" action: command touch /root/1111
还有一种shell模块的使用方法 。
tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true
ansible在多任务下,推荐使用多进程模式的。其实就是用multiprocess做的多进程池 ! -f 10 就是limit 10个任务并发。
ansible-playbook user.yml -f 10
顺便讲解下,在ansible下,类似puppet的facter,saltstack grains的自定义变量。 -m setup 模块
咱们可以在模板文件中,引用这些setup系统变量的
#xiaorui.cc
{{ ansible_devices.sda.model }}
{{ ansible_hostname }}
{{ ansible_machine }}
如果一下子查看所有的setup会信息太多,有些乱,可以用filter过滤下
[root@67 ~]# ansible web -m setup -a "filter=ansible_mounts"
10.10.10.66 | success >> {
"ansible_facts": {
"ansible_mounts": [
{
"device": "/dev/mapper/vg_65-lv_root",
"fstype": "ext4",
"mount": "/",
"options": "rw",
"size_available": 47511494656,
"size_total": 52844687360
},
{
"device": "/dev/sda1",
"fstype": "ext4",
"mount": "/boot",
"options": "rw",
"size_available": 449800192,
"size_total": 507744256
},
{
"device": "/dev/mapper/vg_65-lv_home",
"fstype": "ext4",
"mount": "/home",
"options": "rw",
"size_available": 145807802368,
"size_total": 153817976832
}
]
},
"changed": false
}
[root@67 ~]#
如果想把这些 facts加入到template模板中,中途可能会遇到几处让人困扰的地方。
这边需要开启facts变量功能, gather_facts: no 或者是false是关闭,gather_facts:yes 或者是true都是开启。 当时没注意,找到了官方的实例,直接就干,结果sx了。咋都不行,总是提示define为定义。。。 原来facts没有开。。
{% for v in hostvars.iteritems() %}
{{ v['ansible_hostname'] }}
{% endfor %}
咱们在看看对端服务器的文件渲染情况。
用过puppet saltstack的朋友,知道Variables最后可以扩展什么东西,可以高度的定义每个配置文件。 可以根据ip地址,推送配置文件所需要的绑定的ip地址,根据内存大小,定义nginx缓存的内容大小,根据你的cpu核数,做nginx cpu的绑定,根据你的系统,我需要文件路径的判断等等。。。。。
虽然这些facts够多了,貌似很全,但是如果还不够你用,还不足以让你标识定位一台服务器,咋办? 赞一个 ansible不愧是比saltstack在国外更受欢迎的集群配置工具(据说。。。。 看了youtube的视频,几个老外说,他们热衷于去各种系统框架大会,ansible要比saltstack用的多点,其实我在有一篇文章说过,ansible为啥多? 有兴趣翻翻看看)。 说回来,saltstack的框架确实相当的优秀,但由于更新太频繁,自己不幸又是那是yum epel的人,结果中枪了。。。。
爬虫真牛逼,这里我注明下原文的地址。blog.xiaorui.cc
nima,扯远了,继续聊刚才的话题。如何自定义ansible facts变量,官方说的很明白, 在控制机创建一个文件就行了。。。
看懂了吧。 我刚才测试的时候,方法有些土,直接创建的,你可以参照一个例子,copy文件。
- hosts: web
tasks:
- name: create directory for ansible custom facts
file: state=directory recurse=yes path=/etc/ansible/facts.d
- name: install custom impi fact
copy: src=ipmi.fact dest=/etc/ansible/facts.d
- name: re-read facts after adding custom fact
setup: filter=ansible_local
ansbile还有一个有意思的功能,可以判断上个tasks的值,根据这个值在做判断。
里面的when , foot_result。。。。 懂了吧
tasks:
- shell: /usr/bin/foo
register: foo_result
ignore_errors: True
- name: "cmd"
action: command touch /root/kkkkk
when: foo_result.rc == 127
这个是测试的过程
#http://xiaorui.cc
[root@67 facts.d]# ansible web -m shell -a "ls /root/"
10.10.10.66 | success | rc=0 >>
anaconda-ks.cfg
date
install.log
install.log.syslog
l.py
nnn
qpid-python-0.20
qpid-python-0.20.tar.gz
testfile
urllib-post.py
[root@67 facts.d]# ansible-playbook cmd.yaml
PLAY [web] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [10.10.10.66]
TASK: [shell /usr/bin/foo] ****************************************************
failed: [10.10.10.66] => {"changed": true, "cmd": "/usr/bin/foo ", "delta": "0:00:00.002429", "end": "2014-05-18 10:25:12.544151", "rc": 127, "start": "2014-05-18 10:25:12.541722"}
stderr: /bin/sh: /usr/bin/foo: No such file or directory
...ignoring
TASK: [cmd] *******************************************************************
changed: [10.10.10.66]
PLAY RECAP ********************************************************************
10.10.10.66 : ok=3 changed=2 unreachable=0 failed=0
[root@67 facts.d]# ansible web -m shell -a "ls /root/"
10.10.10.66 | success | rc=0 >>
anaconda-ks.cfg
date
install.log
install.log.syslog
kkkkk
l.py
nnn
qpid-python-0.20
qpid-python-0.20.tar.gz
testfile
urllib-post.py
[root@67 facts.d]#
好了,先这么着吧。。。。 这两天再讲解下 用ansible如何多元配置nginx、lvs keepalived的环境。








