1、介绍

1 ansible基于Python开发的自动化运维工具
2 ansible基于ssh协议实现远程管理的工具,没有客户端
3 ansible软件可以实现多种批量管理操作

2、环境

主机 IP
ansible 服务端 192.168.4.11
ansible 客户端 192.168.4.12

3、安装

1、服务端:
yum install ansible 2、客户端:
yum install libselinux-python

4、ansible命令参数

-m                 #模块名称,默认command
-a #模块参数
-k #指定密码,用户密码,ansible.cfg可以配置
-u #指定用户,默认root,ansible.cfg可以配置
-C #检查并测试,不执行。
--syntax-check #检查语法
-f #并发进程数,默认:5
-s #sudo模式运行
-U #sudo用户,默认: root
-K #sudo密码
-B #异步模式,多少秒失败,后不执行
-P #轮询间隔,若使用-B,默认轮询间隔15秒
-c #连接类型,默认:smart(智能)
-i #指定hosts文件路径,默认/etc/ansible/hosts
-l #指定pattern,对已经匹配的主机中再过滤一次
--list-hosts #输出匹配主机,但不执行任何操作
-M #模块路径,默认:/usr/share/ansible/plugins/modules
-o #压缩输出,重要的会输出
--private-key #私钥路径
-T #连接超时时间,默认:10秒
-t #日志输出路径,日志文件名会以主机名命名
-v #详细模式(-vvv:更多,-vvvv:debug模式)

5、ansible 配置文件

# /etc/ansible/ansible.cfg                                                      #主配置文件(日志、模块、插件等)

常用配置:
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #远程主机临时执行目录
#local_tmp = ~/.ansible/tmp #本机临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口
host_key_checking = False #检查主机指纹(取消注释,不检查)
log_path = /var/log/ansible.log #日志路径
#remote_user = root #SSH连接时的用户名
#private_key_file = /path/to/file #SSH连接时的私钥文件
roles_path = /etc/ansible/roles:/path/roles #roles路径,多个路径用冒号分隔
#gathering = implicit #控制收集Facts变量的策略 ssh配置
#ssh_args = -C -o ControlMaster=auto #控制Ansible的ssh连接
#pipelining = False #多个task之间共享SSH连接,开启能够提升执行速度
#control_path = #socket的路径 权限提升配置
#become=True #是否进行权限提升
#become_method=sudo #权限提升的方式,默认:sudo
#become_user=root #权限提升的用户,默认:root
#become_ask_pass=False #权限提升的密码,默认:False,(不输入密码)

# /etc/ansible/hosts                                                                #主机清单

[nginx]                                         #组名
192.168.4.11 #IP地址或域名 #[tomcat-pass] #密码认证方式
#192.168.4.12 ansible_ssh_user=root ansibel_ssh_port=22 ansible_ssh_pass=123456

# /etc/ansible/roles/                                                                #存放角色的目录(空目录)

6、Ansible管理认证方式

密码方式

1、ping在线主机
#ansible all -m ping
#ansible all -m ping -u root -k #指定用户和密码 2、配置文件指定用户和密码
#cat /etc/ansible/hosts
[tomcat-pass] #密码认证方式
192.168.4.12 ansible_ssh_user=root ansibel_ssh_port=22 ansible_ssh_pass=123456 3、测试
#ansible all -m ping

密钥方式

1、创建SSH密钥对
ssh-keygen -f /root/.ssh/id_rsa -P "" -q #免交互创建密钥对,-f:密钥文件的路径,-P或-N:密钥文件的提示信息,一般为空,-q:不输出结果信息
id_rsa #生成的私钥
id_rsa.pub #生成的公钥 2、非交互分发公钥
sshpass -p123456 ssh-copy-id -f -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 192.168.4.12
sshpass -p远程主机密码,ssh-copy-id -f:强制模式,-i:指定公钥文件,-p:端口,-o:跳过连接确认(ssh参数) 3、批量分发公钥
#!/bin/bash
#生成秘钥对
[ -e ~/.ssh/id_rsa ] && mv ~/.ssh/id_rsa* /tmp
[ -e ~/.ssh/id_rsa ] || ssh-keygen -f ~/.ssh/id_rsa -P "" -q
#分发秘钥
Ssh_Pass=123456
Key_Path=~/.ssh/id_rsa.pub
ip=192.168.4.
for id in 11 12 13
do
sshpass -p$SSH_Pass ssh-copy-id -i $Key_Path "-o StrictHostKeyChecking=no" $ip$id
done 4、配置文件
cat /etc/ansible/hosts
[nginx] #组名
192.168.4.11 #IP地址或域名 5、测试
#ansible all -m ping

7、Ansible执行命令过程

1 加载配置文件 默认/etc/ansible/ansible.cfg
2 加载对应的模块文件,如command
3 通过ansible将模块或命令生成对应的临时py文件,并将文件传到远程主机上,~/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4 给文件+x执行
5 执行并返回结果
6 删除临时py文件,sleep 0退出

8、Ansible命令工具

ansible                  #主程序,命令执行工具
ansible-doc #查看模块功能工具
ansible-galaxy #上传/下载第三方模块指令
ansible-playbook #定制自动化任务,编排工具
ansible-pull #远程执行命令的工具
ansible-vault #对playbook文件进行加密/解密
ansible-console #基于Console界面与用户交互的执行工具

9、Ansible模块

模块查看和帮助

ansible-doc
-l #列出所有的模块
-s #显示指定模块信息
ansible-doc 模块名 #直接查看完整信息
-j #以json的方式返回数据

command模块(执行命令模块,默认模块)

模块参数
chdir:切换目录
creates:当文件或目录存在时,不执行命令
removes:当文件或目录存在时,执行命令
warn:警告 实例
ansible nginx -m command -a "pwd"
ansible nginx -a "ls"
ansible nginx -a "chdir=/tmp pwd"   #切换目录,并执行命令
ansible nginx -a "creates=/tmp pwd"   #当文件存在时,pwd不执行
ansible nginx -a "removes=/tmp pwd"   #当文件存在时,pwd执行
ansible nginx -a "chmod 000 /etc/hosts warn=False"   #忽略警告
注意:不支持 (>,<,|,&,;,变量等)

shell模块(万能模块,支持特殊字符)

模块参数
和command一样 实例
shell模块可以满足command模块所有功能,并支持特殊字符
ansible nginx -m shell -a "ls;pwd"
ansible nginx -m shell -a "ps -ef | grep sshd | grep -v grep"
ansible nginx -m shell -a "sh a.sh"
ansible nginx -m shell -a "python a.py"

script模块(本地脚本,远程执行)

实例
ansible nginx -m script -a "pwd.sh"
ansible nginx -m script -a "creates=/tmp/pwd.sh /tmp/pwd.sh"   #当文件存在时,不执行脚本

copy模块

模块参数
src:源
dest:目标
owner:属主
group:属组
mode:权限
content:定义文件的内容
backup:备份
force:强制覆盖文件,默认为yes 实例
ansible nginx -m copy -a "src=/data/test.txt dest=/tmp/ owner=tom group=tom mode=0755" #复制文件并修改权限
ansible nginx -m copy -a "content='I Live You' dest=/tmp/test.txt backup=yes" #备份并修改文件内容
ansible nginx -m copy -a "src=/etc/hosts dest=/tmp/a/b/c/d/" #创建多级目录

file模块

模块参数
path:文件路径,别名dest、name
state:directory(目录)、touch(文件)、link(软连接)、absent(删除)、hard(硬链接)
src:源文件
recurse:递归
force:强制创建软连接,默认为no(更新软连接) 实例
ansible nginx -m file -a "path=/tmp/test state=directory" #创建目录
ansible nginx -m file -a "path=/tmp/test owner=tom group=tom mode=644 state=touch" #创建文件并修改权限
ansible nginx -m file -a "src=/usr/local/nginx/ dest=/tmp/nginx state=link" #创建软连接
ansible nginx -m file -a "path=/tmp/nginx state=absent" #删除软连接
ansible nginx -m file -a "path=/tmp/test state=directory mode=644 recurse=yes" #递归设置权限

yum模块

模块参数
name:软件包名称,可以指定版本号,可以本地RPM包,可以URL文件
state:状态,installed(安装)、absent(卸载)
enablerepo:启用某个源
disablerepo:禁用某个源
disable_gpg_check:关闭gpg_check
config_file:yum的配置文件 实例
ansible nginx -m yum -a "name=telnet state=installed"
ansible nginx -m yum -a "list=telnet" #查看软件包是否安装
ansible nginx -m yum -a "name=nginx,telnet"
ansible nginx -m yum -a "name=nginx state=absent" #最好不要用yum卸载,用rpm -e卸载

systemd服务模块

模块参数
name:服务的名称
state:服务状态(started、stopped、restarted、reloaded)
enabled:服务是否开机自启 实例
ansible nginx -m systemd -a "name=crond enabled=no state=stopped "
ansible nginx -m systemd -a "name=crond enabled=yes state=started"

cron模块

模块参数
name:名称(添加不能相同,不加为None)
minute:分钟
hour:小时
day:天
month:月
weekday:周
job:任务
disabled:禁用(前面加#)
user:用户
state:状态(present、absent)
backup:备份
env:环境变量(name=job定义变量的值) 实例
ansible nginx -m cron -a "name='时间同步' minute=0 hour=0 job='ntpdate ntp1.aliyun.com'"
ansible nginx -m cron -a "name='时间同步' minute=*/1 backup=yes job='ntpdate ntp1.aliyun.com'"
ansible nginx -m cron -a "env=yes name='TEST' backup=yes job='echo test'"
ansible nginx -m cron -a "name='重启时执行任务' special_time=reboot job='echo test'"
ansible nginx -m cron -a "name='重启时执行任务' disabled=true job='echo test'"
ansible nginx -m cron -a "name='每小时执行一次' special_time=hourly job='echo test'"
ansible nginx -m cron -a "name='每小时执行一次' backup=yes state=absent"
ansible nginx -m cron -a "name=None state=absent"

mount模块

模块参数
fstype:挂载文件的类型
path:挂载点(别名name)
opts:挂载参数选项
src:要挂载的设备
state:状态(present:不挂载,仅写到fstab;mounted:挂载并写到fstab;unmounted:卸载,不清除fstab;absent:卸载,清除fstab) 实例
ansible nginx -m mount -a "src=192.168.4.11:/data path=/data fstype=nfs opts=defaults state=present"
ansible nginx -m mount -a "src=192.168.4.11:/data path=/data fstype=nfs opts=defaults state=mounted"
ansible nginx -m mount -a "src=192.168.4.11:/data path=/data fstype=nfs opts=defaults state=unmounted"
ansible nginx -m mount -a "src=192.168.4.11:/data path=/data fstype=nfs opts=defaults state=absent"

user模块

模块参数
name:用户名
group:属组
groups:附加组
home:家目录
create_home:是否创建家目录
remove:删除用户及家目录
shell:用户的shell
system:系统用户
uid:用户的id
password:密码
state:状态(present为默认、absent)
force:强制删除用户及家目录 实例
ansible nginx -m user -a "name=test"
ansible nginx -m user -a "name=test state=absent"
ansible nginx -m user -a "name=test state=absent remove=yes"
ansible nginx -m user -a "name=test group=root"
ansible nginx -m user -a "name=test groups=python append=yes"
ansible nginx -m user -a 'name=test password="123456"
ansible nginx -m user -a "name=test expires=1546185600"
ansible nginx -m user -a "name=test uid=8888 shell=/sbin/nologin create_home=no"

10、playbook

简介

playbook==剧本,由多个play组成,一个play包含多个task任务,采用YAML语言编写的
paly:主机的角色,task:具体执行的任务。使用不同的模块完成一件事
- playbook 剧本 YAML文件
- play 找谁 主机web01
- task 做什么 yum、copy、service

yaml语法简介

规则一:缩进(两个空格,不能用tab键)
规则二:冒号(冒号后面要有空格,以冒号结尾或表示文件路径不需要空格。)
规则三:短横线(表示列表,后面要有空格)
#号注释,k/v值可同一行,也可换行,同行用:,换行用 -

1、- 用法(列表)
水果信息:
- 苹果
- 香蕉
- 西瓜

2、:用法(前者的值)
姓名: 张三
性别: 男
人员信息:
- 运维人员: sa
- 开发人员: dev
- 存储人员: dba

3、用法(空格):
软件安装步骤:
- 服务端安装步骤:
第一个里程碑: 检查软件是否安装
第二个里程碑: 编写配置文件内容
- 客户端安装步骤:

playbook参数

-C:                 检查脚本语法,不执行
--syntax-check: 检查语法
-e: 引入外部变量
--list-hosts: 列出运行任务的主机
--limit hosts: 只主机列表中的主机执行
-f: 并发数,默认5
-k: 用户密码
--ask-vault-pass: 加密playbook文件时提示输入密码
-D:即--diff: 更新文件时,显示不同的内容,结合-C会有较好的效果
--flush-cache: 清除远程主机缓存
--force-handlers: 强制运行handlers的任务,即使在任务失败的情况下
-i : 指定主机清单文件
--list-tags: 列出所有可用的tags
--list-tasks: 列出所有即将被执行的任务。
--skip-tags: 跳过指定的tags任务。
--start-at-task: 从第几条任务开始执行。
--step: 逐步执行任务,运行前确认每个任务
-t: 指定执行该tags的任务

setup 模块(收集某主机信息)

# ansible nginx -m setup
常用变量
ansible_all_ipv4_addresses #所有的ipv4地址
ansible_date_time #系统时间
ansible_default_ipv4 #默认的ipv4地址(ip、网段、网卡)
ansible_device_links #系统的磁盘信息
ansible_distribution #系统名称
ansible_distribution_major_version #系统的主版本
ansible_distribution_version #系统的全部版本
ansible_dns #系统的dns 默认udp 端口53
ansible_domain #系统的域 ldap
ipv4 #ipv4地址
ansible_env #系统的环境
ansible_fqdn #系统的完整主机名
ansible_hostname #系统的简写主机名
ansible_kernel #系统的内核版本
ansible_machine #系统的架构
ansible_memtotal_mb #系统的内存
ansible_memory_mb #系统的内存使用情况
ansible_mounts #系统的挂载信息
ansible_processor #系统的cpu
ansible_processor_cores #每颗cpu的核数
ansible_processor_count #cpu的颗数
ansible_processor_vcpus #cpu的个数=cpu的颗数*每颗cpu的核数
ansible_python #系统python信息
ansible_python_version #系统python的版本
ansible_system #系统名字

palybook核心元素

hosts:               远程主机列表
tasks: 任务集
variables: 内置或自定义变量
templates: 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
handlers 和notity : 必须结合使用,由特定的条件触发操作,由notity通知handlers执行
tags: 标签,指定某条件任务执行,用于选择运行playbook中的部分代码
hosts元素
hosts:远程主机列表
cat /root/ansible/hosts.yml
- hosts: web
remote_user: root #远程的用户 hosts主机列表形式:
test.com #主机名
192.168.4.12 #IP
web #组名
web:db #两个组的并集
web:!db #两个组的差集
web:&db #两个组的交集
tasks元素
tasks:任务集
cat /root/ansible/tasks.yml
- hosts: web
remote_user: root
tasks:
- name: create_new_file
file: name=/test/test.txt state=touch
- name: create_new_user
user: name=tom state=present system=yes shell=/sbin/nologin

## name:描述信息,file和user:模块名,后面模块的具体操作
handlers和notify元素
notify元素:作为handlers的触发器(当tasks中触发到notify时,会优先执行handlers中的代码)
handlers元素:和tasks同级的列表,等待任务触发notify后执行
cat /root/ansible/nginx.yml
- hosts: web
remote_user: root
tasks:
- name: install_nginx
yum: name=nginx
- name: nginx_config
copy: src="/etc/nginx/nginx.conf" dest="/etc/nginx/" backup=yes
notify:
- restart_nginx
- check_service
- name: start_nginx
service: name=nginx state=started enabled=yes
handlers:
- name: restart_nginx
service: name=nginx state=restarted
- name: check_service
shell: killall -0 nginx > /tmp/nginx.log

## killall -0 nginx 检查nginx的进程有没有启动,返回0启动,非0没有启动
tags元素
tags元素:在某个任务打标签,方便单独执行或被其他调用
cat /root/ansible/nginx.yml
- hosts: web
remote_user: root
tasks:
- name: install nginx
yum: name=nginx
tags: install_nginx
- name: copy nginx config file
copy: src="/etc/nginx/nginx.conf" dest="/etc/nginx/" backup=yes
notify:
- restart nginx
- check service
- name: start nginx
service: name=nginx state=started enabled=yes
tags: start_nginx
handlers:
- name: restart nginx
service: name=nginx state=restarted
- name: check service
shell: killall -0 nginx > /tmp/nginx.log

单独执行startnginx任务
ansible-playbook -t startnginx /root/ansible/nginx.yml
指定两个标签执行
ansible-playbook -t install_nginx,startnginx /root/ansible/nginx.yml
vars元素
vars元素:定义变量
ansible nginx -m setup #查看变量
ansible nginx -m setup | grep ansible_fqdn #通过变量过滤主机名
ansible nginx -m setup -a "filter=ansible_fqdn" #通过变量过滤主机名 1、在/etc/ansible/hosts中定义变量(http_port)
[test]
192.168.4.12 http_port=8080
在playbook中使用变量
- hosts: web
remote_user: root
tasks:
- name: set hostname
hostname: name=test{{ http_port }}.python.com 2、通过命令行定义的变量,优先级最高(使用{{}}定义变量)
- hosts: web
remote_user: root
tasks:
- name: install nginx
yum: name={{ app1 }}
- name: install vsftpd
yum: name={{ app2 }}
- name: copy nginx config file
copy: src="/etc/nginx/nginx.conf" dest="/etc/nginx/" backup=yes
- name: start nginx
service: name={{ app1 }} state=started enabled=yes
ansible-playbook -e 'app1=nginx app2=vsftpd' /root/ansible/nginx.yml #-e 定义变量 3、用vars元素定义变量列表
- hosts: web
remote_user: root
vars:
- app1: nginx
tasks:
- name: install nginx
yum: name={{ app1 }}
- name: copy nginx config file
copy: src="/etc/nginx/nginx.conf" dest="/etc/nginx/" backup=yes
- name: start nginx
service: name={{ app1 }} state=started enabled=yes 4、将变量存放到一个文件中,在playbook里面调用
cat /root/ansible/vars.yml
var1: nginx
var2: nsftpd cat /root/ansible/yum.yml
- hosts: web
remote_user: root
vars_files:
- vars.yml
tasks:
- name: install nginx
yum: name={{ var1 }}
- name: install vsftpd
yum: name={{ var2 }}
templates元素
模板文件,能够实现不同的主机,修改不同的配置文件
模板文件的编程语言是jinja2语言,支持的类型:
- 字符串: 使用单引号或者双引号
- 数字: 整数,浮点数
- 列表: [item1,item2,..]
- 元组: (item1,item2,..)
- 字典: {key1:value1,key2:value2,..}
- 布尔值: true/false
- 算数运算符: +,-,*,/,//,%,**
- 比较运算符: ==,!=,>,>=,<,<=
- 逻辑运算符: and,or,not
- 流表达式: for if when

1、#cat /root/ansible/templates/nginx.conf.j2
worker_processes {{ ansible_processor_vcpus**2 }}; #远程主机的cpu的个数

2、#cat /root/ansible/nginx.yml
- hosts: web
remote_user: root
tasks:
- name: install nginx
yum: name=nginx
- name: copy templates file
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
- name: start nginx
service: name=nginx state=started enabled=yes
handlers:
- name: restart nginx
service: name=nginx state=restarted

3、#ansible-playbook /root/ansible/nginx.yml 4、#cat /root/ansible/templates/nginx.conf.j2
listen {{ http_port }} default_server;
listen [::]:{{ http_port }} default_server;
# ansible-playbook /root/ansible/nginx.yml
跳过错误继续执行
为了解决tasks中某段代码执行出现问题,是否继续执行,默认出错就停止
- hosts: web
remote_user: root
tasks: run this command and ignore the resullt
- name: shell start nginx
shell: /usr/bin/somecommand || /bin/true
或者
- hosts: web
remote_user: root
tasks:
- name: run this command and ignore the resullt
shell: /usr/bin/somecommand
ignore_errors: True
when语句
when语句:条件的测试,需要根据变量、facts或任务执行的结果,做相应的条件测试。
# 定义两个配置文件
cp /etc/nginx/nginx.conf /root/ansible/templates/nginx6.conf.j2
cp /etc/nginx/nginx.conf /root/ansible/templates/nginx7.conf.j2

cat /root/ansible/nginxtemp.yml
- hosts: web
remote_user: root
tasks:
- name: install nginx
yum: name=nginx
- name: copy templates file for centos7
template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version == '7'
notify: restart nginx
- name: copy templates file for centos6
template: src=nginx6.conf.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version == '6'
notify: restart nginx
- name: start nginx
service: name=nginx state=started enabled=yes
handlers:
- name: restart nginx
service: name=nginx state=restarted
with_items语句
with_items:循环,当执行重复性任务的时,使用迭代机制来实现
固定变量:"item",来引用
在tasks中用with_items定义循环的元素列表(支持的格式:字符串、字典)

创建多个文件及安装多个包
cat /root/ansible/items.yml
- hosts: web
remote_user: root
tasks:
- name: create file
file: name=/root/ansible/{{ item }} state=touch
with_items:
- file1
- file2
- file3
- name: install packages
yum: name={{ item }}
with_items:
- htop
- sl
- hping3
迭代嵌套子变量
创建多个用户和组,将用户加入到不同的组
# cat /root/ansible/guser.yml
- hosts: web
remote_user: root
tasks:
- name: add groups
group: name={{ item }} state=present
with_items:
- g1
- g2
- g3
- name: add user for goups
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- { name: 'user1', group: 'g1'}
- { name: 'user2', group: 'g2'}
- { name: 'user3', group: 'g3'}
for语句
1、定义变量
# cat /root/ansible/testfor.yml
- hosts: web
remote_user: root
vars:
ports:
- 81
- 82
- 83
tasks:
- name: create for config
template: src=/root/ansible/testfor.conf.j2 dest=/root/ansible/testfor.conf 2、模板文件编写
# cat /root/ansible/testfor.conf.j2
{% for p in ports %}
server {
listen {{ p }}
}
{% enfor %} 3、执行
# ansible-playbook /root/ansible/testfor.yml 4、查看结果
server {
listen: 81
}
server {
listen: 82
}
server {
listen: 83
} 1、定义变量
- hosts: web
remote_user: root
vars:
weblist:
- web:
port: 81
name: python.test.com
rootdir: /nginx/python
- web2:
port: 82
name: php.test.com
rootdir: /nginx/php
tasks:
- name: create for config
template: src=/root/ansible/testfor.conf.j2 dest=/root/ansible/testfor.conf 2、模板文件
cat /root/ansible/testfor.conf.j2
{% for w in weblist %}
server {
listen {{ w.port }}
servername {{ w.name }}
documentroot {{ w.rootdir }}
}
{% endfor %}
if语句
1、定义变量
# cat /root/ansible/testfor.yml
- hosts: web
remote_user: root
vars:
weblist:
- web:
port: 81
rootdir: /nginx/python
- web2:
port: 82
name: php.test.com
rootdir: /nginx/php
tasks:
- name: create for config
template: src=/root/ansible/testfor.conf.j2 dest=/root/ansible/testfor.conf 2、模板文件
cat /root/ansible/testfor.conf.j2
{% for w in weblist %}
server {
listen {{ w.port }}
{% if w.name is defined %}
servername {{ w.name }}
{% endif %}
documentroot {{ w.rootdir }}
}
{% endfor %} 3、执行
# ansible-playbook /root/ansible/testfor.yml 4、查看结果
server {
listen 81
documentroot /nginx/python
}
server {
listen 82
servername php.test.com
documentroot /nginx/php
}

11、实例

创建用户

- hosts: web
remote_user: root
tasks:
- name: create_user
user: name=test uid=2000 state=present

创建用户 和 复制文件

- hosts: web
remote_user: root
tasks:
- name: create_user
user: name=test uid=2000 state=present
- name: copy_file
copy: src=/etc/hosts dest=/tmp/fs

创建一个用户(变量)

方法一:
- hosts: web
tasks:
- name: create_user
user: name={{user}}
# ansible-playbook -e user=test useradd.yml

方法二:
- hosts: web
vars:
- user: test
tasks:
- name: create_user
user: name={{user}}

方法三:
- hosts: web
tasks:
- name: yum
yum: name=bc
- name: sum
shell: echo 11+22|bc
register: user #注册成变量,返回结果为后面使用
- name: create_user
user: name=test{{user.stdout}}

tags(标签,只执行带标签的代码)

- hosts: web
tasks:
- name: install
yum: name=redis
- name: copy_file
copy: dest=/etc/redis.conf src=/etc/redis.conf
tags: copy
- name: start
service: name=redis state=started
# ansible-playbook -t copy tags.yml #仅运行标签所在的一项

handlers(改变时触发,执行某一项)

- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
copy: dest=/etc/redis.conf src=/etc/redis.conf
tags: copy
notify: restart #改变时触发
- name: start
service: name=redis state=started
handlers:         #触发项
- name: restart
service: name=redis state=restarted

template  模块(基于jinja2)

cat /etc/redis.conf
bind {{ ansible_default_ipv4.address }} - hosts: web
tasks:
- name: install
yum: name=redis
- name: copy_file
template: dest=/etc/redis.conf src=/etc/redis.conf #直接替换(绝对路径)
tags: copy
notify: restart
- name: start
service: name=redis state=started
handlers:
- name: restart
service: name=redis state=restarted - hosts: web
tasks:
- name: install
yum: name=redis
- name: copy_file
template: dest=/etc/redis.conf src=redis.conf.j2 #直接替换(相对路径)
tags: copy
notify: restart
- name: start
service: name=redis state=started
handlers:
- name: restart
service: name=redis state=restarted

when (类似python 中的 if)

- hosts: web
tasks:
- name: copy_file
copy: content="centos7" dest=/tmp/a.txt
when: ansible_distribution_major_version=="7" #利用收集的信息
- name: copy_file
copy: content="centos6" dest=/tmp/a.txt
when: ansible_distribution_major_version=="6"

with_items (类似python中的 while)

- hosts: web
tasks:
- name: crate_user
user: name={{item.name}} group={{item.group}}
with_items:
- {"name":test01,"group":test}
- {"name":test02,"group":test}
- {"name":test03,"group":test}

roles  (角色)

1、创建roles任务文件
#cat ./roles/nginx/
├── files -- 静态文件
│ └── c.txt
├── handlers -- 触发的任务
│ └── main.yml
├── tasks -- 任务(必须的)
│ ├── copyfile.yml
│ ├── install.yml
│ ├── main.yml
│ └── start.yml
├── templates -- 动态文件,需要传递参数
│ └── nginx.conf
└── vars -- 变量
└── main.yml
查找顺序:
- 主文件看到roles,就回去roles目录下面找对应的目录
- 先去tasks目录里面找main.yml文件,如果遇到import_task则加载任务
- 如果遇到了template,则去templates目录里面找文件
- 如果遇到了copy,则去files目录里面找文件
- 如果遇到了变量,则去vars目录里面找main.yml文件
- 如果遇到了notify,则去handlers目录里面找main.yml文件

2、创建主机roles文件
#cat nginx.yml
- hosts: web
roles: nginx

3、执行
# ansible-playbook nginx.yml

创建文件2种方法

- hosts: webservers
tasks:
- name: Create New File
file: path=/tmp/123.txt state=touch owner=root group=root mode=600
- name: Create New File2
file:
path: /tmp/456.txt
state: touch
owner: root
group: root
mode: 0666

部署nfs服务

1、编写nfs-server文件
- hosts: nfs_servers
tasks:
- name: Installed NFS Server
yum:
name: nfs-utils
state: present
- name: Configure NFS Server
copy:
src: ./file/exports.j2
dest: /etc/exports
owner: root
group: root
mode: 0644
backup: yes
- name: Create NFS Group www
group:
name: www
gid: 666
- name: Create NFS User www
user:
name: www
group: www
uid: 666
create_home: no
shell: /sbin/nologin
- name: Create NFS Share Directory
file:
path: /ansible_data
state: directory
owner: www
group: www
mode: 0755
recurse: yes
- name: Systemd NFS Server
systemd:
name: nfs
state: restarted
enabled: yes 2、编写nfs-clinet的yml
- hosts: webservers
tasks:
- name: Mount NFS Server share directory
mount:
src: 192.168.4.12:/ansible_data
path: /mnt
fstype: nfs
opts: defaults
state: mounted

部署nginx服务

- hosts: webservers
tasks:
- name: Installed Nginx Server
yum:
name: nginx
state: present
- name: Configure Nginx Server
copy:
src: ./file/nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: 0644
backup: yes
notify: Restart Nginx Server
- name: Systmd nginx Server
systemd:
name: nginx
state: started
enabled: yes
handlers:
- name: Restart Nginx Server
systemd:
name: nginx
state: restarted

部署rsync

- hosts: 192.168.4.12
tasks:
- name: install rsync
yum: name=rsync state=installed
- name: rsync conf file
copy: src=/etc/ansible/conf/rsync_conf/rsyncd.conf dest=/etc/
- name: create rsync user
user: name=rsync state=present createhome=no shell=/sbin/nologin
- name: create auth file
copy: src=/etc/ansible/conf/rsync_conf/rsync.password dest=/etc/ mode=600
- name: create backup dir
file: dest=/backup state=directory owner=rsync group=rsync
- name: boot rsync server
shell: rsync --daemon --config=/etc/rsyncd.conf
- hosts: 192.168.4.11
tasks:
- name: create auth file
copy: src=/etc/ansible/conf/rsync_conf/rsync_client.password dest=/etc/rsync.password mode=600
- name: test
shell: rsync -az --password-file=/etc/rsync.password /tmp/a.txt test@192.168.4.12::backup/

ansible

学习ansible(一)的更多相关文章

  1. 学习ansible笔记1

    ansible的特点: -- 模块化设计 -- 仅需要ssh和Python即可以使用 -- 无客户端 -- 功能强大,模块丰富 -- 上手容易门槛低 -- 基于python开发,做二次开发更容易 -- ...

  2. 学习 Ansible Playbook,有这篇文章就够了!

    https://mp.weixin.qq.com/s?__biz=MzAwNTM5Njk3Mw==&mid=2247487361&idx=1&sn=b50327df2949e4 ...

  3. 《Ansible权威指南》笔记(1)——安装,ssh密钥登陆,命令

    2016-12-23 读这本<Ansible权威指南>学习ansible,根据本书内容和网上的各种文档,以及经过自己测试,写出以下笔记.另,这本书内容很好,但印刷错误比较多,作者说第二版会 ...

  4. 自动化运维工具Ansible详细部署 (转载)

    自动化运维工具Ansible详细部署 标签:ansible 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog. ...

  5. 自动化服务安装部署工具-Ansible

    自动化运维工具Ansible详细部署 ================================================================================= ...

  6. ansible module

    模块是一个独立的, 可以复用的脚本, 它可以被anisible API, Ansible 或者ansible-playbook使用.   在模块退出之前, 它通过输出一个json字符串到标准输出从而反 ...

  7. Ansible 系列之 Ad-Hoc介绍及使用

    Ad-Hoc 介绍 一.什么是ad-hoc 命令? ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令.就相当于bash中的一句话shell.这也是一个好的地方,在学习ansible ...

  8. 在Debian 8 上安装自动化工具Ansible

    如果你是新手,就不要犹豫了,ansible是你最好的选择,本人菜鸟一个.废话少说,开始安装! 实验环境: 192.168.3.190 192.168.3.191 192.168.3.192 192.1 ...

  9. Ansible系列(三):YAML语法和playbook写法

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

随机推荐

  1. python中类似c++静态方法的一个记录

    个人学习c++出身,在后面的工作中接触到python,见到一些classmethod的字眼有点疑惑,所以进行一些记录. 都知道的是,c/c++中有着静态成员,静态方法的存在,比如: class A: ...

  2. 大数据BI系统搭建对企业经营的作用有哪些

    随着数据化时代的到来,企业为了适应高速发展的业务.维持自身更好的发展,纷纷开始寻求适合自身企业发展的BI系统.为什么BI系统会受到企业如此的青睐?BI系统对企业经营究竟有哪些方面的作用呢? 下面,小编 ...

  3. 说出来你可能不信,我用excel就能做一张高端的统计报表

    统计报表是指各级企事业.行政单位按规定的表格形式.内容.时间要求报送程序,自上而下统一布置,提供统计资料的一种统计调查方式.统计报表具有来源可靠.回收率高.方式灵活等特点,是各个基层企业或事业单位填报 ...

  4. linux中ctrl+c、ctrl+z、ctrl+d区别

    转至:https://www.cnblogs.com/jintaoblogs/p/11343623.html 一.ctrl-c 发送 SIGINT 信号(程序终止(interrupt)信号)给前台进程 ...

  5. 在用Scrapy进行爬虫时碰到的错误

    1.module() takes at most 2 arguments (3 given) 解决方法:导入Spider类时,是from scrapy import Spider而不是from scr ...

  6. (六)目标检测算法之YOLO

    系列文章链接: (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html (二)目标检测算法之R-CNN https://www.cnbl ...

  7. Python安装包报错:PackagesNotFoundError: The following packages are not available from current channels

    以安装SimpleITK包为例,安装时,显示下图错误 conda install SimpleITK 按以下操作完成包安装 anaconda search -t conda SimpleITK #查询 ...

  8. x86-4-任务(task)

    x86-4-任务(task) 4.1 任务: CPU将一整段正在运行的代码称作任务,可以类比操作系统的线程.比如说:你在Windows写了个程序进行运行,这个程序的运行在操作系统层面上来说就是进程里的 ...

  9. Lua在Nginx的应用

    当 Nginx 标准模块和配置不能灵活地适应系统要求时,就可以考虑使用 Lua 扩展和定制 Nginx 服务.OpenResty集成了大量精良的 Lua 库.第三方模块,可以方便地搭建能够处理超高并发 ...

  10. php 23种设计模型 - 状态模式

    状态模式 状态模式当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列 ...