1章 自动化运维工具ansible
1.1 保留yum安装的软件
sed -i.org 's#keepcache=0#keepcache=1#g' /etc/yum.conf
1.2 管理端m01安装
yum install epel-release -y
yum install ansible -y
1.3 客户端安装
yum install libselinux-python -y
1.4 编辑/etc/ansible/hosts
[root@m01 scripts]# tail -6 /etc/ansible/hosts
[oldboy]
172.16.1.5
172.16.1.6
172.16.1.7
172.16.1.8
172.16.1.31
172.16.1.41
172.16.1.51
172.16.1.61
1.5 利用ansible远程批量执行命令
语法
ansible oldboy -m command -a 'uptime'
oldboy为主机组的名字
-m后边是模块的名字
-m NAME, --module-name=NAME
Execute the module called NAME
-a后面是模块的名字,也可以是一个ip,针对一台机器来执行命令
-a 'ARGUMENTS', --args='ARGUMENTS'
The ARGUMENTS to pass to the module.
远程执行命令
ansible oldboy -m command -a 'uptime'
ansible oldboy -m command -a ' sed -i.org 's#keepcache=0#keepcache=1#g' /etc/yum.conf '
拷贝文件
[root@m01 scripts]# cat yum.sh
yum install ipvsadm -y
ansible oldboy -m copy -a "src=/server/scripts/yum.sh dest=/server/scripts/ owner=oldboy group=oldboy mode=0755"
远程执行脚本
ansible oldboy -m shell -a "/server/scripts/yum.sh"
ansible的模块内容
ansible-doc -l
详细查看copy模块的信息
ansible-doc -s copy
1.6 模块的介绍
1.7 批量安装服务的方法
1)运用命令模块
ansible oldboy -m yum -a "name=keepalived state=installed"
2)运用yum模块
ansible oldboy -m command -a 'yum install httpd -y'
第2章 ansible
Ansible的核心组件
Ansible core
Host inventory
Core modules
Custom modules
Playbook(yaml,jinjia2)
Connect plugin
Ansible 的特性
基于python语言实现,由Paramiko,pyyaml和jinjia2 三个关键模块
常见模块
Command:命令模块,默认模块,用于远程执行命令;区别于shell 、raw模块就是在命令中不支持管道|符号
ansible all –a ‘date’
cron: 定时任务模块
state:
present: 安装
absent: 卸载
ansible websrvs -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"' 默认state=present
ansible websrvs -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state=absent '
user:指明创建用户名字
ansible websrvs -m user -a 'name=mysql uid=306 system=yes'
group:
ansible websrvs -m group -a 'name=mysql gid=306 system=yes'
copy:复制模块
src 原文件的路径 可以是相对路径也可以是绝对路径 拷贝目录时结尾加/ 表示只拷贝里边的内容
不加/ 表示连同目录一块拷贝
dest 目标文件的路径
content 取代src 表示直接以此处指定的信息生成为目标的文件内容
ansible lbsrvs -m copy -a 'src=/etc/fstab dest=/tmp/fstab.ansible owner=root mode=600'
ansible lbsrvs -m copy -a 'content="hello ansible megeedu " dest=/tmp/test.txt'
[root@lb01 ~]# cat /tmp/test.txt
hello ansible
megeedu
file:设定文件属性
path=: 指定文件路径,可以使用name或dest来替换
创建文件的符号链接:
src=:指明源文件
path=:指明符号链接文件的路径
ansible lbsrvs -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"
service:指定运行状态
enabled=:是否开机自启动,取值为true或者false yes or no
name=:服务名称
state=:状态,取值有started,stopped,restarted;
shell:在远程主机上运行命令
尤其是利用管道运行负载的命令
Script:将本地脚本复制到远程主机并运行之:注意:要使用相对路径指定脚本
yum:安装程序包
name=:指明要安装的程序包,可以带上版本号
state=: present,latest,表示安装,absent表示卸载:
setup:收集远程主机的facts
每个被管理节点在接收并行管理命令之前,会将自己主机相关信息,如操作系统版本,ip地址等报告给远程的ansible主机
[root@m01 ansible_test]# cat apache.yml
- hosts: websrvs
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
- name: install configuration file for httpd
copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
- name: start httpd service
service: enabled=true name=httpd state=started
=====================》
[root@m01 ansible_test]# cat apache.yml
- hosts: websrvs
remote_user: root
vars:
- package: httpd
- service: httpd
tasks:
- name: install httpd package
yum: name={{ package }} state=latest
- name: install configuration file for httpd
copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd service
service: enabled=true name=httpd state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted
2.1.1 主机变量
[websrvs]
#10.0.0.7 testvar='100.7' ansible_ssh_user=root ansible_ssh_pass=123456
#10.0.0.8 testvar='100.8'
2.2 引用变量
[root@m01 ansible_test]# cat test.yml
- hosts: websrvs
remote_user: root
tasks:
- name: copy file
copy: content='{{ansible_all_ipv4_addresses}},{{testvar}}' dest=/tmp/vars.ansible
可以在playbook中定义 可以在/etc/ansible/hosts 中定义的 ansible facts 中的变量 都可以直接引用
2.3 when条件测试
[root@m01 ansible_test]# cat cond.yml
- hosts: websrvs:lbsrvs
remote_user: root
vars:
- username: user10
tasks:
- name: create {{username}} user
user: name={{username}}
when: ansible_fqdn == 'lb01'
2.4 迭代
当有需要重复行执行的任务时,可以使用迭代机制,其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句来指明迭代的元素列表即可
[root@m01 ~]# cat add_user.yml
- hosts: websrvs
remote_user: root
tasks:
- name: add several users
user: name={{ item }} state=present groups=wheel
with_items:
- testuser1
- testuser2
#上面的语句等同于下面的语句
# - name: add testuser1
# user: name=testuser1 state=present groups=wheel
# - name: add testuser2
# user: name=testuser2 state=present groups=wheel
#事实上 with_items 可以使用的元素还可以为hashes 例如
# - name: add several users
# user: name={{item.name}} state=present groups={{item.groups}}
# with_items:
# - {name: 'testuser1',groups: 'wheel'}
# - {name: 'testuser2',groups: 'root'}
迭代:重复同类task时使用
调用:item
定义循环列表:
[root@m01 ~]# cat main.yml
- hosts: websrvs
remote_user: root
tasks:
- name: install lamp package
yum: name={{ item.name }} state=latest
template: src={{ item.conf }} dest={{item.dest_conf}}
with_items:
- {name: httpd,conf: conffiles/httpd.conf,dest_conf: /etc/httpd/conf/httpd.conf}
- {name: php,conf: conffiles/pfp.ini,dest_conf: /etc/php.ini}
- {name: mysql-server,conf: conffiles/my.cnf,dest_conf: /etc/my.cnf}
2.5 Template
模板文件 通过一个配置文件含有jinjia2的变量 当复制到各个节点是模板里的变量 会替换为主机清单/etc/ansible/hosts 里面的变量定义的值
[root@m01 ansible_test]# cat apache.yml
- hosts: websrvs
remote_user: root
vars:
- package: httpd
- service: httpd
tasks:
- name: install httpd package
yum: name={{ package }} state=latest
- name: install configuration file for httpd
template: src=/root/template/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd service
service: enabled=true name={{ service }} state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted
2.6 Tags 定义标签
Tags:在playbook可以为某个或者某些任务定义一个标签,在执行此playbook时,通过为ansib-playbook命令使用—tags选项能实现运行指定的tasks而非所有的
- name: install configuration file for httpd
template: src=/root/template/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
tags:
- conf
特殊tags:always
ansible-playbook apache.yml --tags='conf'
2.7 Roles
tags
tags用于让用户选择 跳过playbook中的部分代码,ansible具有哦幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长,此时,如果确信其没有变化,就可以通过tags跳过此些代码片段
创建roles的步骤
1,创建以roles命名的目录:,
2,在roles目录中分别创建以各角色名称命名的目录,如webservers等:
3,在每个角色命名的目录中分别创建files、handler、meta、tasks、template、vars目录:用不到的可以创建为空目录,也可以不创建,
4,在playbook文件中,调用各角色
Roles:
1》目录名同角色名
2》Roles内个目录中可用的文件
1> Tasks目录:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表:此文件可以使用include包含其他的位于此目录中的task文件
2> files目录:存放由copy或script等模块调用的文件:
3> Templates目录:template 模块会自动在此目录中寻找jinjia2模板文件
4> Handlers目录:此目录应当包含一个main
5> Yml文件,用于定义此角色用到的个handler:在handler中使用include包含的其他的handler文件也应该位于此目录中
6> vars 目录:应当包含一个main.yml文件,用于定义此角色用到的变量
7> meta 目录:应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系:ansible 1.3及其以后的版本才支持:
8> default目录:为当前角色设定默认变量时使用目录:应当包含一个main.yml文件
3》site.yml 中定义playbook,额外也可以有其他的yml文件
[root@m01 ~]# tree ansible_playbooks
ansible_playbooks
├── roles
│ ├── dbsrvs
│ │ ├── files
│ │ │ └── my.cnf
│ │ ├── handlers
│ │ │ └── main.yml
│ │ ├── meta
│ │ ├── tasks
│ │ │ └── main.yml
│ │ ├── templates
│ │ └── vars
│ └── websrvs
│ ├── files
│ │ └── httpd.conf
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ └── vars
└── sites.yml