加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

ansible

发布时间:2020-12-14 05:10:18 所属栏目:大数据 来源:网络整理
导读:rpm -ql ansible 查看安装文件 /usr/bin/ansible 主程序 /usr/bin/ansible-doc 查看配置文档,模块功能查看工具 /usr/bin/ansible-galaxy 下载/上传优秀代码或者Roles模块的官网平台 /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具/usr/bin/ansible-

rpm -ql ansible 查看安装文件

/usr/bin/ansible 主程序
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或者Roles模块的官网平台
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具/usr/bin/ansible-pull远程执行命令工具
/usr/bin/ansible-valult 文件加密工具(脚本打开看到内容,通过这个加密)
/usr/bin/ansible-console 基于console界面与用户交互的执行工具
cat /etc/ansible/hosts Inventory主机清单

ansible --key-file=/root/id_rsa all -m ping #all Inventory主机清单里面所有的主机
Inventory主机清单
172.168.1.112:22 #修改端口

ansible配置文件详解

[defaults] #通用默认配置 inventory = /etc/ansible/hosts #被控制端IP或者DNS列表 library = /usr/share/my_modules/ ##默认搜寻模块的位置 remote_tmp = ~/.ansible/tmp #远程执行临时文件 local_tmp = ~/.ansible/tmp plugin_filters_cfg = /etc/ansible/plugin_filters.yml forks = 5 ##并行线程数 poll_interval = 15 ##回频率或轮询间隔时间 sudo_user = root ##sudo远程执行用户名 ask_sudo_pass = True ##使用sudo,是否需要输入密码 ask_pass = True ##是否需要输入密码 transport = smart ##通信机制 remote_port = 22 ##远程SSH端口 module_lang = C ##模块和系统之间通信的语言 module_set_locale = False gathering = implicit ##控制默认facts收集(远程系统变量) gather_subset = all gather_timeout = 10 roles_path = /etc/ansible/roles ##使用playbook搜索Ansible roles host_key_checking = False ##是否检查远程主机密钥 sudo_exe = sudo ##sudo远程执行命令 sudo_flags = -H -S -n ##传递sudo之外的参数 timeout = 10 ##SSH超时时间 remote_user = root ##远程登录用户名 log_path = /var/log/ansible.log ##日志文件存放路径 module_name = command ##Ansible命令默认执行的模块 executable = /bin/sh ##执行的shell环境,用户shell模块 hash_behaviour = replace ##特定的优先级覆盖变量 jinja2_extensions = jinja2.ext.do,jinja2.ext.i18 ##允许开启jinja2扩展模块 private_key_file = /path/to/file ##私钥文件存储位置 display_skipped_hosts = True ##显示跳过任何任务的状态 system_warnings = True ##禁用系统运行Ansible潜在问题警告 deprecation_warnings = True ##PlayBook输出禁用“不建议使用”警告 command_warnings = False ##command模块Ansible默认发出警告 nocolor = 1 ##输出带上颜色区别,0表示开启,1表示关闭 pipelining = False ##开启pipe SSH通道优化 [accelerate] ##accelerate缓存加速 accelerate_port = 5099 ##加速连接端口5099 accelerate_timeout = 30 ##命令执行超过时间,单位为s accelerate_connect_timeout = 5.0 ##上一个活动连接的时间,单位为min accelerate_daemon_timeout = 30 ##允许多个私钥被加载到daemon accelerate_multi_key = yes      ##任何客户端想要连接daemon都要开启这个选项

?

ansible 主机清单匹配规则:

all 表示主机清单所有主机 ansible all -m ping    
* 通配符(机清单) ansible "*" -m ping ansible 192.168.1.* -m ping ansible "*svr" -m ping 或关系 ansible web:db -m ping ansible 192.168.1.1:192.168.1.22 -m ping 逻辑与(交集) ansible "web:&db" -m ping # 在web组并且在db组中的机器 逻辑非 ansible web:!db -m ping # 在web组中,但是不在db组中的机器 需要用单引号 正则 ansible "~(web|db)..hh.com" -m ping

sudo 连接方式:
sudo 连接方式:
    [[email?protected] ~]#  ansible all -m command -a "ls -lh" -u kuwo -k -b -K     #-b sudo用户,默认配置文件为root -K sudo密码
    SSH password:
    SUDO password[defaults to SSH password]:
    
    ansible all -m ping -u kuwo -k -b --become-user mgpj #以kuwo sudo 切换至mgpj用户执行ping
    ansible all -m ping -u kuwo --become-user=root -a "ls -l" mgpj #以kuwo sudo 切换至 root用户执行ping

?

常用模块

ping模块

[[email?protected] ~]# ansible -uroot --key-file=/root/id_rsa all -m ping
[[email?protected] ~]# ansible -uroot -k all -m ping

?

-m command 模块 默认模块 <>|;& $ 这些特殊字符command不支持
参数:
creates 文件存在 就不执行 #ansible all --key-file=/root/id_rsa -m command -a "creates=/etc/fstab ls -lh /root" #执行
removes 文件不存在 就不执行 #ansible all --key-file=/root/id_rsa -m command -a "removes=/etc/fs ls -lh /root" #不执行?
chdir 切换目录 #ansible all --key-file=/root/id_rsa -m command -a "chdir=/etc creates=ftab ls -lh /root"
#ansible all --key-file=/root/id_rsa -m command -a "chdir=/opt sh ./a.sh" 执行shell脚本


-m shell 模块 跟command模块的区别 支持<>|;& $ 这些特殊字符
#ansible all --key-file=/root/id_rsa -m shell -a "echo 123|passwd --stdin test" #修改密码

-m script 模块 执行本机的shell脚本 都其他主机运行
#ansible all --key-file=/root/id_rsa -m script -a "a.sh" #ansible本机的a.sh脚本 在所有主机运行执行仪表

-m copy 模块 拷贝本机的文件到其他主机
#ansible all --key-file=/root/id_rsa -m copy -a "src=/root/1.jpg dest=/opt/3.jpg backup=yes mode=066" #ansible本机的/root/1.jpg 文件拷贝到所有主机/opt/3.jpg 并且备份 给权限066
#ansible all --key-file=/root/id_rsa -m copy -a "src=/root/1.jpg dest=/opt/3.jpg backup=yes mode=066 owner=test"

#ansible all --key-file=/root/id_rsa -m copy -a "content=‘hellonworld‘ dest=/opt/test.log" #内容生成到所有主机的/opt/test.log文件中

 
 

-m fetch 模块 拷贝客服端的文件到服务器,只支持一个文件拷贝 目录可以先tar
#ansible all --key-file=/root/id_rsa -m fetch -a "src=/opt/test.log dest=/root" #拷贝客服端/opt/test.log文件到 ansible主机中的root目录

 
 

-m file 模块 创建文件设置文件属性
参数 state=touch创建文件 state=directory创建目录 state=absent删除文件 state=link创建软连接 state=hard创建硬连接
#ansible all --key-file=/root/id_rsa -m file -a ‘path=/opt/222221111 state=touch‘ #path name dest 这3个在这里面都可以用 都是一个意思
#ansible all --key-file=/root/id_rsa -m file -a ‘path=/opt/2222211112 state=directory‘
#ansible all --key-file=/root/id_rsa -m file -a ‘path=/opt/2222211112 state=absent‘
#ansible all --key-file=/root/id_rsa -m file -a ‘src=/etc/fstab path=/opt/2222211112 state=link‘
#ansible all --key-file=/root/id_rsa -m file -a ‘path=/opt/ state=absent‘ 删除文件

-m hostname 模块 修改主机名
#ansible all --key-file=/root/id_rsa -m hostname -a ‘name=node‘

-m corn 模块 创建计划任务
#ansible all --key-file=/root/id_rsa -m cron -a ‘minute=* weekday=1,2,3,4,5 job="/usr/bin/wall FBI" name=wall‘ #name 名字 就在计划任务上面显示这个#Ansible: wall
#ansible all --key-file=/root/id_rsa -m cron -a ‘disable=true job="/usr/bin/wall FBI" name=wall‘ #禁用计划任务
#ansible all --key-file=/root/id_rsa -m cron -a ‘disable=false job="/usr/bin/wall FBI" name=wall‘ #启用
#ansible all --key-file=/root/id_rsa -m cron -a ‘name=wall state=absent‘ #删除计划任务

-m yum 模块
#ansible all --key-file=/root/id_rsa -m yum -a ‘name=ftp‘
#ansible all --key-file=/root/id_rsa -m yum -a ‘name=ftp state=installed‘ #安装ftp 默认present 可以指定 `present‘ or `installed‘,`latest‘安装
#ansible all --key-file=/root/id_rsa -m yum -a ‘name=ftp,httpd state=installed‘ #安装多个
#ansible all --key-file=/root/id_rsa -m yum -a ‘name=ftp state=absent‘ #删除 或者用removed
#ansible all --key-file=/root/id_rsa -m yum -a ‘name=dstat update_cache=yes‘ #一边安装包一边清理缓存

 
 


-m service 模块 管理服务
started,stopped,restarted,reloaded,got: restartd"
#ansible all --key-file=/root/id_rsa -m service -a "name=sshd state=stopped" #启动服务器
#ansible all --key-file=/root/id_rsa -m service -a "name=sshd state=stopped enabled=yes" #enabled=yes开机启动 查看systemctl is-enabled sshd.service是否开机启动

 
 

-m user 模块
#ansible all --key-file=id_rsa -m user -a "name=nginx shell=/sbin/nologin system=yes home=/opt/nginx groups=root,bin uid=90"
#ansible all --key-file=id_rsa -m user -a "name=nginx state=absent remove=yes" #remove=yes删除家目录

?

?

主机清单中指定单独主机执行ansible? 使用参数 --limit?

ansible all --key-file=/root/id_rsa -m hostname -a name=node --limit 172.168.1.112 ansible all --key-file=/root/id_rsa -m hostname -a name=node --limit all  #指定组名也可以的 

?

ansible? ?playbook 使用的yaml 或者 yml 文件:

test.yml文件 - hosts: all become: yes #是否允许身份切换 become_method: sudo   #切换用户身份的方式,有sudo、su、pbrun等方式,默认为sudo tasks: - name: create file #remote_user: test #become: yes #是否允许身份切换 #become_method: sudo  #切换用户身份的方式,有sudo、su、pbrun等方式,默认为sudo #become_user: test #切换指定的用户 file: name=/opt/test state=touch

ansible-playbook -utest -k test.yml #普通用户执行
ansible-playbook --list-hosts test.yml#获取当前yml里面的清单主机列表
ansible-playbook -utest -k test.yml --limit 172.168.1.112 test.yml 里面清单主机中的特定这台主机执行
ansible-playbook --list-tasks test.yml #查看任务

?

playbook 之 notify 和 handlers?配合使用,执行yml文件的时候,里面内容会自动执行;?notify 当某文件程序目录发生变化的时候 通知handlers处理,

  - hosts: all become: yes #是否允许身份切换 become_method: sudo   #切换用户身份的方式,有sudo、su、pbrun等方式,默认为sudo tasks: - name: create file #remote_user: test #become: yes #是否允许身份切换 #become_method: sudo  #切换用户身份的方式,有sudo、su、pbrun等方式,默认为sudo #become_user: test #切换指定的用户 file: name=/opt/test state=touch notify: stop httpd #create file执行完后 通知handlers里面的name: stop httpd 做停止服务
- name: create user user: name=newusers2 system=yes shell=/sbin/nologin notify: #下面可以通知handlers多个name做处理,必须是发生改变 或 新建的时候 替换的时候 才会执行 也就是说颜色是黄色的才执行 - restart httpd #通知handlers 描述的名字 - stop httpd - name: install httpd yum: name=httpd - name: create content copy: content="hello" dest=/opt/test ignore_errors: True #忽略错误,执行出错了 忽略 继续执行后面的任务,不会退出来 - name: start service service: name=httpd state=started enabled=yes handlers: #触发器 - name: restart httpd service: name=httpd state=restarted - name: stop httpd service: name=httpd state=stopped

ansible-playbook -utest -k test.yml #普通用户执行
ansible-playbook --list-hosts test.yml#获取当前yml里面的清单主机列表
ansible-playbook -utest -k test.yml --limit 172.168.1.112 test.yml 里面清单主机中的特定这台主机执行
ansible-playbook --list-tasks test.yml #查看任务

?

?playbook 之 tags:加标签,作用是将来可以调用这个标签里面的内容,多个动作可以用一个标签,也就是标签名相同

- hosts: all become: yes become_method: sudo    tasks: - name: create file #remote_user: test #become: yes #become_method: sudo  #become_user: test file: name=/opt/test state=touch #notify: stop httpd tags: createfile #定义标签 - name: create user user: name=newusers2 system=yes shell=/sbin/nologin notify: - restart httpd - stop httpd - name: install httpd yum: name=httpd

ansible-playbook --key-file=/root/id_rsa test.yml -t starthttpd? ? #-t starthttpd? ? ?指定标签名
ansible-playbook --key-file=/root/id_rsa test.yml -t starthttpd,createfile? ? ? ? ? ?#同时执行2个标签

?

playbook之变量

ansible all --key-file=/root/id_rsa -m setup #查看系统变量,这些变量都是可以直接拿到playbook里面直接使用的
ansible all --key-file=/root/id_rsa -m setup -a ‘filter=ansible_swapfree_mb‘ #过滤变量信息

    参数 -e - hosts: all become: yes become_method: sudo tasks: - name: create user user: name={{ arg }} system=yes shell=/sbin/nologin
#ansible
-playbook --key-file=/root/id_rsa -e arg=uuuukkk test2.yml #ansible-playbook --key-file=/root/id_rsa -e arg1=2 arg2=1 arg2=3 test2.yml #指定多个变量

?

/etc/ansible/hosts 在主机清单中定义变量,可以定义主机变量 和 公共变量

普通变量:单一的单个主机有效,优先级比公共变量高 /etc/ansible/hosts 文件中组db里面的172.168.1.112   定义了一个单一变量  hostname [db] 172.168.1.112   hostname=node1 #定义个hostname变量 yml内容: - hosts: all become: yes become_method: sudo tasks: - name: hostname
               hostname: name={{ hostname }} #ansible-playbook --key-file=/root/id_rsa test2.yml #执行后 就修改主机名为node1

?

公共变量(组变量):针对一个组的主机定义变量 /etc/ansible/hosts 文件中组db里面,下面定义个db的组变量 [db] 172.168.1.112 hostname=node1 #定义个单一变量 [db:vars] #对DB组定义了公共变量 host=www domian=com yml文件: - hosts: db become: yes become_method: sudo tasks: - name: hostname
                 hostname: name={{ host }}.{{ hostname }}.{{domian}} #调用host公共变量 hostname单一变量 domian公共变量
#ansible
-playbook --key-file=/root/id_rsa test2.yml 主机名就修改成了www.node1.com

?

通过yml文件定义变量

testvars.yml: #存放变量的文件 var1: open var2: nginx test.yml - hosts: db vars_files: #指定存放变量testvars.yml文件 - testvars.yml tasks: - name: create fiel file: name=/opt/{{ var2 }} state=touch    #var2  获取的是    testvars.yml文件的变量
#ansible-playbook --key-file=/root/id_rsa test.yml

?

playbook之模版template: 是一个模块? 只能在playbook中使用

1 cp /etc/nginx/nginx.conf     ./templates/nginx.conf.j2 #templates 在当前目录下面建立一个templates目录,默认从这个目录查找,如果不是,需要定义绝对路劲
2 修改
/templates/nginx.conf.j2文件 找到修改修改的变量 例如 worker_processes {{ cpu }}; 工作进程个数. 定义cpu模版内容
3 调用变量,可以是单一变量 系统setup变量 公共变量 yml文件变量
--- - hosts: db become: yes become_method: sudo vars_files: - testvars.yml #这里面使用的是文件变量 这个文件变量中有定义个cpu: 5 tasks: - name: install nginx yum: name=nginx - name: copy file template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf #使用template模块 拷贝这个文件的时候,会根据模版中的变量名找值 notify: reload nginx - name: start nginx service: name=nginx state=started enabled=yes handlers: - name: reload nginx service: name=nginx state=restarted


#ansible-playbook --key-file=/root/id_rsa test.yml

?

变量的优先级: 命令-e变量 >? playbook里面定义的变量 > 主机清单里面定义的变量(普通变量>公共变量)

playbook 之?when 判断语句

-m setup 查看到各个主机的 ansible_os_family 家庭版本系列 ansible_distribution 系统 ansible_distribution_major_version系统版本 ---
- hosts: db become: yes #是否允许身份切换 become_method: sudo   #切换用户身份的方式,有sudo、su、pbrun等方式,默认为sudo vars_files: - testvars.yml tasks: - name: install nginx yum: name=nginx - name: copy file 6 when: ansible_distribution_major_version == "6" #当系统版本是6的时候 拷贝下面文件 template: src=nginx6.conf.j2 dest=/etc/nginx/nginx.conf notify: reload nginx - name: copy file 7 when: ansible_distribution_major_version == "7" #当系统版本是7的时候 拷贝下面文件 template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf notify: reload nginx - name: start nginx service: name=nginx state=started enabled=yes handlers: - name: reload nginx service: name=nginx state=restarted

?

playbook之with_items 迭代 也就是循环

---
- hosts: db become: yes #是否允许身份切换 become_method: sudo   #切换用户身份的方式,有sudo、su、pbrun等方式,默认为sudo vars_files: - testvars.yml tasks: - name: file
      file: name=/opt/{{ item }} state=touch      #item 代表with_items里面的值 类似于for 里面的值 when: ansible_distribution_major_version == "7" #如果是7 才执行创建文件  with_items: #相当于是for循环 - file1 - file2 - file3 - file4 - file5 - name: install with_items: - htop - sl - hping3
     yum: name={{item}}

- name: test
user: name={{item.name}}
with_item:
     - {name:‘test‘,group:‘test2‘}
#这种方式也支持 with_items: {name: test,gr: g1} user: name={{item.name}} group={{item.gr}}

?

playbook之if 判断

for.yml: ---
- hosts: db become: yes #是否允许身份切换 become_method: sudo   #切换用户身份的方式,有sudo、su、pbrun等方式,默认为sudo vars: http: - web1 - web2 service: - db: name1: mysql name2: sqlserver tasks: - name: file template: src=for.conf.j2 dest=/opt/for.conf
templates目录下面for.conf.j2 {
%for k in http %} #for 循环http {{k}}      #获取到web1 web2 {%endfor%} {%for i in service %} {%if i.db %} #判断i.db是否有值 {{i.db}} {%else%} aaaa #没有就显示aaa {%endif%} {{i.name1}} {{i.name2}} {%endfor%}
#ansible
-playbook --key-file=/root/id_rsa for.yml 执行会自动找templates目录下面for.conf.j2文件

?

Roles

ansible roles 各个目录作用
role_name/:我们定义的role的名字
file/:用于存放copy或script等模块调用的函数
tasks/:用于定义各种task,此目录一定要有main.yml;其他文件需要main.yml包含调用
handlers:用于定义各种handlers,此目录一定要有main.yml;其他文件需要main.yml包含调用
vars:用于定义variables,此目录一定要有main.yml;其他文件需要main.yml包含调用
templates/:存储由template模块调用的模板文本;
meta/:定义当前角色的特殊设定及其依赖关系,此目录中至少应该有一个名为main.yml的文件;其它的文件需要由main.yml进行“包含”调用;
default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读