对于chef,puppet, ansible 这种工具,我一向的态度都是这些都是重复造出来的轮子。
这两天使用了下ansible,记录下心得。
1. ubuntu 上安装ansible。
-
apt-get install ansible sshpass
-
#允许本地root 登陆
-
passwd root
-
vim /etc/ssh/sshd_config
-
修改内容为
-
#PermitRootLogin without-password
PermitRootLogin yes
-
#重启ssh
-
service ssh restart
2. ansible 的配置文件查找顺序
-
ANSIBLE_CONFIG 环境变量
-
./ansible.cfg 当前目录ansible.cfg
-
~/.ansible.cfg 家目录ansible.cfg
-
/etc/ansible/ansible.cfg /etc/ansible/这个目录通过yum/apt安装会自动创建
3. ansible 默认用户使用(key-based) 的ssh 登陆。首先添加host group.
-
vim /etc/ansible/hosts
-
[hosts]
-
10.14.10.84
-
10.14.10.83
执行命令:
ansible hosts -a "free -m" -u root
常见的错误是
-
FAILED => Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.
-
Please add this host's fingerprint to your known_hosts file to manage this host.
碰到这个可以先使用下面的命令添加key.
-
ansible hosts -a "free -m" -u root
-
然后再使用 --ask-pass (-k flag).
-
ansible hosts -a "free -m" -u root -k
-
#ansible 默认-m的模块是'command', 可以省略,上面的命令等同于下面。
-
ansible hosts -m shell "free -m" -u root
-
ansible hosts -m shell "free -m" -u root -k
-
第二种方法则是,
我们可以直接修改ansible.cfg, 将host_key_checking 设置为False.
-
vim /etc/ansible/ansible.cfg
-
# uncomment this to disable SSH key host checking
-
host_key_checking = False
4. apply playbook to rhel .
写一个playbook, yaml 的语法其实挺恶心的,太多都需要空格了。容易看,不容易写。
能看的出来这个playbook就是装apache,然后start httpd 服务,最下面的则是debug 用的。
-
vim rhel_pb.yml
-
- hosts: rhel7
-
remote_user: root
-
tasks:
-
-
- name: Install httpd package
-
yum: name=httpd state=latest
-
sudo: yes
-
-
- name: Starting httpd service
-
service: name=httpd state=started
-
sudo: yes
-
-
- name: Show how debug works
-
debug: msg={{ ansible_distribution }}
-
在/etc/ansible/hosts 添加 rhel7.
apply playbook
-
ansible-playbook -D rhel_pb.yml -k
如果需要查看更多debug信息,可以加上-v,-vv,-vvv .
-
ansible-playbook -D rhel_pb.yml -k -v
-
ansible-playbook -D rhel_pb.yml -k -vv
-
ansible-playbook -D rhel_pb.yml -k -vvv
list all the tasks in the playbook
-
ansible-playbook -D rhel_pb.yml -k -v --list-tasks
-
play #1 (rhel7):
Install httpd package
Starting httpd service
Show how debug works
--start-at : 将会从指定的任务开始执行。例如我们从'Starting httpd service'开始执行
-
ansible-playbook -D rhel_pb.yml -k --start-at-task='Starting httpd service'
--step: 一步一步的执行
-
ansible-playbook -D rhel_pb.yml -k --step
使用嵌套的playbook.
-
vim apache.yml
-
---
-
- hosts: hosts
-
remote_user: root
-
-
vars:
-
- package_name: 'httpd'
-
-
tasks:
-
- include: install_apache.yml
-
-
- name: Check apache service
-
service: name={{ package_name }} state=started
-
sudo: yes
vars: 下面的语句设置了一个变量 package_name.
-
vim install_apache.yml
-
- set_fact: package_name='httpd'
-
when: ansible_os_family=='Redhat'
-
-
- set_fact: package_name='apache2'
-
when: ansible_os_family=='Debian'
-
-
- name: Install httpd package
-
yum: name=httpd state=latest
-
sudo: yes
-
when: ansible_os_family=='Redhat'
-
-
- name: Install apache2 package
-
apt: name=apache2 state=latest
-
sudo: yes
-
when: ansible_os_family=='Debian'
-
apply apache.yml 就可以了
-
ansible-playbook -D apache.yml -k
playbook的内容比较self-explanation, 对于debian OS,使用apt,对于redhat ,则使用 yum. 模块, ansible 的模块众多,据说有100多个。
下面的命令可以查看ansible 的模块。
后记: 我不喜欢chef, puppet, 我对于ansible 所说的简单,易用也持怀疑态度。
根据我的观察,很大可能 ansible 也只是再把简单的东西复杂化,又是个重复造轮子造出来的东西。
如果不用yum,不用apt, 我自己编译呢? 对于希望一步步控制细节的人来说,configuration-manager 这些东西都是在把简单的东西复杂化。
参考:
learning ansible
阅读(807) | 评论(0) | 转发(0) |