Ansible使用教程

ansible官方文档

ansbile官方文档中文版

一 安装使用

1.1 离线安装ansible

首先,在一台能联网的机器上,下载ansible的epel源以及createrepo rpm包

# yum install createrepo && yum install yum-utils #上rpm search下载需要的rpm包
# yum install https:*//dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

其次下载ansible需要的所有依赖包到本地目录

# mkdir /root/mypackages
# yumdownloader --resolve --destdir /root/mypackages/ ansible

离线机器上配置本地yum

# vi /etc/yum.repos.d/centos76.repo
[centos76]
name=centos76
baseurl=file:///root/centos76
gpgcheck=0
enabled=1

上传ansible包到本地yum源,并上传createrepo rpm包

# rz  
# tar zxvf ansible.tar.gz
# mv mypackages/* /root/centos76/Packages/ 
# yum install createrepo
# yum clean all
# createrepo /root/centos76  # 提前使用rpm -ivh的方式安装createrepo的rpm包
# yum update
# yum repolist
# yum list|grep ansible  # 查看ansible源

安装ansible

# yum install -y ansible

1.2 ansible小试牛刀

ansible是集合众多运维工具的优点为一身的、基于python开发的自动化运维工具,实现了批量配置、批量部署、批量运行命令等等功能。

通过账号密码管理多台主机

# vim /etc/ansible/hosts
[webservers]
172.24.110.171:22

[webservers]是名字自定义的组,通过分组管理,执行命令判断是否连接成功

# ansible dbservers -m ping -uroot -k

当然也可以,在配置文件中指定账号和密码

[webservers]
172.24.110.171:22 ansible_ssh_user=root ansible_ssh_pass="1qaz2wsx!@"
# ansible dbservers -m ping

指定私钥文件,进行ssh认证(推荐)

# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]  #回车输入密码
# vim /etc/ansible/hosts
[webservers]
172.24.110.171:22 ansible_ssh_private_key_file=/root/.ssh/id_rsa
# ansible dbservers -m ping

二 ansible常见模块

2.1 shell模块

shell模块 执行shell命令

- name: 在指定目录执行cmd命令.
  shell:
    cmd: ls -l | grep log
    chdir: somedir/
  • cmd 可执行命令
  • chdir 工作目录
# ansible webservers -m shell -a 'chdir=/root echo 'xx'> test.txt && cat test.txt'

2.2 copy模块

copy模块 文件复制

- name: 复制本机文件到远程主机,并指定属主、属组、权限
  copy:
    src: /srv/myfiles/foo.conf
    dest: /etc/foo.conf
    owner: foo
    group: foo
    mode: '0644'
  • src 本机文件或者整个目录
  • dest 远程主机文件或者目录,不存在目录会自动创建
  • owner 指定复制后的属主
  • group 指定复制后的属组
  • mode 指定文件或者目录权限
# ansible webservers -m copy -a 'src=/root/test/ dest=/root/test/ mode=777'
# ansible webservers -m shell -a 'ls /root/test'

2.3 file模块

file模块 文件管理

- name: 不存在的情况下创建一个目录
  file:
    path: /etc/some_directory
    state: directory
    mode: '0755'
- name: 创建文件指定权限
  file:
    path: /etc/foo.conf
    state: touch
    mode: u=rw,g=r,o=r
- name: 递归更改目录以及目录下文件的属组、属主
  file:
    path: /etc/foo
    state: directory
    recurse: yes
    owner: foo
    group: foo
- name: 递归删除目录
  file:
    path: /etc/foo
    state: absent

2.4 yum模块

yum模块 软件包管理

- name: 通过网络链接安装nginx
  yum:
    name: http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
    state: present
- name: 安装多个软件依赖包
  yum:
    name:
      - nginx
      - postgresql
      - postgresql-server
    state: present
- name: 卸载软件依赖包
  yum:
    name: httpd
    state: absent
- name: 下载nginx依赖包到指定目录,而不安装
  yum:
    name:
      - nginx
    state: latest
    download_only: true
    download_dir: /root/download
  • name 指定软件列表
  • state present安装、absent卸载、latest安装
  • download_only 下载依赖包
  • download_dir 依赖包下载后保存的目录
# ansible webservers -m yum -a 'name=nginx state=latest download_dir=/root/nginx download_only=true'

通过shell模块查看/root/nginx目录,可以看到安装nginx需要的依赖包

# ansible webservers -m shell -a 'ls /root/nginx'
172.24.110.171 | CHANGED | rc=0 >>
centos-indexhtml-7-9.el7.centos.noarch.rpm
dejavu-fonts-common-2.33-6.el7.noarch.rpm
nginx-mod-http-image-filter-1.16.1-1.el7.x86_64.rpm
......

2.5 systemd 模块

systemd模块 服务管理

- name: 重启crond服务
  systemd:
    state: restarted
    daemon_reload: yes
    name: crond
- name: 重启,并设置为系统服务
  systemd:
    name: docker
    state: restarted
    enabled: yes
  • name 服务名称
  • state started|stopped|restarted

2.6 unarchive 模块

unarchive模块 解压缩

2.7 debug模块

debug模块 调试打印模块

- debug: 打印消息msg,msg不指定默认 Hello World
    msg: "message"
- name: 用来打印变量
  debug:
    var: hostvars[inventory_hostname]
    verbosity: 4
  • msg 指定消息类容
  • var 变量
  • verbosity 消息级别,默认0
# ansible webservers -m debug -a 'var=hostvars[inventory_hostname] verbosity=0' 
# ansible webservers -m debug -a 'var=abc' -e abc=123   -e指定变量abc的值为123

三 playbook 使用

3.1 变量

ansbile变量教程

变量是应用于多个主机的便捷方式; 实际在主机执行之前,变量会对每个主机添加,然后在执行中引用。

  • 命令行传递
-e var=value
# ansible webservers -m debug -a 'var=abc' -e abc=123
  • 主机变量、组变量、所有组变量, inventory中定义
[webservers]
172.24.110.171:22 ansible_ssh_private_key_file=/root/.ssh/id_rsa app1=web1
[webservers:vars]
app2=we2
[all:vars]
app3=web3
# ansible webservers -m debug -a 'var=app2' #在主机中上可以使用app1、app2、app3这三个变量
  • 单文件存储

Ansible中的首选做法是不将变量存储在Inventory中。

除了将变量直接存储在Inventory文件之外,主机和组变量还可以存储在相对于Inventory文件的单个文件中。

组变量:

group_vars 存放的是组变量

group_vars/all.yml 表示所有主机有效,等同于[all:vars]

grous_vars/etcd.yml 表示etcd组主机有效,等同于[etcd:vars]

# vi /etc/ansible/group_vars/all.yml
work_dir: /data
# vi /etc/ansible/group_vars/webservers.yml
nginx_port: 80
# ansible webservers -m debug -a 'var=nginx_port'
  • 在Playbook中定义
- hosts: webservers
  vars:
    http_port: 80
    server_name: www.ctnrs.com
  • Register变量

register变量是将执行结果保存到register字段中,该字段如下result为JSON类型

- shell: /usr/bin/uptime
  register: result
- debug:
    var: result

3.2 playbook示例

playbook入门

playbook官方中文教程

playbook 是对任务进行管理、批量执行的快捷工具,参数如下:

  • — 对多个组进行分割

  • hosts 指定运行任务的主机组

  • vars 定义变量

  • tasks 多个任务组成,每个任务由 -name开始

    • name 任务名称
    • shell 任务模块为shell模块
    • register 将执行结果注入到变量中
    • tags 指定任务标签,对任务进行分组
    • when 条件判断,成立则运行任务
    • with_items …循环,循环结果保存在 item变量中
---
- hosts: webservers
  remote_user: root
  vars:
    http: 80
  tasks:
    - name: ls
      shell: 
        chdir: /
        cmd: ls
      register: result
      tags: ls
    - name: 打印ls执行结果
      debug: var=result.stdout_lines
      tags: debug,print
    - name: when条件执行
      debug:
        msg: "{{ http }}"
      when:  http  == 80
    - name: 普通循环演示
      debug: var={{ item }}
      with_items:
       - 1
       - 2

匹配任务标签,进行相应的任务

# ansible-playbook playbook01.yaml  -t "ls,debug"

3.3 template模板文件

playbook中的模板文件能使用playbook中的变量,同时可以使用jinja2语言进行编程操作,能够进行持久化保存并且能够使配置得到高效的管理

  • 模板文件存放在playbook文件同层次的templates目录,以 .j2为后缀

如下安装nginx,并设置nginx虚拟主机:

# vim playbook02.yaml
---
- hosts: all
  remote_user: root
  vars:
    nginx_vhost_port:
      - 81
      - 82
      - 83

  tasks:
    - name: Templage Nginx Config
      template: src=nginx.conf.j2 dest=/tmp/nginx_test.conf
# vim templates/nginx.conf.j2
{% for port in nginx_vhost_port %}
server{
     listen: {{ port }};
     server_name: localhost;
}
{% endfor %}
# ansible-playbook playbook02.yaml

上另外一台主机查看:

# cat /tmp/nginx_test.conf 
server{
     listen: 81;
     server_name: localhost;
}
server{
     listen: 82;
     server_name: localhost;
}s
server{
     listen: 83;
     server_name: localhost;
}

3.4 roles管理

ansible roles分模块对不同的模块的任务进行管理,roles目录结构固定

# ansible-galaxy init nginx
# tree .
├── site.yml
├── nginx
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│       └── main.yml

如下只需要在tasks下面的main.yml正常定义任务即可

# vim nginx/tasks/main.yml
---
- name: nginx任务
  shell:
   chdir: /
   cmd: ls
  tags: ls,print
  register: result
- name: debug任务
  debug: var=result
# vim site.yml
- hosts: webservers
  gather_facts: false
  roles:
    - nginx
  • roles 指定nginx目录的名字,通过目录名字区分模块
#  ansible-playbook site.yaml -t 'ls'

3.5 使用技巧

group_vars或者ansible.cfg目录和配置文件可以单独指定,应该和hosts在同层次路径,hosts可以在运行ansible命令时通过-i参数指定。

比如我们要部署大型集群,可以单独指定一个目录存放所有的相关配置:

# tree lamp/
lamp/
├── ansible.cfg
├── group_vars
│   └── all.yml
├── hosts
├── nginx
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│       └── main.yml
└── site.yml
# cat lamp/group_vars/all.yml 
work_dir: /opt/lamp
 cat lamp/nginx/tasks/main.yml 
---
# tasks file for nginx
- name: 打印全局组变量
  debug: 
    var: work_dir

指定-i hosts运行时,nginx任务打印的work_dir参数,能够从hosts同层次目录的group_vars中获取

# ansible-playbook -i hosts site.yml 
......
PLAY [webservers] ***********************************************************************************************************************************

TASK [nginx : 打印全局组变量] ******************************************************************************************************************************
ok: [172.17.239.251] => {
    "work_dir": "/opt/lamp"
}
ok: [172.17.239.252] => {
    "work_dir": "/opt/lamp"
}

PLAY RECAP ******************************************************************************************************************************************
172.17.239.251             : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.17.239.252             : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

你可能感兴趣的:(【,Kubernetes,】)