ansible-playbook执行方法
#这个是你选择的主机
- hosts: webservers
#这个是变量
vars:
http_port: 80
max_clients: 200
#远端的执行权限
remote_user: root
tasks:
如果有些系统做了相关的sudo限制,需要在playbooks里面开启sodu,或者直接偷懒,权限直接为root !
- hosts: web
remote_user: kangkang
tasks:
- service: name=nginx state=started
sudo: yes #是否提权 默认sudo为root
sudo_user:root ####sudo提权为root用户
#执行剧本,playbook里面定义过变量,可以使用-e指定变量覆盖文件内的变量,-e优先级最高
ansible-playbook diskpart.yaml [-e disk=/dev/sdb diskfullpath=/dev/sdb1 mountDir=da
ansible-playbook #使用方法
ansible-playbook 文件名.yml --syntax-check ##检查playbook文件的语法是否正确
ansible-playbook 文件名.yml #执行
#如果过程有报错想要执行 其中的一个步骤 可以根据tags标签来进行单独执行命令:
语法:ansible-playbook --tags="标签名" 文件名.yml
举例: ansible-playbook --tags="link" 文件名.yml #执行上面的软连接部分
13.absible test -m script -a 'test.sh' :
将本地的tesh.sh在远程主机上运行(脚本所在路径只能使用相对路径)
11.ansible all -m set up : 查看远程主机的信息
12.ansible all -m service -a 'name=httpd enabled=yes':设定服务是否开机启动
name=:服务名称,如httpd
通过命令行指定变量,优先级最高
ansible-playbook –e varname=value
ansible test -m shell -a 'echo abcd1234|passwd --stdin user1' #修改密码 修改之后最好确认一下 最好使用script脚本方式修改 #此方法不保险
YUM模块(yum)
- name: Download the nginx package but do not install it #下载nginx包但不安装
yum: #YUM模块
name:
- nginx #安装包名称
state: latest
download_only: true ##只下载包不安装
- name: Install a list of packages #安装多个数据包
yum:
name:
- nginx
- php
- mysql
state: present
- name: install nginx rpm from a local file ##安装本地rpm包文件
yum:
name: /usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm
state: present
- name: ensure a list of packages installed ##嵌入变量 下载安装包列表
yum:
name: "{{ packages }}"
vars:
packages:
- httpd
- httpd-tools
- name: remove the Apache package ### state 为absent 卸载httpd软件包
yum:
name: httpd
state: absent
USER 用户模块(user)
groups:指定用户的属组
uid:指定用的uid
password:为用户设置登陆密码,此密码是明文密码加密后的密码
update_password:always/on_create
always:只有当密码不相同时才会更新密码(默认)
on_create:只为新用户设置密码
name:指定用户名
createhome:是否创建家目录 yes|no(默认是yes)
system:是否为系统用户
remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r(默认是no)
state:是创建还是删除 present(添加(默认值))or absent(移除)
shell:指定用户的shell环境
append:yes/no
yes:增量添加group
no:全量变更group,只设置groups指定的group组(默认)
expires:设置用户的过期时间,值是一个时间戳
3、注意事项
注:指定password参数时,不能使用后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可。
- user: name=johnd comment="John Doe" uid=1040 group=admin
- user: name=james shell=/bin/bash groups=admins,developers append=yes
- user: name=johnd state=absent remove=yes
- user: name=james18 shell=/bin/zsh groups=developers expires=1422403387
#生成密钥时,只会生成公钥文件和私钥文件,和直接使用ssh-keygen指令效果相同,不会生成authorized_keys文件。
- user: name=test generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa
- name: "add user docker"
user: name={{ item.name }} password={{ item.dockerpass | password_hash('sha512') }} state=present update_password=always ##密码需要加密 不然执行报警告 。不加密也可以执行 没有查是版本还是其他问题
with_items:
- { name: 'docker', dockerpass: '123123' }
tags:
- add user docker
# 删除用户'
user:
name: johnd
state: absent
remove: yes
#更新用户密码
user: name={{ item.name }} password={{ item.rootpass | password_hash('sha512') }} state=present update_password=always
with_items:
- { name: 'root', rootpass: '123123' }
tags:
- update passwd
创建三个用户
- name: create user
user: name={{item}}
with_items:
- xixi
- haha
- memeda
FILE模块文件(file)
# touch文件,但添加/删除一些权限
- file:
path: /etc/foo.conf
state: touch
mode: "u+rw,g-wx,o-rwx" #选项: file, link, directory, hard, touch, absent
##类似同上 稍微有点区别
# touch a file, using symbolic modes to set the permissions (equivalent to 0644)
- file:
path: /etc/foo.conf
state: touch
mode: "u=rw,g=r,o=r"
# 更改文件所有权、组和模式。使用八进制数指定模式时,第一个数字应始终为0
- file:
path: /etc/foo.conf
owner: foo
group: foo
mode: 0644
# 使用file模块创建软连接
- file:
src: /file/to/link/to
dest: /path/to/symlink
owner: foo
group: foo
state: link
# 创建目录并赋予755权限
- file:
path: /etc/some_directory
state: directory
mode: 0755
SERVICE服务模块(service)
#触发重启服务器
notify:
- restart apache ## handlers -name引用名
- name: ensure apache is running
service: name=httpd state=started
#这里的restart apache 和上面的触发是配对的。这就是handlers的作用。相当于tag
handlers:
- name: restart apache ## notify:引用名
service: name=httpd state=restarted
# 如果httpd没有启动 就启动httpd服务
- service:
name: httpd
state: started #参数可选( started, stopped, restarted, reloaded )
enabled: yes #开机启动 参数可选( yes,no )
#如果httpd启动 就关闭httpd服务
- service:
name: httpd
state: stopped
#重启网络网卡
# Example action to restart network service for interface eth0
- service:
name: network
state: restarted
args: eth0 #注意网卡接口名
#可以使用
# Example action to start service foo, based on running process /usr/bin/foo
- service:
name: foo
pattern: /usr/bin/foo
state: started
LINEINFILE文件修改模块(lineinfile)
path参数 :必须参数,指定要操作的文件。
line参数 : 使用此参数指定文本内容。
backup参数:是否在修改文件之前对文件进行备份。
create参数 :当要操作的文件并不存在时,是否创建对应的文件。
regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
state参数:当想要删除对应的文本时,需要将state参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present。
backrefs参数:默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yes。backrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了,这样说不太容易明白,可以参考后面的示例命令理解。backrefs=yes除了能够开启后向引用功能,还有另一个作用,默认情况下,当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,不过,如果使用了backrefs=yes,情况就不一样了,当使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不变。
insertafter参数:借助insertafter参数可以将文本插入到“指定的行”之后,insertafter参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
insertbefore参数:借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
# 替换config文件中匹配到的SELINUX=开头的行替换为SELINUX=enforcing'
- lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: 'SELINUX=enforcing'
#删除/etc/sudoers文件%wheel开头的行
- lineinfile:
path: /etc/sudoers
state: absent
regexp: '^%wheel'
#替换行,并指定用户,组,权限。
- lineinfile:
path: /etc/hosts
regexp: '^127\.0\.0\.1'
line: '127.0.0.1 localhost'
owner: root
group: root
mode: 0644
- lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen '
insertafter: '^#Listen ' #EOF末尾插入行
line: 'Listen 8080' #替换regexp匹配到的行
- lineinfile:
path: /etc/services
regexp: '^# port for http'
insertbefore: '^www.*80/tcp' #BOF开头插入行
line: '# port for http by default' #替换行
#如果文件不存在,则向其添加一行 新建文件
# Add a line to a file if it does not exist, without passing regexp
- lineinfile:
path: /tmp/testfile
line: '192.168.1.99 foo.lab.net foo'
# 虽然也是替换行,需注意单引号。 原样输出
- lineinfile:
path: /etc/sudoers
state: present
regexp: '^%wheel\s'
line: '%wheel ALL=(ALL) NOPASSWD: ALL'
# Yaml requires escaping backslashes in double quotes but not in single quotes
- lineinfile:
path: /opt/jboss-as/bin/standalone.conf
regexp: '^(.*)Xms(\\d+)m(.*)$'
line: '\1Xms${xms}m\3'
backrefs: yes
# Validate the sudoers file before saving
- lineinfile:
path: /etc/sudoers
state: present
regexp: '^%ADMIN ALL='
line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'
validate: '/usr/sbin/visudo -cf %s'
SETUP模块(setup)
主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数,具体使用示例如下(由于输出结果较多,这里只列命令不写结果)
每个被管理节点在接收并运行管理命令之前,会将自己主机相关信息(如系统版本,主机IP地址)告知ansible管理主机
#### 1、帮助信息
ansible-doc -s setup
--tree :将所有主机的输出信息保存到/tmp/目录下,以/etc/ansible/hosts里的主机名为文件名
ansible all -m setup -a 'filter=ansible_distribution_version' --tree /tmp/
filter :过滤关键字
#ansible db -m setup -a 'filter=ansible_distribution_version'
gather_subset:按子集收集信息,值有all, min, hardware, network, virtual, ohai, facter。不包含请使用!号,如,!network
CRON 定时任务模块(cron)
ansible-doc -s cron
1 backup:对远程主机上的原任务计划内容修改之前做备份
2 cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
3 day:日(1-31,*,*/2,……)
4 hour:小时(0-23,*,*/2,……)
5 minute:分钟(0-59,*,*/2,……)
6 month:月(1-12,*,*/2,下·……)
7 weekday:周(0-7,*,……)
8 job:要执行的任务,依赖于state=present
9 name:该任务的描述
10 special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
11 state:确认该任务计划是创建还是删除
12 user:以哪个用户的身份执行
2、使用说明
ansible db -m cron -a 'minute="" hour="" day="" month="" weekday="" job="" name="(必须填写)" state=
1、定时设置指定值的写入即可,没有设置的可以不写(默认是*)
2、name必须写
3、state有两个状态:present(添加(默认值))or absent(移除)
3、使用范例
1、添加定时任务
ansible db -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state="present"'
ansible db -a "crontab -l"
2、移除定时任务
ansible db -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state="absent"'
ansible db -a "crontab -l"
ansible-playbook for循环
---
- hosts: testweb
remote_user: root
vars: #### 定义变量 :(listen = 8080)
nginx_vhosts:
- listen: 8080
{% for vhost in nginx_vhosts %} ##for循环吧 vars定义的nginx_vhosts变量值定义给vhost
server {
listen {{ vhost.listen }} ####引用变量值
}
{% endfor %}
#生成的结果
server {
listen 8080
}
#########################################################################
- hosts: mageduweb
remote_user: root
vars:
nginx_vhosts:
- web1:
listen: 8080
root: "/var/www/nginx/web1/"
- web2:
listen: 8080
server_name: "web2.abc.com"
root: "/var/www/nginx/web2/"
- web3:
listen: 8080
server_name: "web3.abc.com"
root: "/var/www/nginx/web3/"
tasks:
- name: template config to
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
{% for vhost in nginx_vhosts %}
server {
listen {{ vhost.listen }}
{% if vhost.server_name is defined %}
server_name {{ vhost.server_name }}
{% endif %}
root {{ vhost.root }}
}
{% endfor %}
#生成的结果
server {
listen 8080
root /var/www/nginx/web1/
}
server {
listen 8080
server_name web2.abc.com
root /var/www/nginx/web2/
}
server {
listen 8080
server_name web3.abc.com
root /var/www/nginx/web3/
}
ansible-playbook 判断条件
- hosts: appsrvs
remote_user: root
tasks:
- name: install package
yum: name=httpd
- name: template 6
template: src=httpd_6.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify: restart service
when: ansible_distribution_major_version == "6" ###判断条件 判断系统版本为6
- name: template 7
template: src=httpd_7.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify: restart service
when: ansible_distribution_major_version == "7" ###判断条件 判断系统版本为7
- name: start service
service: name=httpd state=started
handlers:
- name: restart service
一、在剧本的当前目录创建templates文件夹(template只能在剧本使用)
用作模板文件。在基于playbook进行修改
ansible内置变量
4.play_hosts变量是用来返回当前playbook运行的主机信息,返回格式是主机list结构,inventory_dir变量是返回当前playbook使用的Inventory目录
5.获取当前操作的所有主机名
inventory_hostname变量是返回Inventory文件里面定义的主机名,inventory_hostname_short会返回I文件中主机名的第一部分
ansible test_group -m debug -a "msg={{inventory_hostname}}"
6. groups变量是一个全局变量,它会打印出Inventory文件里面的所有主机以及主机组信息
groups
ansible master -m debug -a "msg={{groups.test}}"
7.获取主机所在组的名称
group_names
8.获取主机清单目录
inventory_dir
2、经常获取的信息,统计表格如下
关键字 |
说明 |
返回值例子 |
ansible_nodename |
节点名 |
“6-dns-1.hunk.tech” |
ansible_fqdn |
FQDN名 |
“6-dns-1.hunk.tech” |
ansible_hostname |
主机短名称 |
“6-dns-1” |
ansible_domain |
主机域名后缀 |
“hunk.teh” |
ansible_memtotal_mb |
总物理内存 |
“ansible_memtotal_mb”: 222 |
ansible_swaptotal_mb |
SWAP总大小 |
“1023” |
ansible_processor |
CPU信息 |
Intel® Core™ i5-5200U CPU @ 2.20GHz |
ansible_processor_cores |
CPU核心数量 |
4 |
ansible_processor_vcpus |
CPU逻辑核心数量 |
2 |
ansible_all_ipv4_addresses |
有所IPV4地址 |
192.168.0.200 |
ansible_all_ipv6_addresses |
所有IPV6地址 |
|
ansible_default_ipv4 |
默认网关的网卡配置信息 |
|
ansible_eth2 |
具体某张网卡信息 |
不同系统名称需要变化 |
ansible_dns |
DNS设置信 |
|
ansible_architecture |
系统架构 |
x86_64 |
ansible_machine |
主机类型 |
x86_64 |
ansible_kernel |
内核版本 |
“2.6.32-696.el6.x86_64” |
ansible_distribution |
发行版本 |
“CentOS” |
ansible_distribution_major_version |
操作系统主版本号 |
“6” |
ansible_distribution_release |
发行版名称 |
“Final” |
ansible_distribution_version |
完整版本号 |
“7.4.1708” |
ansible_pkg_mgr |
软件包管理方式 |
“yum” |
ansible_service_mgr |
进行服务方式 |
“systemd” |
ansible_os_family |
家族系列 |
“RedHat” |
ansible_cmdline |
内核启动参数 |
|
ansible_selinux |
SElinux状态 |
“disabled” |
ansible_env |
当前环境变量参数 |
|
ansible_date_time |
时间相关 |
|
ansible_python_version |
python版本 |
“2.6.6” |
ansible_lvm |
LVM卷相关信息 |
|
ansible_mounts |
所有挂载点 |
|
ansible_device_links |
所有挂载的设备的UUID和卷标名 |
|
ansible_devices |
所有/dev/下的正在使用的设备的信息 |
|
ansible_user_dir |
执行用户的家目录 |
“/root” |
ansible_user_gecos |
执行用户的描述信息 |
"The root " |
ansible_user_gid |
执行用户的的GID |
0 |
ansible_user_id |
执行用户的的用户名 |
“root” |
ansible_user_shell |
执行用户的shell类型 |
“/bin/bash” |
ansible_user_uid |
执行用户的UID |
0 |