ansible-playbook

一、概念性的东西

1、yaml是一个可读性高,用来表达数据序列化的格式。

2、剧本五大元素

tasks:  任务variables: 变量templates: 使用模板语法文件handlers:   触发执行的taskroles:  角色

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,复制模板,开启服务

2、通知和触发器的引入

3、tag标签

tag的好处:执行playbook时候,-t指定标签所在的动作,即只执行想要执行的动作。

一个标签可以被多个动作共用

- 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、变量、条件判断

在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、迭代嵌套子变量

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://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教程,不错(花钱)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少安在线锤人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值