在我的剧本中,我想创建一个包含外部命令输出的变量.之后我想在几个模板中使用该变量.
以下是剧本的相关部分:
tasks:
- name: Create variable from command
command: "echo Hello"
register: command_output
- debug: msg="{{command_output.stdout}}"
- name: Copy test service
template: src=../templates/test.service.j2 dest=/tmp/test.service
- name: Enable test service
shell: systemctl enable /tmp/test.service
- name: Start test service
shell: systemctl start test.service
Run Code Online (Sandbox Code Playgroud)
让我们说这是我的模板:
[Unit]
Description=MyApp
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox1
ExecStartPre=-/usr/bin/docker rm busybox1
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "while true; do echo {{ string_to_echo }}; sleep 1; done"
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
(注意{{ …
我可以通过其他角色通知处理程序吗?我该怎么做让ansible找到它?
用例是,例如我想配置一些服务,然后在更改时重新启动它.不同的操作系统可能有不同的文件要编辑,甚至文件格式也可能不同.所以我想把它们放到不同的角色(因为文件格式可能不同,不能通过设置group_vars来完成).但重启服务的方式是相同的,使用service模块; 所以我想把处理程序放到common角色上.
无论如何要实现这一目标?谢谢.
我正在设计一种具有单独任务的剧本库
所以在通常的角色回购中,我有类似的东西:
roles
??? common
? ??? tasks
? ??? A.yml
? ??? B.yml
? ??? C.yml
? ??? D.yml
? ??? login.yml
? ??? logout.yml
? ??? save.yml
??? custom_stuff_workflow
? ??? tasks
? ??? main.yml
??? other_stuff_workflow
??? tasks
??? main.yml
Run Code Online (Sandbox Code Playgroud)
我在custom_stuff_workflow中的main.yml包含如下内容:
---
- include: login.yml
- include: A.yml
- include: C.yml
- include: save.yml
- include: logout.yml
Run Code Online (Sandbox Code Playgroud)
而这个在另一个工作流程中:
---
- include: login.yml
- include: B.yml
- include: A.yml
- include: D.yml
- include: save.yml
- include: logout.yml …Run Code Online (Sandbox Code Playgroud) 我正在编写一个部署过程,该过程采用运行ansible脚本的用户名(例如tlau),并根据该用户名和当前日期/时间在远程系统上创建部署目录(例如tlau-deploy-2014-10 -15-16:52).
您可能认为这在ansible事实中可用(例如LOGNAME或SUDO_USER),但这些都设置为"root"或用于ssh到远程系统的部署ID.这些都不包含本地用户,即当前正在运行ansible进程的用户.
如何编写运行ansible进程的用户名并在我的playbook中使用它?
是否可以在角色中重用角色?我不是指通过在角色的meta/main.yml文件中定义依赖项,而是直接将角色包含在另一个角色的tasks/main.yml中?
例如,我在角色簿中定义了几个基本角色,在角色中定义了一些更高级别的角色.我希望高级角色除了某些特定任务外还包括一些基本角色.
playbooks/
rolebooks/
some_role/
roles/
webtier/
tasks/
main.yml
Run Code Online (Sandbox Code Playgroud)
在playbooks/roles/webtier/tasks/main.yml中:
- shell: echo 'hello'
- { role: rolebooks/some_role }
- shell: echo 'still busy'
Run Code Online (Sandbox Code Playgroud)
谢谢
考虑类似于以下示例的Ansible清单文件:
[san_diego]
host1
host2
[san_francisco]
host3
host4
[west_coast]
san_diego
san_francisco
[west_coast:vars]
db_server=foo.example.com
db_host=5432
db_password=top secret password
Run Code Online (Sandbox Code Playgroud)
我想db_password在Ansible库中存储一些变量(例如),但不是整个文件.
如何将保险库加密的ansible文件导入未加密的库存文件?
我创建了一个加密的vars文件,并尝试使用以下命令导入它:
include: secrets
Run Code Online (Sandbox Code Playgroud)
为了这ansible-playbook与回应:
ERROR: variables assigned to group must be in key=value form
Run Code Online (Sandbox Code Playgroud)
可能是因为它试图将include语句解析为变量.
我在角色中有一个复制任务,我希望该src位置与角色本身相关,而不是调用角色的游戏手册.
我如何使这项工作和使用myfrole/files来自任务内部的文件myrole/tasks,我不想将角色名称包含在路径的一部分,因为它没有多大意义.如果我这样做,如果我复制角色会破坏.
我接管了一台Ubuntu 14.04服务器.它有一个名为"deployer"的用户(与capistrano一起使用),因此需要sudo权限.通过此设置,我可以登录服务器并执行以下操作:
workstation> ssh deployer@myserver
myserver> sudo apt-get install git
myserver> exit
workstation>
Run Code Online (Sandbox Code Playgroud)
我试图找出如何使用Ansible(版本2.0.2.0和python 2.7.3)来创建一个名为"deployer"的用户,并能够使用该id登录到服务器然后sudo-ish之类的事情,如"apt --get install".我的剧本看起来像这样:
---
- hosts: example
become: yes
tasks:
- name: Update apt cache
apt:
update_cache: yes
cache_valid_time: 3600
- group: name=sudo state=present
- name: Add deployer user and add it to sudo
user: name=deployer
state=present
createhome=yes
become: yes
become_method: "sudo"
- name: Set up authorized keys for the deployer user
authorized_key: user=deployer key="{{item}}"
with_file:
- /home/jaygodse/.ssh/id_rsa.pub
Run Code Online (Sandbox Code Playgroud)
运行这个剧本之后,我能够以"deployer"的形式进入机器,(例如ssh deployer @ myserver)但是如果我运行sudo命令,它总是要求我输入我的sudo密码.
我理解"deployer"用户最终必须找到进入visudo用户文件的方式,但是我无法弄清楚要调用哪个神奇的Ansible咒语以便我可以作为部署者ssh进入机器然后运行sudo命令(例如sudo) apt-get install git")没有提示输入sudo密码. …
我正在使用Ansible来部署我的项目,我试图检查是否安装了指定的包,但是我的任务有问题,这是任务:
- name: Check if python-apt is installed
command: dpkg -l | grep python-apt
register: python_apt_installed
ignore_errors: True
Run Code Online (Sandbox Code Playgroud)
这是问题所在:
$ ansible-playbook -i hosts idempotent.yml
PLAY [lxc-host] ***************************************************************
GATHERING FACTS ***************************************************************
ok: [10.0.3.240]
TASK: [idempotent | Check if python-apt is installed] *************************
failed: [10.0.3.240] => {"changed": true, "cmd": ["dpkg", "-l", "|", "grep", "python-apt"], "delta": "0:00:00.015524", "end": "2014-07-10 14:41:35.207971", "rc": 2, "start": "2014-07-10 14:41:35.192447"}
stderr: dpkg-query: error: package name in specifier '|' is illegal: must start with an alphanumeric character
...ignoring
PLAY …Run Code Online (Sandbox Code Playgroud) 在编写和调试Ansible playbooks时,典型的工作流程如下:
ansible-playbook ./main.yaml理想情况下,我希望在失败的任务上恢复执行,拥有库存以及之前任务收集的所有事实.它甚至可能吗?如何让剧本编写/调试更快?
ansible-playbook ×10
ansible ×9
dpkg ×1
encryption ×1
shell ×1
sudoers ×1
username ×1
variables ×1