Ansible
script
vim /etc/ansible/ansible.cfg
[defaults]
#inventory = /etc/ansible/hosts # 主机列表配置文件
#library = /usr/share/my_modules/ # 库文件存放目录
#remote_tmp = $HOME/.ansible/tmp # 临时py命令文件存放在远程主
机目录
#local_tmp = $HOME/.ansible/tmp # 本机的临时命令执行目录
#forks = 5 # 默认并发数,同时可以执行5次
#sudo_user = root # 默认sudo 用户
#ask_sudo_pass = True # 每次执行ansible命令是否询
问ssh密码
#ask_pass = True # 每次执行ansible命令是否询
问ssh口令
#remote_port = 22 # 远程主机的端口号(默认22)
建议优化项:
host_key_checking = False # 检查对应服务器的host_key,
建议取消注释
log_path=/var/log/ansible.log # 日志文件,建议取消注释
module_name = command # 默认模块
[webservers] webservers组
www1.xingyun.com:2222 可以指定端口
www2.xingyun.com
[dbservers]
db1.xingyun.com
db2.xingyun.com
db3.xingyun.com
[zxnbmk1]
192.168.242.81
[zxnbmk2]
192.168.242.82
ansible 主机名/ip/组 -m 模块名 -a 模块动作 -k(密码登录)
例: ansible 192.168.242.81 -m shell -a 'hostname' -k
常用模块:
[command]
模块作用:在远程主机执行命令,默认模块(ansible.cfg中可配置),可忽略-m选项
变量的优先级:命令行中的-e > playbook中定义的变量 > 主机清单中定义的变量
Ansible之playbook
playbook语法
vi nginx.yaml
- hosts: zxnbmk1
remote_user: root
tasks:
- name: "配置nginx yum源"
copy: src=/etc/yum.repos.d/nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes
- name: "更新yum缓存"
shell: 'yum clean all'
- name: "更新yum"
shell: 'yum makecache'
- name: "更新yum"
shell: 'yum -y update'
- name: "安装nginx"
yum: name=nginx state=present
- name: "copy一份 /etc/nginx/conf.d/"
copy: src=/root/server.conf dest=/etc/nginx/conf.d/server.conf backup=yes
- name: "注释"
shell: 'mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.back'
- name: "创建目录/etc/nginx/html/"
file: path=/etc/nginx/html/ recurse=True
- name: "导游戏包"
copy: src=/root/qmfjdz/ dest=/etc/nginx/html/
- name: "关闭防火墙"
systemdctl: name=nginx stat=stop
- name: "启动 "
service: name=nginx state=started
handlers:
- name: "重启nginx"
service: name=nginx state=restart
----------------------------------------------------------
# 运行文件
ansible-playbook nginx.yaml -k
handlers和notify触发器
- hosts: zxnbmk1
remote_user: root
tasks:
- name: "第一个变量执行"
shell: "echo {{ var1 }}"
notify: restart httpd # 只要上面的命令是引起变化的,那么就触发底下的handlers
- name: "第二个变量执行"
file: path=/{{ var2 }}.txt state=directory
handlers:
- name: restart httpd
setup变量
ansible_all_ipv4_addresses:仅显示ipv4的信息。
ansible_devices:仅显示磁盘设备信息。
ansible_distribution:显示是什么系统,例:centos,suse等。
ansible_distribution_major_version:显示是系统主版本。
ansible_distribution_version:仅显示系统版本。
ansible_machine:显示系统类型,例:32位,还是64位。
ansible_etns33:仅显示ens33的信息。
ansible_hostname:仅显示主机名。
ansible_kernel:仅显示内核版本。
ansible_lvm:显示lvm相关信息。
ansible_memtotal_mb:显示系统总内存。
ansible_memfree_mb:显示可用系统内存。
ansible_memory_mb:详细显示内存情况。
ansible_swaptotal_mb:显示总的swap内存。
ansible_swapfree_mb:显示swap内存的可用内存。
ansible_mounts:显示系统磁盘挂载情况。
ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus:显示cpu个数(只显示总的个数)。
---------------------------------------------------------------------
# 直接使用案例
ansible all -m setup -a 'filter="ansible_nodename"'
# yaml文件使用
vi ceshi.yaml
---
- hosts: zxnbmk1
remote_user: root
tasks:
- name: "setup案例仅显示ipv4的信息"
debug:
msg: "{{ ansible_all_ipv4_addresses }}"
- name: "仅显示eth0的信息"
debug:
msg: "{{ ansible_ens33 }}"
在独立的变量yaml文件中定义
vi vars.yaml
var1: "变量一"
var2: "变量二文件"
vi var_yaml.yaml
---
- hosts: zxnbmk1
remote_user: root
vars_files:
- vars.yaml
tasks:
- name: "第一个变量执行"
shell: "echo {{ var1 }}"
- name: "第二个变量执行"
file: path=/{{ var2 }}.txt state=directory
变量注册debug
register
关键字可以将某个 task 任务结果存储至变量中,最后使用 debug模块 输出变量内容,可以用于后续排障;
变量基本使用
模板templates
模板是一个文本文件,可以做为生成文件的模版,并且模板文件中还可嵌套jinja语法
- jinja2 语言使用字面量,有下面形式:
- 字符串:使用单引号或双引号
- 数字:整数,浮点数
- 列表:[item1, item2, …]
- 元组:(item1, item2, …)
- 字典:{key1:value1, key2:value2, …}
- 布尔型:true/false
- 算术运算:+, -, *, /, //, %, **
- 比较操作:==, !=, >, >=, <, <=
- 逻辑运算:and,or,not
- 流表达式:For,If,When
template功能:可以根据和参考模块文件,动态生成相类似的配置文件 template文件必须存放于templates目录下,且命名为 .j2 结尾 yaml/yml 文件需和templates目录平级,目录结构如下示例: ./ ├── temnginx.yml └── templates └── nginx.conf.j2
template中使用流程控制 for 和 if
for
[root@CentOS-mini16 ~]# tree yml/ yml/ ├── nginx.yaml ├── temnginx.yaml └── templates └── nginx.conf.j2 # 准备templates/nginx.conf.j2文件 vi ./templates/nginx.conf.j2 {% for vhost in vhosts %} 第{{ vhost }} {% endfor %} vim temnginx.yml --- - hosts: zxnbmk1 remote_user: root vars: vhosts: - 1 - 2 - 3 - 4 tasks: - name: "测试templates" template: src=templates/nginx.conf.j2 dest=/root/aa.txt
创建role
创建role的步骤 (1) 创建以roles命名的目录 (2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等 (3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和 vars目录;用不到的目录可以创建为空目录,也可以不创建 (4) 在playbook文件中,调用各角色
# 创建httpd角色
1> 创建roles目录
mkdir roles/httpd/tasks -pv
mkdir roles/httpd/{handlers,files}
查看目录结构
tree roles/
tree roles/
roles/
├── httpd
│ ├── files
│ ├── handlers
│ └── tasks
2> 创建目标文件
cd roles/httpd/tasks/
touch install.yml config.yml service.yml
3> vim install.yml
- name: install httpd package
yum: name=httpd
vim config.yml
- name: config file
copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes
vim service.yml
- name: start service
service: name=httpd state=started enabled=yes
4> 创建main.yml主控文件,调用以上单独的yml文件,
main.yml定义了谁先执行谁后执行的顺序
main.yml定义了谁先执行谁后执行的顺序
vim main.yml
- include: install.yml
- include: config.yml
- include: service.yml
5> 准备httpd.conf文件,放到httpd单独的文件目录下
cp /app/ansible/flies/httpd.conf ../files/
6> 创建一个网页
vim flies/index.html
<h1> welcome to weixiaodong home <\h1>
7> 创建网页的yml文件
vim tasks/index.yml
- name: index.html
copy: src=index.html dest=/var/www/html
8> 将网页的yml文件写进main.yml文件中
vim main.yml
- include: install.yml
- include: config.yml
- include: index.yml
- include: service.yml
9> 在handlers目录下创建handler文件main.yml
vim handlers/main.yml
- name: restart service httpd
service: name=httpd state=restarted
10> 创建文件调用httpd角色(与httpd同级)
cd /app/ansible/roles
vim role_httpd.yml
---
# httpd role
- hosts: appsrvs
remote_user: root
roles: #调用角色
- role: httpd
11> 查看目录结构
tree .
httpd
├── files
│ ├── httpd.conf
│ └── index.html
├── handlers
│ └── main.yml
└── tasks
├── config.yml
├── index.yml
├── install.yml
├── main.yml
└── service.yml
12> ansible-playbook role_httpd.yml