我想创建一个 GPG 密钥来测试 Nexus3 和 N3DR。当我按照这些说明进行操作时,会创建一个密钥,并且它也可以在持续集成 (CI) 中使用。问题是如何在运行脚本时创建这样的密钥。到目前为止,我阅读的手册都需要人工干预。
030's questions
目的是使用 Ansible 升级 snap 包,例如n3dr和informado。已创建以下任务:
- name: Install various snap packages
snap:
name:
- informado
- n3dr
尝试解决问题
咨询了以下网站:
- https://docs.ansible.com/ansible/latest/modules/snap_module.html
- https://github.com/ansible/ansible/issues/62492
- https://github.com/ansible-collections/community.general/blob/main/plugins/modules/packaging/os/snap.py
似乎没有使用 ansible 升级 snap 包的选项
已创建GitHub 问题。
解决方法
删除要更新的包
user@host:~$ sudo snap remove informado n3dr 2020-07-15T10:21:18+02:00 INFO Waiting for conflicting change in progress... informado removed n3dr removed
再次运行ansible
问题
如何使用 ansible 在不先删除它们的情况下升级 snap 包?
目标:结合 Kubernetes (k8s) 启用 Identity Aware Proxy (IAP)。
方法:
- 部署了两个应用程序
- SSL负载平衡器放在前面
- 当导航到 domain/app1 时,会显示 app1
- 按照本教程为 k8s 启用 IAP https://cloud.google.com/iap/docs/enabling-kubernetes-howto
结果
- 导航到 domain/app1 时会出现 Google 登录屏幕
- 当 IAP 被禁用时,登录成功时会显示“默认网关 - 404”而不是应用程序
讨论
- 不应该在某处配置重定向吗?当身份验证和授权成功时,添加了 URI _gcp_gatekeeper/authenticate 并返回 404,而应该重定向到应用程序,对吗?
- 部署 App 引擎时,IAP 启用 IAP 开箱即用。是什么让这个部署与众不同?也许 App Engine 包含一些 k8s 中省略的元素。
当前问题
当认证成功时,会显示以下错误:
There was a problem with your request. Error code 11
当尝试使用 certbot 创建新证书时,假设是80
或者443
需要可用,但情况似乎并非如此:
-------------------------------------------------------------------------------
The program nginx (process ID 123454) is already listening on TCP port 443. This
will prevent us from binding to that port. Please stop the nginx program
temporarily and then try again.
-------------------------------------------------------------------------------
At least one of the (possibly) required ports is already taken.
发生。
如何在不停止服务(例如 nginx)的情况下更新证书?
尝试解决问题
版本?
root@hostname:~# letsencrypt --version
letsencrypt 0.4.1
选项?
root@hostname:~# letsencrypt --help
letsencrypt [SUBCOMMAND] [options] [-d domain] [-d domain] ...
The Let's Encrypt agent can obtain and install HTTPS/TLS/SSL certificates. By
default, it will attempt to use a webserver both for obtaining and installing
the cert. Major SUBCOMMANDS are:
(default) run Obtain & install a cert in your current webserver
certonly Obtain cert, but do not install it (aka "auth")
install Install a previously obtained cert in a server
renew Renew previously obtained certs that are near expiry
revoke Revoke a previously obtained certificate
rollback Rollback server configuration changes made during install
config_changes Show changes made to server config during installation
plugins Display information about installed plugins
Choice of server plugins for obtaining and installing cert:
(the apache plugin is not installed)
--standalone Run a standalone webserver for authentication
(nginx support is experimental, buggy, and not installed by default)
--webroot Place files in a server's webroot folder for authentication
OR use different plugins to obtain (authenticate) the cert and then install it:
--authenticator standalone --installer apache
More detailed help:
-h, --help [topic] print this message, or detailed help on a topic;
the available topics are:
all, automation, paths, security, testing, or any of the subcommands or
plugins (certonly, install, nginx, apache, standalone, webroot, etc)
使用以下选项是否安全?
(nginx support is experimental, buggy, and not installed by default) --webroot Place files in a server's webroot folder for authentication
由于夏令时,Sensu 监视器指示在 Digital Ocean (DO) 上运行的多个服务器的 NTP 不同步 ( 12.345404ms
- 98.338222ms
):
CheckNTP WARNING: NTP offset by 34.073039ms
讨论
也许NTP配置不正确?
NTP 配置有偏差,但现在使用Geerlingguy 的 ntp 角色应用了相同的配置。
如果 NTP 服务器已重新启动,会发生什么?
监视器显示 NTP 已同步,但过一会儿问题又出现了。
如果 NTP 服务器将停止,手动设置时间并重新启动 ntp 服务器会发生什么?
与三相同。
也许这个问题与 DO 平台有关?
未知。在互联网上没有找到解决方案。
如果选择最近的位置作为时间服务器会发生什么?
server 0.nl.pool.ntp.org iburst server 1.nl.pool.ntp.org iburst server 2.nl.pool.ntp.org iburst server 3.nl.pool.ntp.org iburst
重新启动 NTP 服务器时,时间已同步,后来时间再次不同步。
液滴是否同步,然后不同步?
是的,似乎是这样:
运行sudo nomad agent -dev
结果getsockopt: connection refused
:
* Get http://127.0.0.1:8500/v1/agent/checks: dial tcp 127.0.0.1:8500:
getsockopt: connection refused
2017/02/19 20:31:36.971932 [INFO] client: node registration complete
2017/02/19 20:31:36.973456 [DEBUG] client: periodically checking for
node changes at duration 5s
2017/02/19 20:31:36.974470 [DEBUG] client: state updated to ready
2017/02/19 20:31:41.971377 [ERR] client.consul: error reaping services in
consul: Get http://127.0.0.1:8500/v1/agent/services: dial tcp 127.0.0.1:8500:
getsockopt: connection refused
^C==> Caught signal: interrupt
2017/02/19 20:32:17.507631 [DEBUG] http: Shutting down http server
2017/02/19 20:32:17.509138 [INFO] agent: requesting shutdown
2017/02/19 20:32:17.510375 [INFO] client: shutting down
2017/02/19 20:32:17.511603 [INFO] nomad: shutting down server
2017/02/19 20:32:17 [WARN] serf: Shutdown without a Leave
2017/02/19 20:32:17.520042 [ERR] agent: shutting down consul service
failed: 1 error(s) occurred:
* Get http://127.0.0.1:8500/v1/agent/services: dial tcp 127.0.0.1:8500:
getsockopt: connection refused
2017/02/19 20:32:17.520155 [INFO] agent: shutdown complete
重现步骤
- wget https://raw.githubusercontent.com/hashicorp/nomad/master/demo/vagrant/Vagrantfile
- 流浪起来
- 流浪者 ssh
- 游牧特工-dev
问题
ansible-sensu-client 中出现以下问题:
{"timestamp":"2017-01-19T09:49:14.803754+0000","level":"fatal","message":
"check name cannot contain spaces or special characters","object":{"handlers":
["mailer","sms"],"command":"check-ports.rb -p 234","interval":30,"standalone":
true,"name":"port 234"}}
目前,用户需要调试 sensu-client 日志以找到问题,是否可以通过验证输入来防止问题。
目标
为避免使用此角色的用户将使用包含空格或特殊字符的名称,例如:
sensu_client_checks_metrics_common:
- cmd: check-cpu
- cmd: check-memory-percent
- cmd: check-ntp
- cmd: check-swap-percent
handlers:
- mailer
- cmd: metrics-cpu
handlers:
- relay
- cmd: metrics-memory-percent
handlers:
- relay
- cmd: metrics-disk
handlers:
- relay
- cmd: metrics-disk-usage
handlers:
- relay
通过让 Ansible 运行失败并指示输入无效
讨论
在 Puppet 中,可以使用Stdlib来验证输入,例如变量 X 是字符串吗?Y 是否等于哈希?例如,在这个模块中,版本应该是一个字符串,如果不是这种情况,Puppet 运行将失败:
validate_string($version)
并指出版本需要是一个字符串。
如何在 Ansible 中验证输入?
目的:在 GCP(谷歌云平台)和办公室之间建立 VPN
创建 VPN 连接
创建 VPN 连接
主意
我们现在正在考虑设置StrongSwan,但想知道这是否可以在办公室内的随机系统上运行,还是需要公共 IP?
我们现在的想法是在 Digital Ocean (DO) 中创建一个 VM,配置一个 StrongSwan 服务器,将 IP 输入到 GCP 网络 UI,然后让桌面连接到 DO VM?这是在办公室和 GCP 之间配置 VPN 的安全快捷方式吗?
目前我们在每个项目中都放了一个 .gitlab-ci.yml。目前我们有 50 多个项目,每次 .gitlab-ci.yml 发生变化时,团队都必须更改所有项目的结构。是否有可能拥有一个共同的 .gitlab-ci.yml?
尝试
- 试过有一个gitlab-ci.yml,但是不知道怎么改这个文件的默认路径
- 通用脚本减少了代码重复量,但是如果 gitlab-ci.yml 结构发生变化,我们必须在所有项目中实现它
如果firewall_allowed_ports
在:
- name: port {{ item }} allowed in firewall
ufw:
rule: allow
port: "{{ item }}"
proto: tcp
with_items:
- 22
- "{{ firewall_allowed_ports }}"
未定义,则发生此错误:
fatal: [host.example.com]: FAILED! => {"failed": true, "msg": "the field 'args'
has an invalid value, which appears to include a variable that is undefined.
尝试解决问题
"{{ firewall_allowed_ports | }}"
结果是:
fatal: [host.example.com]: FAILED! => {"failed": true, "msg": "template error
while templating string: expected token 'name', got 'end of print statement'.
String: {{ firewall_allowed_ports | }}"}
已创建 ansible-sensu-plugin-install 角色,以便使用以下代码安装sensu - plugins:
- name: be sure sensu-plugins-{{ item.name }} is installed
command: sensu-install -p {{ item.name }}:{{ item.version }}
when: "'sensu-plugins-{{ item.name }} ({{ item.version }})' not in installed_plugins.stdout"
with_items: "{{ sensu_plugin_install }}"
还有另外两个需要 sensu-plugins 的角色。第一个角色需要邮件插件:
sensu_plugin_install:
- name: mailer
version: 1.0.0
sensu_plugin_install:
- name: cpu-checks
version: 1.0.0
- name: disk-checks
version: 2.0.1
- name: http
version: 1.0.0
- name: memory-checks
version: 1.0.2
- name: ntp
version: 1.0.0
角色一和二已包含在一本剧本中。
目前的结果
将安装角色一中mailer
定义的插件或角色二中定义的插件。注释掉其中一个sensu_plugin_install
声明将安装与角色一或二相关的插件,例如只安装邮件插件:
TASK [030.sensu-plugin-install : be sure sensu-plugins-{{ item.name }} is
installed] ***
changed: [host.example.com] => (item={u'version': u'1.0.0', u'name':
u'mailer'}) => {"changed": true,
如果sensu_plugin_install
第二个角色的 已被注释掉。
预期结果
预期的结果是所有插件都将被安装,在这种情况下是六个而不是一个,即mailer
五个。
讨论
看起来数组不会被合并,因为将安装一个或五个插件而不是六个,并且需要注释掉两个插件之一以强制安装插件。
解决此问题的一种选择是合并这些数组,即sensu_plugin_install + sensu_plugin_install
. 例如,在 Puppet 中,可以使用hiera_array
. 这怎么能在 Ansible 中完成?
使用两个不同的变量来解决问题不是一种选择,因为使用了一个角色的功能,如果另一个角色想要安装 sensu 插件,则不建议向该角色添加另一个变量。
目前在 site.yml 中定义了多个角色:
- include: role1.yml
- include: role2.yml
- include: role3.yml
- include: role4.yml
- include: role5.yml
这些通过发出以下命令同步运行:
ansible-playbook -i testing site.yml -u root --vault-password-file ~/.vault_pass.txt
问题
如何一次性运行 site.yml 中定义的角色?
讨论
它可以通过打开多个终端并运行来异步运行所有角色:
ansible-playbook -i testing playbook1.yml -u root --vault-password-file ~/.vault_pass.txt
ansible-playbook -i testing playbook2.yml -u root --vault-password-file ~/.vault_pass.txt
ansible-playbook -i testing playbook3.yml -u root --vault-password-file ~/.vault_pass.txt
ansible-playbook -i testing playbook4.yml -u root --vault-password-file ~/.vault_pass.txt
ansible-playbook -i testing playbook5.yml -u root --vault-password-file ~/.vault_pass.txt
基于这个例子:
- lineinfile: dest=/opt/jboss-as/bin/standalone.conf regexp='^(.*)Xms(\d+)m(.*)$' line='\1Xms${xms}m\3' backrefs=yes
从此文档中,尝试在 Ansible 中进行正则表达式替换。
Ansible 版本
user@server:/home$ ansible --version
ansible 2.1.1.0
/路径/到/文件:
helloworld
Ansible 片段:
- lineinfile:
dest: /path/to/file
regexp='^(hello)world$'
line='\1030'
尝试 2
- lineinfile:
dest: /path/to/file
regexp='^(hello)world$'
line="\1030"
预期结果:
hello030
目前的结果:
\1030
问题
- 为什么结果
\1030
不是hello030
? - 如何解决?
是否有能够安装 gulp 文件的模块,例如npm:
description: Install "coffee-script" node.js package. - npm: name=coffee-script path=/app/location description: Install "coffee-script" node.js package on version 1.6.1. - npm: name=coffee-script version=1.6.1 path=/app/location description: Install "coffee-script" node.js package globally. - npm: name=coffee-script global=yes description: Remove the globally package "coffee-script". - npm: name=coffee-script global=yes state=absent description: Install "coffee-script" node.js package from custom registry. - npm: name=coffee-script registry=http://registry.mysite.com description: Install packages based on package.json. - npm: path=/app/location description: Update packages based on package.json to their latest version. - npm: path=/app/location state=latest description: Install packages based on package.json using the npm installed with nvm v0.10.1. - npm: path=/app/location executable=/opt/nvm/v0.10.1/bin/npm state=present
目前以下代码段:
- command: /usr/local/lib/npm/bin/gulp
args:
chdir: "{{ project_dir }}"
用于安装 gulp 包,但是可以按如下方式进行吗?
description: Install packages based on package.json.
- gulp: path=/app/location
元/main.yml
dependencies:
- { role: 030.sensu-install }
结果是:
[DEPRECATION WARNING]: The comma separated role spec format, use the
yaml/explicit format instead..
This feature will be removed in a future release.
Deprecation warnings can be disabled by setting deprecation_warnings=False in
ansible.cfg.
什么时候sudo ansible-galaxy install -r requirements/development.yml
发出。
尝试解决问题
什么时候
dependencies:
- role: 030.sensu-install
version: 0.1.0
已定义,语法检查成功,但弃用警告仍然存在。
什么时候
dependencies:
- src: 030.sensu-install
version: 0.1.0
已定义,sudo ansible-galaxy install -r requirements/development.yml
运行时弃用警告已解决,但ansible-playbook /etc/ansible/roles/role_under_test/tests/${playbook} --syntax-check
会导致:
ERROR! role definitions must contain a role name
目标
目的是在构建通过后使用 Ansible 和 Gitlab 部署软件。
问题
ansible-playbook playbook.yml -u root --private-key=key.pem
部署软件,但
sudo -u gitlab-runner ansible-playbook playbook.yml -u root --private-key=key.pem
结果是:
PLAY ***************************************************************************
TASK [setup] *******************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: OSError: [Errno 13] Permission denied: '/root/.ansible'
fatal: [system.example.com]: FAILED! => {"failed": true, "stdout": ""}
NO MORE HOSTS LEFT *************************************************************
PLAY RECAP *********************************************************************
system.example.com : ok=0 changed=0 unreachable=0 failed=1
讨论
运行
ansible-playbook --help
显示那-u
是 remote_user。由于这是设置为root
不应该发生的问题。登录
gitlab-runner
并随后运行ansible-playbook playbook.yml -u root --private-key=key.pem
成功
为了在添加新的 sensu-client 时让检查出现在 Uchiwa 中sensu-server
,sensu-api
需要重新启动和。目前有5个客户端和一台服务器。每次使用 ansible 添加新的 sensu-client 时,检查都不会出现在 Uchiwa 中。目前,我需要登录到 sensu-server 并重新启动服务。如何使用 ansible 自动执行此操作?
根据此文档,有处理程序:
handlers:
- name: restart memcached
service: name=memcached state=restarted
listen: "restart web services"
- name: restart apache
service: name=apache state=restarted
listen: "restart web services"
可以使用通知调用:
tasks:
- name: restart everything
command: echo "this task will restart the web services"
notify: "restart web services"
这样如果配置发生更改,服务将重新启动,但是如何通知远程服务,例如从 IP-A 通知 IP-B 上的服务?
我已经阅读了多个文档,包括这个文档,并在 GitHub 上检查了多个 ansible 角色,但我不清楚何时定义变量以及何时定义变量的放置位置,即在defaults
,tasks
或vars
目录中。
我希望收到指导,这样我就不必花费大量时间来考虑是否需要一个变量以及是否需要将它放在哪里。
sensu_host: localhost
sensu_home: /etc/sensu
sensu_conf_d: "{{ sensu_home }}/conf.d"
- name: be sure {{ item }} is installed
apt:
name: "{{ item }}"
state: latest
with_items:
- build-essential
- ntp
还是应该在变量中定义项目:
- name: be sure {{ item }} is installed
apt:
name: "{{ item }}"
state: latest
with_items:
{{ packages }}
__sensu_repo_url: deb http://sensu.global.ssl.fastly.net/apt sensu main
__sensu_repo_key_url: http://sensu.global.ssl.fastly.net/apt/pubkey.gp
是否有特定的清单,例如
如果 a、b、c 则需要在默认值中声明变量
如果 d, e, f 那么 v
如果 g, h, i 然后在任务中定义它
╔═══════════╦═════════════════╗
║ directory ║ characteristics ║
╠═══════════╬═════════════════╣
║ defaults ║ constants, e.g. ║
║ tasks ║ bla, e.g. ║
║ vars ║ variables ║
╚═══════════╩═════════════════╝