一、概念性的东西
1、yaml是一个可读性高,用来表达数据序列化的格式。
2、剧本五大元素
tasks: 任务 | variables: 变量 | templates: 使用模板语法文件 | handlers: 触发执行的task | roles: 角色 |
3、role角色:
role是task文件、变量文件、handlers文件的集合体,这个集合体的显著特点是:可移植性和可重复执行性。
通常文件如下,不一定必须都要有
files:用来存放由copy模块或script模块调用的文件。
tasks:至少有一个main.yml文件,定义各tasks。
handlers:有一个main.yml文件,定义各handlers。
templates:用来存放jinjia2模板。
vars:有一个main.yml文件,定义变量。
meta:有一个main.yml文件,定义此角色的特殊设定及其依赖关系。
实践中,通常我们以部署某个服务为单元作为一个role ,然后将这些服务单元(role)放在一个roles目录下。
主playbook文件通过调用roles目录下的role,来实现各种灵活多变的部署需求。
tree roles/consul
roles/consul
├── tasks
│ ├── actions
│ │ ├── consul_core.yml.back
│ │ ├── start_consul_agent.yml
│ │ ├── start_registrator.yml
│ │ ├── stop_consul_agent.yml
│ │ └── stop_registrator.yml
│ └── main.yml
└── templates
└── consul_server
https://www.zutuanxue.com/home/4/13_130 有待学习
二:常用命令
1.检查yaml文件的语法是否正确
ansible-playbook qq.yml --syntax-check
2. 检查task任务
ansible-playbook qq.yml --list-task
3.检查主机是否生效
ansible-playbook qq.yml --list-hosts
4.指定从start httpd这个task开始运
ansible-playbook qq.yml --start-at-task='start httpd'
5.测试剧本
ansible-playbook -C qq.yml
6、限定主机范围执行--limit
虽然playbook中定义了执行的主机,但是有时候我们可能仅想在定义的主机中的部分机器上执行,修改playbook中的hosts的范围,但是每次改变主机就修改一次,比较麻烦,我们可以使用--limit参数,指定该playbook在指定的主机上执行。以dbservers为例
ansible-playbook test.yml --limit dbservers (只执行dbservers主机)
ansible-playbook -i hostslist ***.yml --limit @failed.txt (failed.txt保存着想要执行的主机名)
ansible-playbook playbooks/PLAYBOOK_NAME.yml --limit 'all:!host1' (所有的主机执行,排除host1)
ap all -b -m shell -a "dcoker stats --no-stream" -l '!dev8,!dev9' (排除多个hosts)
ap playbooks/xxx.yml -l 'all:!host1' 简写
7、使用root
或者sudoer
的权限
ap -b -m xxx -a 'xxx' xxx.yaml
剧本里面:
8、ap --d(输出debug)
alias ap='/usr/bin/ansible-playbook-2.7'
ap all -b -m shell -a "dcoker stats --no-stream" --d
9、初始化生成一个role
# ansible-galaxy init role_A
- role_A was created successfully
$ tree role_A
role_A
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
10、将hosts写成变量
- hosts: '{{ host | default("xxx") }}'
roles:
- role: "xxx"
action: "xxx"
tags:
- all
- xxx
when:
- "'xxx' in ansible_run_tags or
'all' in ansible_run_tags"
- role: "xxxxx"
action: "xxxxx"
tags:
- all
- xxxx
when:
- "'openapi' in ansible_run_tags or
'all' in ansible_run_tags"
ansible-playbook -e host=1.1.1.1
hosts: {{ host }}
三:剧本元素
1、在目标主机组上面创建一个文件,新建用户,安装apach,复制模板,开启服务
![](https://i-blog.csdnimg.cn/blog_migrate/88445758a6e0e7be4156606e1d0f3d4b.png)
2、通知和触发器的引入
![](https://i-blog.csdnimg.cn/blog_migrate/16d291ceb7c25508967b97b4d4e76593.png)
3、tag标签
tag的好处:执行playbook时候,-t指定标签所在的动作,即只执行想要执行的动作。
一个标签可以被多个动作共用
![](https://i-blog.csdnimg.cn/blog_migrate/b0192eddaab1f6314f2cff7a0912c68b.png)
- hosts: xxy
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=/opt/httpd.conf 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={{service}} state=restarted
4、变量、条件判断
![](https://i-blog.csdnimg.cn/blog_migrate/8a5d121ee82348aa329533237be6a5cc.png)
在ansible的playbook中task之间的相互传递变量
register类型变量
---
- hosts: web
tasks:
- name: show ip address
shell: hostname -I | awk '{print $2}'
register: ip
- name: print ip var to file
shell: echo {{ip}} > /tmp/ip
想要的结果是ip,其他的内容不需要,所以在调用变量得时候使用ip.stdout,即:
---
- hosts: web
tasks:
- name: show ip address
shell: hostname -I | awk '{print $2}'
register: ip
- name: print ip var to file
shell: echo {{ip.stdout}} > /tmp/ip
5、迭代嵌套子变量
![](https://i-blog.csdnimg.cn/blog_migrate/8d9c36429e634eabadeae4bab3753e92.png)
playbook 标准循环:with_items
ansible 批量添加用户,结合playbook脚本实现远程主机批量添加用户
with_items 可以用于迭代一个列表字典,通过{{ item }}获取每次迭代的值(注意语法格式)
---
- hosts: all
tasks:
- user: name="{{item.name}}" group="{{item.group}}" password="{{‘lxkj’|password_hash(‘sha512’)}}"
with_items:
- {name: “lixingyu”, group: “root”}
- {name: “gaopan”, group: “develop”}
- {name: “wanghong”, group: “develop”}
- {name: “maoyonggang”, group: “develop”}
- {name: “majingtao”, group: “develop”}
四、ansible-playbook批量创建用户并配置sudo权限案例
1、业务侧需求
多台主机批量新建用户
用户名:zjz 用户组:zjz 密码:Alf#!@wq 家目录:/home/zjz
用户需要sudo指令: app ALL=(ALL) NOPASSWD:/usr/bin/cat,/usr/bin/tail,/usr/sbin/ss,/usr/bin/netstat,/usr/bin/vi,/usr/bin/mkdir,/usr/bin/kill,/usr/bin/rpm,/usr/bin/systemctl,/usr/sbin/service,/usr/bin/yum,/usr/bin/ps
2、需求实现
利用python模块将明文密码转化为密文
法一:
python3 -c 'import crypt;print(crypt.crypt("Alf#!@wq","zjz"))'
zjPQS9ZF/MoMM (密码:Alf#!@wq,加密后zjPQS9ZF/MoMM)
法二:弹出Password:输入自己想要加密的字符
python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Password:
$6$2c02h3IfmSeSffD3$GdBX9bIP.FJpMiLtFViooKMHqmQs5CAmXGpHgqAN9fWC3/vYyuaEQIXNKsiC9PsWbn1UQ3yqndP2/G1DsK1uc/
此处需要$转义后才能注入成功,如
nsible web -m user -a "name=test state=present comment='this is user tom'
password='\$6\$2c02h3IfmSeSffD3\$GdBX9bIP.FJpMiLtFViooKMHqmQs5CAmXGpHgqAN9fWC3/vYyuaEQIXNKsiC9PsWbn1UQ3yqndP2/G1DsK1uc/'"
ansible服务端/scripts目录下创建sudofile文件,并添加如下内容:
# vi /scripts/sudofile
Cmnd_Alias PASSADMIN = /usr/bin/cat,/usr/bin/tail,/usr/sbin/ss,/usr/bin/netstat,/usr/bin/vi,/usr/bin/mkdir,/usr/bin/kill,/usr/bin/rpm,/usr/bin/systemctl,/usr/sbin/service,/usr/bin/yum,/usr/bin/ps
zjz ALL=(ALL) NOPASSWD: PASSADMIN
编写playbook剧本
# cat useradd.yml
---
- hosts: all
gather_facts: no
tasks:
- name: add zjz user to remote host
user:
name: zjz
home: /home/zjz
password: zjPQS9ZF/MoMM
state: present
- name: copy sudo file to remote host
copy: src=/scripts/sudofile dest=/tmp/sudofile
- name: attach sudofile to /etc/sudoers
shell: cat /tmp/sudofile >> /etc/sudoers
- name: rm remote host sudofile
file:
path: /tmp/sudofile
state: absent
gather_facts参数:指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用到setup获取的信息时用到;
编辑ansible hosts文件
cat /etc/ansible/hosts
[web]
192.168.40.[132:134] ansible_ssh_user=root ansible_ssh_pass='password'
运行ansible-playbook剧本
找到剧本放置的目录,执行ansible-playbook
ansible-playbook useradd.yml
五、ansible中文网站
1、http://www.ansible.com.cn/
2、playbook在线分享平台:https://galaxy.ansible.com
https://galaxy.ansible.com/geerlingguy/mysql (网站拉取剧本,自己改)
![](https://i-blog.csdnimg.cn/blog_migrate/11765cd731718ae045f44e19fb9d33eb.png)
https://blog.csdn.net/qq_43973215/article/details/102566243 有待学习整理
https://mp.weixin.qq.com/s/wLnRFmb5a_23yMF924jdRw 有待学习整理
http://www.yunweipai.com/34638.html ansible不错的教程
https://blog.51cto.com/cloumn/detail/83 骏马金龙的ansible教程,不错(花钱)