ansible简单学习笔记 | 阿小信的博客
阿小信大人的头像
Talk is cheap. Show me the code. Linus Torvalds

ansible简单学习笔记2014-12-16 16:06

安装和配置

安装

sudo pip install ansible

创建并编辑ansible的hosts文件,内容为已经配置ssh免密码登录的远程主机的地址。

# /etc/ansible/hosts是默认路径
sudo mkdir /etc/ansible
sudo vi /etc/ansible/hosts

内容为INI格式:

192.168.1.134
192.168.1.136

也可以进行分组,同一个机器可以在不同分组

[v1]
192.168.1.134

[v2]
192.168.1.136

如果远程的ssh端口修改了不在22标准端口,文件内容中机器地址应该明确指定端口号如:192.168.1.134:2222

配置ssh免密码登录远程主机:

# 当前用户名与远程机器上相同,ssh key在默认位置
ssh-copy-id 192.168.1.136
ssh-copy-id 192.168.1.134

避免重复输入密钥的短语密码:

ssh-add ~/.ssh/id_rsa

在本地测试是否能够ping通:

# ping全部机器
ansible all -m ping

# 以ashin用户身份ping .134
ansible 192.168.1.134 -m ping -u ashin

# 以用户ashin身份使用sudo来ping v1 (.134)
# -K是输入root密码
ansible v1 -m ping -u ashin --sudo -K

配置文件

配置文件可以从多个地方加载,其优先级顺序为:

  • ANSIBLE_CONFIG (环境变量)
  • ansible.cfg (当前目录)
  • .ansible.cfg (home目录)
  • /etc/ansible/ansible.cfg

定义自己的配置文件可以参考https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg

ssh检查key是通过paramiko进行的,很慢。 不检查host key配置:

sudo vi etc/ansible/ansible.cfg
# or ~/.ansible.cfg

内容为:

[defaults]
host_key_checking = False

Pattern:

ansible <pattern_goes_here> -m <module_name> -a <arguments>

pattern可以直接指定某一机器地址或hosts中的组名,同时指定多个组或者多个ip使用:分割:

one.example.com
one.example.com:two.example.com
192.168.1.136
v1
v1:v2

也可以用all*表示全部:

all
*
192.168.1.*

!表示非:

v1:!v2   #表示在v1分组中,但是不在v2中的hosts

&表示交集部分:

webservers:&dbservers  #表示在webservers分组中,同时也在dbservers分组中的hosts:w

可以指定分组的下标或切片(超过范围则无法匹配):

v1[0]
v1[0:100]

也可以用~开头来使用正则:

~(web|db).*\.example\.com
~v\d

需要注意的是如果用的是zsh,有这些类似于*![等这些特殊符号需要用单引号包裹。

执行Ad-Hoc命令(就是无需保存的快速执行shell命令):

使用-a指定命令, -f指定并发数(默认为5), -m是选择使用的模块:

执行shell

# 打印hello
ansible all -a "/bin/echo hello"

# 重启
ansible all -a "/sbin/reboot" -f 10 --sudo -K

# 使用shell模块 注意当前shell的引号问题
ansible all -m shell -a 'ls -al ~'

文件操作

# 传输文件
ansible all -m copy -a "src=~/projects/tests/t.py dest=~"

# 修改文件权限,所有者,分组(这些参数可以用在copy模块中)
ansible all -m file -a "dest=~/t.py mode=777 owner=ashin group=ashin"

# 创建文件夹
ansible all -m file -a "dest=~/tests mode=755 owner=ashin group=ashin state=directory"

# 删除文件夹
ansible all -m file -a "dest=~/tests state=absent"

安装软件

使用yumapt模块可以进行软件的安装

# 确保某个程序已经安装,并保持当前版本,如果没安装则进行安装
ansible v1 -m apt -a "name=python-pip state=present" --sudo -K

# 确保安装最新版本
ansible v1 -m apt -a "name=git state=latest"

# 确保没有安装某个程序,安装了则卸载
ansible v1 -m apt -a "name=git state=absent" --sudo -K

用户管理

# 新建用户
ansible all -m user -a "name=foo password=foo" --sudo -K

# 删除用户
ansible all -m user -a "name=foo state=absent" --sudo -K

Git

# 使用https方式检出代码到本地,前提是要先通过apt模块安装git
# dest目录必须是空文件夹或者还不存在的文件夹

ansible v1 -m git -a "repo=https://github.com/axiaoxin/json_line_format.vim.git dest=~/project-dir version=HEAD"

服务管理

# 确保某服务已开启,没开则开
ansible v1 -m service -a "name=mysql state=started" --sudo -K
ansible v1 -m service -a "name=mysql state=restarted" --sudo -K
ansible v1 -m service -a "name=mysql state=stopped" --sudo -K

Playbooks

YAML语法

playbooks使用yaml语法,在ansible中几乎所有的yaml文件都是以list开始,每个item是键值对的list。

所有的yaml文件都以---开头表示开始一个document,所有的列表元素以-开头,键值对用:,后面的空格是必须的。(如果官网文档中有指出空格那一定是merge了我的pull request^_^)

键值对中的值如果是bool类型的字符串true/false(首字母不论大小写),pyyaml会load成python中对应的bool值,在键值对中如果值中有:或者以{{开头的变量定义,则必须用引号引起来

ping示例

新建文件test.yml内容为:

---
- hosts: v1
remote_user: ashin
tasks:
    - name: test connection
    ping:
    remote_user: ashin

运行:

ansible-playbook test.yml

一个playbook文件可以引入其他的yml文件,实现复用。- include: path/other.yml

roles

使用roles可以更好的组织框架,简单例子:

当前目录结构:

.
├── hosts
├── roles
│   └── common
│       └── tasks
│           └── main.yml
└── site.yml

site.yml文件是入口,内容为

---
- hosts: all
  roles:
    - role: common

- hosts: v1
  tasks:
    - include: roles/common/tasks/main.yml

commom角色是用于在全部主机上执行的任务,任务为ping,tasks中文件名必须为main,其内容为

---
- name: test connection
  ping:

v1角色是通过include直接指定task。运行:

ansible-playbook site.yml -vv

应该就能看到返回结果。

role下有很多结构,ansible会自动按照文件结构进行加载解析。具体目录结构如下:

.
├── defaults
├── files
├── handlers
├── meta
├── tasks
├── templates
└── vars

如果roles/x/tasks/main.yml存在,则自动将里面的tasks添加到play中。

如果roles/x/handlers/main.yml存在,则自动将里面的handlers添加到play中。

如果roles/x/vars/main.yml存在, 则自动将其中的variables添加到play中。

如果roles/x/meta/main.yml存在,则添加role的依赖关系roles中。

任何copy任务、script任务都可以引用roles/x/files中的文件,无论是使用绝对或相对路径都可以。

任何template任务都可以引用roles/x/templates中的文件,无论绝对或相对路径。

任何include任务都可以引用roles/x/tasks/中的文件,无论相对或绝对路径

具体可以参见文档:http://docs.ansible.com/playbooks_intro.html

变量

变量使用jinja语法。默认就有很多保留变量。自定义的变量通过vars直接以键值对方式定义,也可以使用vars_files以列表方式指定保存定义变量的文件。也可以通过命令行使用--extra-vars参数指定

全局的变量放在group_vars/all中,局部变量放在group_vars/x中,特定的host使用特定的变量可以使用host_vars/x,子group中的变量会覆盖上级变量,hosts变量总是覆盖groups变量

可以用playbook打印下变量:

---
- hosts: v1
  tasks:
    - name: echo
      command: echo {{ groups }}
      when: ansible_os_family == "Debian"

运行:

ansible-playbook echo.yml -vv

具体见文档:http://docs.ansible.com/playbooks_variables.html

如果您觉得从我的分享中得到了帮助,并且希望我的博客持续发展下去,请点击支付宝捐赠,谢谢!

若非特别声明,文章均为阿小信的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除。

#Linux/Mac#  
分享到:
阅读[31271] 评论[4]

上一篇:[转]/dev/zero

你可能也感兴趣的文章推荐

本文最近访客

网友54.*.*.22[火星]2018-08-21 08:29
网友220.*.*.122[北京]2018-08-21 08:22
网友46.*.*.82[火星]2018-08-21 08:17
网友46.*.*.81[火星]2018-08-21 08:14

发表评论

#1 网友121.*.*.102[南京]24709 :
<img src="http://d05.res.meilishuo.net/pic/_o/6f/a9/3e58c0737ba3b413a25eca436769_600_800.c1.jpg_2e0281cc_s1_q0_150_5_0_226_800.jpg">不错</img>
2016-01-13 15:38 回复
#3 网友125.*.*.18[杭州]55699 :
sfasdf
2017-06-20 20:06 回复
#4 网友10.*.*.229[火星]66233 :
gfdas
2017-12-21 10:53 回复