目录
一、Playbook概述
1.Playbook定义
2.Playbook组成
3.Playbook配置文件详解
4.运行Playbook
4.1Ansible-Playbook相关命令
4.2运行Playbook启动httpd服务
4.3变量的定义和引用
4.4指定远程主机sudo切换用户
4.5When——条件判断
4.6迭代
4.6.1创建文件夹
4.6.2创建文件
4.6.3创建文件夹并建立用户
4.7总结
二、Templates模块
1.准备模板文件并设置引用的变量
2.修改主机清单内的变量
3.编写Playbook剧本
三、Tags模块
四、Roles模块
1.Roles目录详解
2.在Playbook中使用Roles步骤
2.1环境准备
2.2修改yml文件
2.3运行Ansible-Playbook
3.Roles模块举例——LAMP
3.1编写httpd模块
3.1.1编写yml文件
3.1.2定义变量
3.2编写Mysql模块
3.2.1编写yml文件
3.2.2定义变量
3.3编写Php模块
3.3.1编写yml文件
3.3.2定义变量
3.4编写Roles实例并启动
一、Playbook概述
1.Playbook定义
Playbook其实是Ansible服务的一个配置文件,Ansible使用Playbook的YAML语言配置编写成操作需求,实现对远端主机或策略部署,实现对远端主机的控制与管理。
2.Playbook组成
- Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行
- Variables:变量
- Templates:模板
- Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
- Roles:角色
3.Playbook配置文件详解
vim test1.yaml
---
#yaml文件以---开头,以表明这是一个yaml文件,可省略(但是如果两个YAML配置叠加的话,要以此为分割)
- name: first play
#定义一个play的名称,可省略gather_facts: false
#设置不进行facts信息收集,这可以加快执行速度,可省略hosts: webservers
#指定要执行任务的被管理主机组,如多个主机组用冒号分隔remote_user: root
#指定被管理主机上执行任务的用户tasks:
#定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行- name: test connection
#自定义任务名称ping:
#使用 module: [options] 格式来定义一个任务- name: disable selinuxcommand: '/sbin/setenforce 0'
#command模块和shell模块无需使用key=value格式ignore_errors: True
#如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务- name: disable firewalldservice: name=firewalld state=stopped
#使用 module: options 格式来定义任务,option使用key=value格式- name: install httpdyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
#这里需要一个事先准备好的/opt/httpd.conf文件notify: "restart httpd"
#如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作- name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers:
#handlers中定义的就是任务,此处handlers中的任务使用的是service模块- name: restart httpd
#notify和handlers中任务的名称必须一致service: name=httpd state=restarted
#Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。
4.运行Playbook
ansible-playbook test1.yaml
参数 | 含义 |
---|---|
-k(–ask-pass) | 用来交互输入ssh密码 |
-K(-ask-become-pass) | 用来交互输入sudo密码 |
-u | 指定用户 |
4.1Ansible-Playbook相关命令
命令 | 含义 |
---|---|
ansible-playbook test1.yaml --syntax-check | 检查yaml文件的语法是否正确 |
ansible-playbook test1.yaml --list-task | 检查tasks任务 |
ansible-playbook test1.yaml --list-hosts | 检查生效的主机 |
ansible-playbook test1.yaml --start-at-task='install httpd' | 指定从某个task开始运行 |
4.2运行Playbook启动httpd服务
cd /opt/
vim test01.yaml ---
- name: install httpdgather_facts: falsehosts: cxkremote_user: roottasks:- name: connection ceshiping:- name: disable firewalldservice: name=firewalld state=stopped- name: install apacheyum: name=httpd state=latest- name: install config filecopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf#整个任务完成才会运行notify的restart httpd- name: start httpd serviceservice: enabled=true name=httpd state=started- name: write htmlcopy: src=/opt/index.html dest=/var/www/html/index.htmlnotify: "restart httpd"handlers:- name: restart httpdservice: name=httpd state=restarted[root@localhost opt]#vim index.html
[root@localhost opt]#cat index.html
this is cxk ctrl
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
httpd.conf index.html rh test01.yaml
ansible-playbook test01.yaml --syntax-checkplaybook: test01.yamlansible-playbook test01.yaml --list-taskplaybook: test01.yamlplay #1 (cxk): install httpd TAGS: []tasks:connection ceshi TAGS: []disable firewalld TAGS: []install apache TAGS: []install config file TAGS: []start httpd service TAGS: []write html TAGS: []ansible-playbook test01.yaml --list-hostplaybook: test01.yamlplay #1 (cxk): install httpd TAGS: []pattern: [u'cxk']hosts (1):192.168.241.22
ansible-playbook test01.yaml
4.3变量的定义和引用
vim test02.yaml---
- name: variablehosts: cxkremote_user: rootvars:- groupname: wyb- username: nginxtasks:- name: create groupgroup: name={{groupname}} system=yes gid=222- name: create useruser: name={{username}} uid=111 group={{groupname}}- name: copy filecopy: content="{{ansible_default_ipv4}}" dest=/opt/cxk.txtansible cxk -m setup|grep ansible_default"ansible_default_ipv4": {"ansible_default_ipv6": {},ansible-playbook test02.yaml -e "username=zj"
-e选项指定yaml配置文件中变量username,因为指定了在yaml文件中指定的username为"nginx",实际命令中指定为"zj"最终是以-e选项指定的username生效;
命令行中的变量优先级高于YAML配置文件中的变量优先级。
ansible cxk -a 'cat /opt/cxk.txt'
192.168.241.22 | CHANGED | rc=0 >>
{"macaddress": "00:0c:29:3e:a0:08", "network": "192.168.241.0", "mtu": 1500, "broadcast": "192.168.241.255", "alias": "ens33", "netmask": "255.255.255.0", "address": "192.168.241.22", "interface": "ens33", "type": "ether", "gateway": "192.168.241.2"}
ansible cxk -a 'grep "nginx" /etc/passwd'
192.168.241.22 | FAILED | rc=1 >>
non-zero return codeansible cxk -a 'grep "zj" /etc/passwd'
192.168.241.22 | CHANGED | rc=0 >>
zj:x:111:222::/home/zj:/bin/bashansible cxk -a 'id zj'
192.168.241.22 | CHANGED | rc=0 >>
uid=111(zj) gid=222(wyb) 组=222(wyb)
4.4指定远程主机sudo切换用户
vim test03.yaml---
- hosts: cxkremote_user: ghd become: yesbecome_user: root
这里显示sudo提权失败,可以去远端主机的配置文件(/etc/sudoers)中修改ghd用户的权限
vim /etc/sudoersgrep "ghd" /etc/sudoers
ghd ALL=(ALL) ALL
4.5When——条件判断
在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务
vim test04.yaml---
- name: reboot hosthosts: cxkremote_user: roottasks:- name: shutdown hostcommand: /sbin/shutdown -r now#shutdown命令必须是在绝对路径下 该任务是指让主机进行关机操作when: ansible_default_ipv4.address == "192.168.241.22"#判断条件为主机地址为192.168.241.22的主机ansible-playbook test04.yaml
这里显示UNREACHABLE就表示已经将192.168.241.22主机进行关机
vim test04.yaml---
- name: reboot hosthosts: cxkremote_user: roottasks:- name: shutdown hostcommand: /sbin/shutdown -r nowwhen: ansible_default_ipv4.address == "192.168.241.23"#将关机主机修改为其他判断条件 判断主机地址是否为192.168.241.23ansible-playbook test04.yaml
由于判断条件为主机地址为192.168.241.23才执行Shutdown操作,所以主机地址为192.168.241.22的主机跳过Playbook
4.6迭代
Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环。
4.6.1创建文件夹
vim test05.yaml---
- name: dd1hosts: cxktasks:- name: create dirfile: path={{item}} state=directorywith_items:- /opt/cxk- /opt/wyb- /opt/zs- /opt/zjlansible-playbook test05.yaml
4.6.2创建文件
vim test05.yaml---
- name: dd2hosts: cxktasks:- name: create dirfile: path={{item}} state=touchwith_items:- /opt/cxk.txt- /opt/wyb.txt- /opt/zs.txt- /opt/zjl.txtansible-playbook test05.yaml
4.6.3创建文件夹并建立用户
vim test06.yaml---
- name: dd3hosts: wybgather_facts: falsetasks: - name: create directoriesfile:path: "{{item}}"state: directorywith_items:- /tmp/test1- /tmp/test2- name: add usersuser: name={{item.name}} state=present groups={{item.groups}}with_items:- name: test1groups: wheel- name: test2groups: rootansible-playbook test06.yaml
4.7总结
- 定义变量:Ansible-playbook 是一种定义的任务方式,在编写Playbook时,可以使用变量来传数据,Playbook引用变量时,指的是在Playbook中使用变量来代替静态常亮值,来实现动态的配置过程,通过引用变量可以使Playbook更具有灵活性和可重复性(Playbook使用{{name}} 来引用变量)
- When——条件判断:用来进行条件判断的关键字,其作用只在你指定条件下会执行下面的任务,当条件为真时,任务就会被执行,否则任务将被跳过
- 迭代:通常是指持续的对Ansible Playbook剧本进行修改、更改和改进的过程
二、Templates模块
Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。
1.准备模板文件并设置引用的变量
yum install -y httpdcp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2vim /opt/httpd.conf.j2-42行修改- Listen {{http_port}}
-95行修改- ServerName {{server_name}}
-119行修改- DocumentRoot "{{root_dir}}"
2.修改主机清单内的变量
vim /etc/ansible/hosts -19- [cxk]
-20- 192.168.241.22 http_port=192.168.241.22:80 server_name=www.cxk.com:80 root_dir=/etc/httpd/htdocs
#注意 root_dir要和前面的server_name空格 不可另起一行,否则报错UNREACHABLE!-34- [wyb]
-35- 192.168.241.23 http_port=192.168.241.23:80 server_name=www.wyb.com:80 root_dir=/etc/httpd/htdocs
#注意 root_dir要和前面的server_name空格 不可另起一行,否则报错UNREACHABLE!
3.编写Playbook剧本
vim apache.yaml---
- hosts: allremote_user: rootvars:- package: httpd- service: httpdtasks:- name: create dirfile: path=/etc/httpd/htdocs state=directory- name: install httpd packageyum: name={{package}} state=latest- name: install configure filetemplate: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify: "restart httpd"- name: start httpd serverservice: name={{service}} enabled=true state=startedhandlers:- name: restart httpdservice: name={{service}} state=restartedansible-playbook apache.yaml
vim /etc/httpd/conf/httpd.conf
#远端主机的配置文件-42- Listen 192.168.241.22:80-95- ServerName www.cxk.com:80-119- DocumentRoot "/etc/httpd/htdocs"
三、Tags模块
可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。
playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。
vim cxkhosts.yaml---
- hosts: cxkremote_user: roottasks:- name: Copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags: "ghd"- name: touch filefile: path=/opt/testhost state=touchtags: "always"ansible-playbook cxkhosts.yaml --tags="ghd"
vim wybhosts.yaml---
- hosts: wybremote_user: roottasks:- name: Copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags: "ghd"- name: touch filefile: path=/opt/testhost state=touchtags: "always"#定义有always的tags都会执行,如果不定义tags,则执行tags="ghd"即不执行下面的命令ansible-playbook wybhosts.yaml --tags="ghd"
四、Roles模块
Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。
1.Roles目录详解
文件名 | 含义 |
---|---|
files | 用来存放由 copy 模块或 script 模块调用的文件 |
templates | 用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件 |
tasks | 此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件 |
handlers | 此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作 |
vars | 此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量 |
defaults | 此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量 |
meta | 此目录应当包含一个 main.yml 文件,用于定义此角色的特殊设定及其依赖关系 |
2.在Playbook中使用Roles步骤
2.1环境准备
mkdir /etc/ansible/roles/ -p
#创建以 roles 命名的目录mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all
#创建全局变量目录mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql
#在 roles 目录中分别创建以各角色名称命令的目录mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
#在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
#在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名
2.2修改yml文件
vim /etc/ansible/site.yml
#修改 site.yml 文件,针对不同主机去调用不同的角色---
- hosts: cxkremote_user: rootroles:- httpd
- hosts: wybremote_user: rootroles:- mysql
2.3运行Ansible-Playbook
cd /etc/ansible
ansible-playbook site.yml
3.Roles模块举例——LAMP
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -ptouch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml
3.1编写httpd模块
3.1.1编写yml文件
vim /etc/ansible/roles/httpd/tasks/main.yml- name: install apacheyum: name={{pkg}} state=latest
- name: start apacheservice: enabled=true name={{svc}} state=started
3.1.2定义变量
vim /etc/ansible/roles/httpd/vars/main.yml
#可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中
pkg: httpd
svc: httpd
3.2编写Mysql模块
3.2.1编写yml文件
vim /etc/ansible/roles/mysql/tasks/main.yml- name: install mysqlyum: name={{pkg}} state=latest
- name: start mysqlservice: enabled=true name={{svc}} state=started
3.2.2定义变量
vim /etc/ansible/roles/mysql/vars/main.ymlpkg:- mariadb- mariadb-server
svc: mariadb
3.3编写Php模块
3.3.1编写yml文件
vim /etc/ansible/roles/php/tasks/main.yml- name: install phpyum: name={{pkg}} state=latest
- name: start php-fpmservice: enabled=true name={{svc}} state=started
3.3.2定义变量
vim /etc/ansible/roles/php/vars/main.ymlpkg:- php- php-fpm
svc: php-fpm
3.4编写Roles实例并启动
vim /etc/ansible/site.yml---
- hosts: wybremote_user: rootroles:- httpd- mysql- phpcd /etc/ansible
ansible-playbook site.yml