ansible主机清单——playbook剧本
一、ansible的主机清单
ansible默认的主机清单是/etc/ansible/hosts文件
主机清单可以手动设置,也可以通过Dynamic Inventory动态生成
一般的主机名使用FQDN
vim /etc/ansible/hosts
...
[websever] #方括号设置组名
www1.example.org #定义被监控主机,这里可以是主机名也可以是IP地址,主机名需要修改/etc/hsots文件
www2.example.org:2222 #冒号后面定义远程连接端口,默认是ssh 的22端口
如果是名称类似的主机,可以使用列表的方式标识各个主机
[webserver]
www[01:50].example.org ansible_ssh_user=root ansible_ssh_pass=123456
[dbbserver]
db-[a:f].example.org #支持匹配a b c ....f
下面是Inventory中变量
(1)主机变量
[webserver]
www1magedu.com http_port=80 maxRequestsChild=808
www2magedu.com http_port=8080 maxRequestsChild=909
(2)组变量
[server:vars]
ntp_server=ntp.example.org
nfs_server=nfs.example.org
(3)组嵌套
[apache]
http1.example.org
http2.example.org
[nginx]
ngx1.example.org
ngx2.example.org
[webservers:children]
apache
nginx
(4)inventory变量参数
参数 | 说明 |
---|---|
ansible_ssh_host | 将要连接的远程主机名。与你想要设定的主机的别名不同的话,可通过此变量设置 |
ansible_ssh_port | ssh端口号。如果不是默认的端口号,通过此变量设置 |
ansible_ssh_user | 默认的ssh用户名 |
ansible_ssh_pass | ssh密码(这种方式并不安全,强烈建议使用–ask-pass或SSH密钥) |
ansible_ssh_private_key_file | ssh使用的私钥文件。适用于有多个密钥,不想使用ssh代理的情况 |
ansible_ssh_common_args | 此设置附加到sftp,scp和ssh的缺省命令行 |
ansible_sftp_extra_args | 此设置附加到默认sftp命令行 |
ansible_scp_extra_args | 此设置附加到默认scp命令行 |
ansible_ssh_extra_args | 此设置附加到默认ssh命令行 |
ansible_ssh_pipelining | 确定是否使用SSH管道。这可以覆盖ansible.cfg中得设置 |
ansible_shell_type | 目标系统的shell类型,默认情况下,命令的执行使用‘sh’语法,可设置为’csh’或’fish’ |
ansible_python_interpreter | 目标主机的python路径。适用于的情况:系统中有多个python,或者命令路径不是’/usr/bin/python’ |
ansible_*_nterpreter | 这里的“*”可以是ruby或perl或其他语言的解释器,作用和ansible_python_interpreter类似 |
ansible_shell_executable | 这将设置ansible控制器将在目标机器上使用shell,覆盖ansible.cfg中的配置,默认为/bin/sh。 |
二、YAML
yaml:是一种非标记语言。是用来写配置文件的语言,非常简介和强大。
yaml语法和其他语言类似,也可以表达散列表、标量等数据结构。
结构通过空格来展示;序列里配置项通过 - 表示;Map里键值使用 : 来分割;yaml的扩展名为yaml
基本语法规则:
1、大小写敏感
2、使用缩进表示层级关系
3、缩进时不允许使用Tab键,只允许使用空格
4、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
YAML支持的数据结构:
1、对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)
- 例如: name:Example Developer
键 值
⒉、数组:一组按次序排列的值,又称为序列(sequence)/列表(list)
- 例如: -Apple
-Orange
3、纯量:单个的、不可再分的值
- 例如:number:12.30
sure: true
yaml示例:
name:zhangsan
age:20
name:lisi
age:22
people:
三、Playbook
1、playbook概述
playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。
ansible通过不同的模块实现相应的管理,管理的方式通过定义的清单文件(hosts)所管理的主机包括认证的方式连接的端口等。所有的功能都是通过调用不同的模块(modules)来完成不同的功能的。不管是执行单条命令还是play-book都是基于清单文件。
playbook由YMAL语言编写。YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。
一个剧本里面可以有多个play,每个play只能有一个tasks,每个tasks可以有多个name
核心元素:
Playbooks
Variables #变量元素,可传递给Tasks/Templates使用;
Tasks #任务元素,由模块定义的操作的列表,即调用模块完成任务;
Templates #模板元素,使用了模板语法的文本文件;
Handlers #处理器元素,通常指在某事件满足时触发的操作;
Roles #角色元素
playbook的基础组件:
组件 | 信息 |
---|---|
name | 定义playbook或者task的名称(描述信息),每一个play都可以完成一个任务。 |
hosts | hosts用于指定要执行指定任务的主机. |
user | remote_user则用于指定远程主机上的执行任务的用户 |
tasks | 任务列表play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。 |
vars | 定义变量(如果不使用内部变量需要提前定义) |
vars_files | 调用定义变量文件 |
notify | 任务执行结果如果是发生更改了的则触发定义在handler的任务执行 |
handlers | 用于当前关注的资源发生变化时采取一定指定的操作 |
2、playbook剧本
1、执行一个playbook
格式:
ansible-playbook [yaml文件名]
例如:ansible-playbook ping.yml
参数:
-k(-ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u 指定用户
补充命令:
ansible-playbook nginx.yaml --syntax-check #检查yaml文件的语法是否正确
ansible-playbook nginx.yaml --list-task #检查tasks任务
ansible-playbook nginx.yaml --list-hosts #检查生效的主机
ansible-playbook nginx.yaml --start-at-task='Copy Nginx.conf’ #指定从某个task开始运行
示例:
vim a.yml
- hosts: webserver #定义的主机组,即应用的主机
vars: #定义变量
http_port:80
max_clients: 200
user: root
tasks: #执行的任务
- name: ensure apache is at the latest vertion
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
handles: #处理器
- name:restart apahce
service: name=httpd state=restarted
2、hosts和users介绍
- hosts: webserver #指定主机组,可以是一个或多个组。
remote_user: root #指定远程主机执行的用户名
vim ping.yml
- hosts: mysql
remote_user: root
tasks:
- name: test connection
ping:
remote_user: mysql #指定远程主机执行tasks的运行用户为mysql
执行playbook时: ansible-playbook ping.yml -k
3、指定远程主机sudo切换用户
- hosts: mysql
remote_user: root
become: yes #2.6版本以后的参数,之前是sudo,意思为切换用户运行
become_user: mysql #指定sudo用户为mysql
tasks:
- name: copy text
copy: src=/etc/fstab dest=/home/mysql/fstab.bak
执行playbook时: ansible-playbook ping.yml -K
示例:
vim a.yml
- hosts: 192.168.28.20
remote_user: root
tasks:
- name: disable selinux
command: " /sbin/setenforce o'
- name: make sure apache is running
service: name=httpd state=started
play中只要执行命令的返回值不为0,就会报错,tasks停止
修改如下
---
- hosts: webserver
remote_user: root
tasks:
- name: disable selinux
command: '/sbin/setenforce 0'
ignore_errors: True #忽略错误,强制返回成功
- name: make sure apache is running
service: name=httpd state=started
4、playbook使用变量的方法:
1.通过ansible命令传递
例如:编辑如下yaml
vim a.yml
---
- hosts: mysql
remote_user: root
vars:
-user:
tasks:
- name: add new user
user: name={{user}}
然后执行命令:ansible-playbook a.yml -e "user=testvar"
可以执行命令查看: ansible mysql -m command -a 'tail /etc/passwd'
2.直接在yaml中定义变量---如上handlers示例
3.直接引用一些变量
如:引用ansible的固定变量
vim test.yml
- hosts: mysql
remote_user: root
tasks:
- name: copy file
copy: content="ffansible_all_ipv4_addresses)}" dest=/opt/vars.txt
执行命令:ansible-playbook test.yml
去183上查看vars.txt文件内容
再如:引用主机变量
vim /etc/ansible/hosts
在mysql组的主机后面添加如下
[mysql]
192.168.28.40 testvar="80.183"
#定义testvar变量的值为80.183
vim test.yml #添加{ftestvar}主机变量
- hosts: mysql
remote_user: root
tasks:
- name: copy file
copy: content="{{ansible_all_ipv4_addresses}}.{{testvarl}}" dest=/opt/vars.txt
执行命令: ansible-playbook test.yml
去183上查看vars.txt文件内容
5、条件测试
如果需要根据变量、facts (setup)或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,
在task后添加when子句即可使用条件测试: when子句支持jinjia2表达式或语法,例如:
vim when.yml
- hosts: mysql
remote_user: root
tasks:
- name: "shutdown CentOS"
command: /sbin/shutdown -h now
when: ansible_distribution == "CentOS"
1、多条件判断
vim when.yml
- hosts: mysql
remote_user: root
tasks:
- name: "shut down CentOS 7 systems"
command: /sbin/shutdown -r now
when:
- ansible_distribution == "CentOS"
- ansible_distribution_major_version == “7”
2、组条件判断
vim when.yml
- hosts: mysql
remote_user: root
tasks:
- name: "shut down CentOs 6 and Debian 7 systems"
command: /sbin/shutdown -t now
when: (ansible_distribution == "CentOs" and ansible_distribution_major_version == "6") or(ansible_distribution == "Debian" and ansible_distribution_major_version == "7")
6、迭代
当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明
vim d.yml
- hosts: webserver
remote_user: root
tasks:
- name: "Install Packages"
yum: name=ff item state=latest
with_items:
- httpd
- mysql-server
- php
也可以自己定义
vim d.yml
- hosts: webserver
remote_user: root
tasks:
- name: "Add users"
user: name={{item.name}} state=present groups={{item.groups}}
with_items:
- { name:'test1',groups:'wheel'}
- { name:'test2',groups:'root'}