ansible
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible相关的知识,希望对你有一定的参考价值。
ansibleansible不是以服务的方式运行,用户需要时执行
首先必须设置主机清单? vim?/etc/ansible/hosts? ,添加如下内容:
[web]
172.16.41.51
172.16.41.61
[beifen]
172.16.41.88
172.16.41.152
ansible 172.16.41.61 -m ping? 如果主机清单中未设置172.16.41.61,则此命令执行报错
[[email protected] 11:13 .ssh]# ansible 172.16.41.61 -m ping
[WARNING]: Could not match supplied host pattern, ignoring: 172.16.41.61
[WARNING]: No hosts matched, nothing to do
主机清单添加对应的地址后执行命令:第一次执行会出现yes/no的提示
ansible 172.16.41.51 -m ping
The authenticity of host ‘172.16.41.51 (172.16.41.51)‘ can‘t be established.
ECDSA key fingerprint is SHA256:ipiclPOhfzuGppT1kscx7sIW5oadl2G+VKKgmwi4NX0.
ECDSA key fingerprint is MD5:f1:40:3e:af:56:a8:95:df:f6:bc:5a:f3:13:a6:fe:e1.
Are you sure you want to continue connecting (yes/no)? yes
取消此项设置:在配置文件中vim /etc/ansible/ansible.cfg? 取消下面的注释
#host_key_checking = False修改为host_key_checking = False
测试命令,提示下列错误,即验证失败,未设置是基于口令或基于publickey验证
[[email protected] 11:15 .ssh]# ansible 172.16.41.61 -m ping
172.16.41.61 | UNREACHABLE! => {
????"changed": false,
????"msg": "Failed to connect to the host via ssh: Warning: Permanently added ‘172.16.41.61‘ (RSA) to the list of known hosts.\r\nPermission denied (publickey,password).",
????"unreachable": true
}
需要添加选项 -k? ?ansible 172.16.41.61 -m ping -k?然后输入主机对应默认的root密码即可成功,而且只可以输入一次,如果多个主机口令不一致会导致执行失败
ansible <host-pattern> [-m module_name] [-a args] 选项定义:
-m?module? ?指定模块,默认为command? ??
-k? ?提示输入ssh连接密码,默认key验证? ? ??
-u? ?指定远程执行的用户? ? ?
-b? ?sudo切换? ??
-K? ?提示输入sudo时的口令
-C? ?检查,并不执行
--list-hosts? ?显示主机列表,可简写 --list
-v? ?详细过程 –vv -vvv更详细
基于key验证,需要将在安装ansible的机器上生成ssh公钥并拷贝值主机清单的机器上
ssh-keygen;ssh-copy-id 172.16.41.51;;ssh-copy-id 172.16.41.61;ssh-copy-id 172.16.41.152;ssh-copy-id 172.16.41.88??ssh-copy-id 172.16.41.52
测试分组的连接情况:ansible web/beifen/all -m ping
查看组的主机列表:ansible all --list-host? ?ansible all --list? ?ansible?web?--list-host? ? ??ansible?beifen--list-host
配置文件修改内容:
log_path = /var/log/ansible.log? ? 取消此行的注释,开启日志功能
host_key_checking = False? ? ? ? ? ? ?检查对应服务器的host_key,建议取消注释
#module_name = command? ? ? ? ? 将此行修改为下面对应的内容,将默认的模块名修改为shell?
module_name = shell? ? ? ? ? ? ? ? ? ? ?
host-pattern:
[[email protected] 12:40 .ssh]# ansible ‘web:!beifen‘ --list? ?
[[email protected] 12:40 .ssh]# ansible "web:!beifen" --list
注意上述示例中单引号和双引号的标记,如果使用非 !? 的话需要使用单引号,使用双引号会报错
ansible常用模块:
1、command模块:执行命令? ? ? ? ?ansible-doc -s command
ansible web -m command -a ‘cat /etc/redhat-release‘
ansible web -m command -a ‘chdir=/etc cat redhat-release‘
ansible web -m command -a ‘ls /data‘
ansible web -m command -a ‘rm -rf??/data‘
ansible web -m command -a ‘ls /data‘
ansible web -m command -a ‘hostname‘
ansible web -m command -a ‘echo $HOSTNAME‘? ? ? ? ? ?不可以显示出预想的结果,结果是
ansible web -m command -a "echo $HOSTNAME"? ? ? ? ??不可以显示出预想的结果,结果是
ansible web -m command -a "echo 123456|passwd --stdin root"? ? ? ? ? ? ??不可以显示出预想的结果,结果是
2、shell模块 :执行命令??注意单引号双引号 ? ? ? ? ? ? ? ? ? ansible-doc -s shell
ansible web -m??shell -a ‘echo $HOSTNAME‘? ? ?注意使用的是单引号 ? ? ? ?使用双引号ansible web -m??shell -a "echo $HOSTNAME"?返回的是ansible的主机名
ansible web -m shell -a ‘chdir=/data touch a.txt‘
ansible web -m shell -a ‘ls /data‘
ansible web -m shell -a ‘sed -i "s/SELINUX=disabled/SELINUX=enforcing/" /etc/selinux/config‘
ansible web -m shell -a ‘cat??/etc/selinux/config‘
ansible web -m shell -a ‘sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config‘
ansible web -m shell -a ‘yum remove -y httpd‘
3、script模块:执行脚本? ? ? ? ? ?ansible-doc -s script
ansible web -m script -a ‘/data/test.sh‘
4、copy模块 :拷贝文件? ? ? ? ? ? ?ansible-doc -s copy
ansible web -m copy -a ‘src=/etc/fstab dest=/data/151 mode=777 owner=wang group=wang backup=yes‘? ? 指定备份backup
复制目录和文件夹:ansible web -m copy -a ‘src=/etc/sysconfig dest=/data/‘
指定内容生成文件:ansible web -m copy -a ‘content=wangbin\nceshi\n123\n456 dest=/data/copy.txt‘
ansible web -m copy -a ‘content=[test]\nname=test\nurl=test dest=/data/test.txt‘
5、fetch模块 :抓取文件,当前不支持抓取文件夹和目录? ?ansible-doc -s fetch
ansible web -m fetch -a ‘src=/data/test.txt dest=/data‘?? ? ? ??
ansible web -m shell -a ‘tar jcvf /root/data.tar.bz2 /data‘? ?打包命令
ansible web -m fetch -a ‘src=/root/data.tar.bz2 dest=/data‘? ?抓取打包文件
6、file模块:设置文件属性? ?ansible-doc -s file
ansible web -m file -a ‘path=/data/test.log owner=wang mode=777‘
ansible web -m file -a ‘src=/data/test.log name=/data/test.link state=link‘? ?创建软连接? ?state=hard? 创建硬链接
ansible web -m file -a ‘path=/data/dir1??state=directory‘? ? ? ? ? 创建目录
ansible web -m file -a ‘path=/data/f1.txt??state=touch‘? ? ? ? ? ? ?创建文件
ansible web -m file -a ‘path=/data/f1.txt??state=absent‘? ? ? ? ? ? 删除文件
ansible web -m file -a ‘path=/data/dir1 state=absent‘? ? ? ? ? ? ? ?删除目录? ? ? ? ? ? ?absent 关键字
ansible web -m file -a ‘path=/data/ state=absent‘? ? ? ? ? ? ? ? ? ? 删除所有文件,此种用法不可用,不会删除所有的文件
ansible web -m shell -a ‘rm -rf /data/"‘? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 这样删除目录下的所有文件
7、hostname模块:修改主机名
ansible 172.16.41.61 -m hostname -a ‘name=6.10-mini‘? ? ? ? ? ? ? ? ? ? ? ? ?centos6? 修改了/etc/sysconfig/network文件? 未修改/etc/hosts
ansible 172.16.41.51 -m hostname -a ‘name=7.6-mini-DNS‘? ? ? ? ? ? ? ? ? centos7? 修改了/etc/hostname? 未修改/etc/hosts
8、cron模块:计划任务
ansible web -m cron -a ‘name=synctime minute=/5 job="/usr/sbin/ntpdate 172.16.41.151 &> /dev/null"‘
ansible web -m cron -a ‘name=synctime minute=/5 job="/usr/sbin/ntpdate 172.16.41.151 &> /dev/null" disabled=true‘? ? ? ? ? 禁用定义的计划任务,实际上就是注释掉计划任务
ansible web -m cron -a ‘name=synctime minute=/5 job="/usr/sbin/ntpdate 172.16.41.151 &> /dev/null" disabled=false‘? ? ? ? ?启用禁用的计划任务
ansible web -m cron -a ‘name=synctime minute=/5 job="/usr/sbin/ntpdate 172.16.41.151 &> /dev/null" state=absent‘? ? ? ? ? ?删除计划任务
ansible web -m shell -a ‘crontab -l ‘
9、yum模块:管理包
ansible web -m yum -a ‘name=ntpdate‘
ansible 172.16.41.88 -m yum -a ‘name=ntpdate state=absent‘? ?卸载包
10、service模块:管理服务
ansible web -m service -a ‘name=named state=started enabled=yes‘? ? ? ? ? ?enabled?设置为true和yes都可以
ansible web -m shell -a ‘ss -ntlu|grep 53‘
ansible web -a ‘service named status ‘
11、user模块:用户管理
ansible web -m user -a ‘name=wangbin?system=yes?shell=/sbin/nologin‘?
ansible web -m user -a ‘name=mysql state=absent remove=yes‘
remove=yes? 删除用户家目录 ? state=absent? 移除用户
12、group组:管理组
ansible-galaxy? ?角色
连接 https://galaxy.ansible.com 下载相应的roles
列出所有已安装的galaxy
?? ?ansible-galaxy list
安装galaxy
?? ?ansible-galaxy install geerlingguy.redis
删除galaxy
ansible-galaxy remove geerlingguy.redis
查看相关文件:tree /root/.ansible/roles/
ansible-pull
ansible-vault
ansible-vault encrypt hello.yml? ? ? ? ?加密
功能:管理加密解密yml文件
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml 加密
ansible-vault decrypt hello.yml 解密
ansible-vault view hello.yml 查看
ansible-vault edit hello.yml 编辑加密文件
ansible-vault rekey hello.yml 修改口令
ansible-vault create new.yml 创建新文件
ansible-console:交互式
ansible-playbook
? ? -C:测试但不执行,干跑模式
ansible-playbook -C hello.yml
vim?hello.yml? 注意语法结果,严格要求空格个数和对齐
#hello world yml file
- hosts: web
??remote_user: root
??tasks:
????- name: hello world
??????command: /usr/bin/wall hello world
yaml语言:
三个连续横线区分多个档案? 可以用三个点号?表示档案结尾
缩进必须是统一的,不能空格和tab混用
缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
yaml语法:
列表? 其所有元素都使用 -? 打头
字典? 通常由多个key和value构成? ?kay: value? 注意冒号? :? 后面一定要有空格 多个之间使用? ,? 分隔
Playbook核心元素
Hosts 执行的远程主机列表
Tasks 任务集
Varniables 内置变量或自定义变量在playbook中调用
Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
Handlers 和 notity 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
ansible-playbook –t tagsname useradd.yml
-
hosts: web
? remote_user: root
? tasks:
? ? - name: name1
? ? ? module: arguments
?
httpd.yml? 其中路径可以写相对httpd.yml的相对路径?例如下述的?src=files/httpd.conf#install httpd
- hosts: web
??remote_user: root
??tasks:
????- name: install httpd
??????yum: name=httpd
????- name: copy conf
??????copy: src=/data/httpd.conf dest=/etc/httpd/conf/ backup=yes
????- name: service
??????service: name=httpd state=started enabled=yes
user.yml
#user add
- hosts: web
??remote_user: root
??tasks:
????- name: group add
??????group: name=mysql gid=3306 system=yes
????- name: user add
??????user: name=mysql group=mysql uid=3306 home=/data/mysql shell=/sbin/nologin system=yes create_home=no
handlers和notify结合使用触发条件
Handlers
是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作
Notify此action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作
#install httpd
- hosts: web
??remote_user: root
??tasks:
????- name: install httpd
??????yum: name=httpd
????- name: copy conf
??????copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
??????notify: restart service
????- name: service
??????service: name=httpd state=started enabled=yes
??????
??handlers:
????- name: restart service
??????service: name=httpd state=restarted
tags? ?执行时使用-t?参数,多个参数之间使用逗号分隔? 多个不同的动作可以使用相同的标签
ansible-playbook -t config,service httpd.yml
Playbook中变量使用
变量名:仅能由字母、数字和下划线组成,且只能以字母开头
变量来源:
1 ansible setup facts 远程主机的所有变量都可直接调用
setup模块:
ansible all -m??setup
ansible all -m??setup -a ‘filter="*fqdn"‘
ansible_fqdn? ?ansible_hostname? ?ansible_nodename? ?主机名? ansible_memtotal_mb? 内存信息
引用变量? {{ 变量名 }}? ?双大括号之间的变量前后可以不加空格,但一般建议添加一个空格
2 在/etc/ansible/hosts中定义
普通变量:主机组中主机单独定义,优先级高于公共变量
公共(组)变量:针对主机组中所有主机定义统一变量
主机清单中定义变量:/etc/ansible/hosts
[web]
172.16.41.51 port=80? ? ? ? ? ? ? ? ? ?普通变量
172.16.41.61 port=8080? ? ? ? ? ? ? ?普通变量
[web:vars]
mark="---"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 公共(组)变量
port=88888
普通变量的优先级高于公共组合变量
3 通过命令行指定变量,优先级最高? ? ?命令行定义变量? -e选项? ?-e? 变量=变量值
ansible-playbook –e varname=value? ? ? ? ? ? ? ??ansible-playbook -e port=8484??file.yml
4?playbook中定义的变量? ? 高于主机清单中的变量
vars:
? - var1: value1
? - var2: value2
5 在独立的变量YAML文件中定义??引用
port: 2222
mark: ___
6 在role中定义
file var
??- hosts: web
????remote_user: root
????vars:
??????- port: 4848
????vars_files:
??????- vars.yml? ? ? ? ? ? ? ? ? ? ? ? ??vars.yml是独立的变量YAML文件
????tasks:
??????- name: file
????????file: name=/data/{{ansible_nodename}}{{mark}}{{port}}.log state=touch
变量优先级:命令行变量(-e)? >>独立的变量YAML文件>>playbook变量>主机清单普通变量>主机清单公共(组)变量
模版template? ??根据模块文件动态生成对应的配置文件
文本文件,嵌套有脚本(使用模板编程语言编写)
Jinja2语言,使用字面量,有下面形式
字符串:使用单引号或双引号
数字:整数,浮点数
列表:[item1, item2, ...]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?可以修改
元组:(item1, item2, ...)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?不可以修改
字典:{key1:value1, key2:value2, ...}
布尔型:true/false
算术运算:+, -, *, /, //, %, **? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//?整除
比较操作:==, !=, >, >=, <, <=
逻辑运算:and,or,not
流表达式:For,If,When
template功能:根据模块文件动态生成对应的配置文件
template文件必须存放于templates目录下,且命名为 .j2 结尾
在放置yaml文件的目录下?创建?templates目录
yml 文件需和templates目录平级,目录结构如下:
./
├── temnginx.yml
└── templates
? ? ? ? ? ? ? └── nginx.conf.j2
ansible web -m shell -a ‘yum -y remove httpd‘
nginx.yml? 内容如下:
#nginx
??- hosts: web7
????remote_user: root
????tasks:
??????- name: package
????????yum: name=nginx
??????- name: conf
????????template: src=nginx.j2 dest=/etc/nginx/nginx.conf
????????notify: restart service
??????- name: service
????????service: name=nginx state=started enabled=yes
????handlers:
??????- name: restart service????????????????????????????????????????????????????????????????????????????????????????
????????service: name=nginx state=restarted
nginx配置进程个数:
worker_processes {{ansible_processor_vcpus*2+2}};
引用模版:
- name: config
? template: src=模版文件名称?dest=配置文件存放位置
when:
系统主版本:ansible_distribution_major_version? 6或者7
#install httpd
- hosts: web
??remote_user: root
??tasks:
????- name: install httpd
??????yum: name=httpd
????- name: copy conf 7
??????template: src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
??????when: ansible_distribution_major_version == "7"
??????notify: restart service
????- name: copy conf 6??????????????????????????????????????????????????????????????????????????????????????????????
??????template: src=templates/httpd6.conf.j2 dest=/etc/httpd/conf/httpd.conf
??????when: ansible_distribution_major_version == "6"
??????notify: restart service
????- name: service
??????service: name=httpd state=started enabled=yes
??handlers:
????- name: restart service
??????service: name=httpd state=restarted
迭代:
- name: add several users
user: name={{ item }} state=present groups=wheel
with_items: - testuser1
- testuser2
新建组和用户,组合用户先定义,使用字典 - name: create user
? user:? name={{item.named}} group{{item.group}}
? with?items:?
? ? - {name: "alice",group: "agroup"}
? ? - {name: "bob",group: "bgroup"}
? ? - {name: "centos",group: "cgroup"}
Playbook中template for if
vim test.for.j2
{%for i in test_ports%}
server {
? ? listen {{i}}
? ? servername www.a.com
? ? root /app/websitea
}
{%endfor%}
vim test.for.jml?
- host: web
? remote_user: root
? vars:
? ? test_ports:
? ? ? - 81
? ? ? - 82
? ? ? - 83
? tasks:?
? ? - name: template
? ? ? ?template: src=test.for.j2 dest=/data/test.conf
vim test.for.jml?
- host: web
? remote_user: root
? vars:
? ? test_ports:
? ? ? - 81
? ? ? - 82
? ? ? - 83
? tasks:?
? ? - name: template
? ? ? ?template: src=test.for.j2 dest=/data/test.conf
vim test2.for.jml?
- host: web
? remote_user: root
? vars:
? ? vhosts:?
? ? ? - web1:?
? ? ? ? port: 81
? ? ? ? name:www.a.com
? ? ? ? dir: /data/websitea
? ? ? - web2:?
? ? ? ? port: 82
? ? ? ? name:www.b.com
? ? ? ? dir: /data/websiteb
? ? ? - web3?
? ? ? ? port: 83
? ? ? ? name:www.c.com
? ? ? ? dir: /data/websiteac
? tasks:?
? ? - name: template
? ? ? ?template: src=test2.for.j2 dest=/data/test2.conf
vim test2.for.j2
{%for i in vhosts%}
server {
? ? listen {{i.port}}
? ? servername {{i.name}}
? ? root {{i.dir}}
}
{%endfor%}
以上是关于ansible的主要内容,如果未能解决你的问题,请参考以下文章
Ansibleansible安装,用户级执行ansible命令,清单构建,配置文件详解
Ansibleansible安装,用户级执行ansible命令,清单构建,配置文件详解